Intereting Posts
Каково разрешение по умолчанию для / var / www? Как вы запускаете на экране входа в систему с включенным Num Lock? Почему Ubuntu использует старую Эволюцию? Создание загрузочного USB-накопителя от Ubuntu HP 6930p не запоминает контроль яркости Пакетное преобразование H.265 mkv в H.264 с помощью ffmpeg для обеспечения совместимости файлов для повторного кодирования Невозможно изменить / настроить параметры системы Что означает -y означает команду apt-get -y install? Могу ли я использовать Bluetooth-гарнитуру в качестве микрофона? Удалите знак доллара, если это первый символ вложенной команды Доступ к сетевым файлам в каталоге \\ Vim для привязки к nautilus Терминал. Избегайте повторения кратковременного использования каталогов для доступа к файлам внутри Указатель мыши / курсор исчезает или не отображается должным образом Как я могу получать уведомления о новых письмах?

Как выполнять команды sudo с помощью команд Expect & send в сценарии bash?

Может ли любой орган дать мне знать, как выполнять команды sudo с ожиданием. Я пробовал следующее, но это не работает. Может ли кто-нибудь дать мне предложение, пожалуйста?

set login "sasuke" set addr "hostname" set pw "mypasswd" spawn ssh $login@$addr expect "$login@$addr\'s password:" send "$pw\r" expect "#" send "output=$(sudo virsh list --all | awk "/running/{print \$2}" | tail -2); sudo virsh dominfo $output" expect "password:" send "$pw\r" expect "#" 

Здравствуй,

Я попробовал выполнить скрипт ниже без ошибок, но я не получил результат. Вот сценарий и вывод, когда я выполняю. Где я делаю ошибку здесь

 set login "sasuke" set addr "hostname" set pw "mypasswd" spawn ssh $login@$addr expect "$login@$addr's password:" send "$pw\r" expect "#" send {output=$(sudo virsh list --all | awk '/running/{print $2}' | tail -2)} expect { password: {send "$pw\r"; exp_continue} "#" } send {sudo virsh dominfo "$output"} ;# don't know if you need quotes there expect { password: {send "$pw\r"; exp_continue} "#" } 

выполнение

 sasuke@njob:~$ ./hypr.sh spawn ssh sasuke@hostname sasuke@hostname's password: sasuke@hostname:~$ output=$(sudo virsh list --all | awk '/running/{print $2}' | tail -10)sudo virsh dominfo '$output' sasuke@njob:~$ 

 set login "sasuke" set addr "hostname" set pw "mypasswd" spawn ssh $login@$addr expect "$login@$addr's password:" send "$pw\r" expect "#" send {output=$(sudo virsh list --all | awk '/running/{print $2}' | tail -2)} expect { password: {send "$pw\r"; exp_continue} "#" } send {sudo virsh dominfo "$output"} ;# don't know if you need quotes there expect { password: {send "$pw\r"; exp_continue} "#" } 

В Tcl (и, предположительно, ожидают) фигурные скобки действуют как одиночные кавычки оболочки: запрещают расширение переменной.

Многостраничная форма ожидания полезна для случая, когда вы не видите шаблон. Оператор exp_continue существу «петли» в ожидании, поэтому вы можете отправить пароль и продолжить ожидать приглашения. Поскольку никаких действий, связанных с шаблоном запроса, не выполняется, управление переходит из команды ожидания в следующую.

Я бы рекомендовал вам сохранить это как отдельный скрипт. Первая строка должна быть

 #!/usr/bin/expect -f 

Если вы хотите встроить скрипт оболочки:

 #!/bin/sh expect <<'END' # code as above END 

Обратите внимание на кавычки вокруг первого «END», который имеет одинарное цитирование всего здесь документа, поэтому вам не нужно беспокоиться о интерпретации оболочки переменных Expect

Я хотел бы поделиться своей запиской. Я попробовал это в своей системе. это работает нормально.

 #!/usr/bin/expect set username "myname" set password "mypasswd" set hosts "hostname" foreach line [split $ip \n] { spawn ssh -o StrictHostKeyChecking=no $username@$hosts expect "$username@$hosts's password:" send -- "$password\n" expect "$" send -- "sudo virsh list|awk '{print \$2}'|grep 'inmobi' >vm.list; for host in `cat vm.list`; do sudo virsh dominfo \$host >> vm.info; done\n" expect "$" send -- "$password\n" expect "$" send -- "exit\n" 

Я думаю, вам может понадобиться обратная косая черта в кавычках. В противном случае expect что команда завершится после «awk»:

 send "output=$(sudo virsh list --all | awk \"/running/{print \$2}\" | tail -2); sudo virsh dominfo $output" 

Попытайтесь закончить его командой «взаимодействовать», она должна работать.

 spawn ssh -l $username $ip -p $sshport sleep 5 expect "password:" send "$pass\r" interact