Как выполнять команды sudo с Expect & amp; отправлять команды в скрипте bash?

Кто-нибудь может дать мне знать, как выполнять sudo команды с 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); 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:~$
9
задан 10.04.2018, 15:25

3 ответа

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

10
ответ дан 11.10.2019, 13:53
  • 1
    Привет Glenn, сценарий выполняется без ошибок, но i' m неспособный видеть вывод сценария. Я делаю какую-либо вещь неправильно в сценарии. Если да сообщите мне, что я сохраняю вывод в отдельном файле. вот является сценарий этим i' m выполняющийся sasuke@njob:~ $./hypr.sh порождают ssh sasuke@hostname sasuke@hostname' s пароль: sasuke@hostname:~ $ output= $ (sudo virsh список - все | awk '/running/{печатают 2$} ' | хвост-10) sudo virsh dominfo ' $output' sasuke@njob:~ $ – daviestar 14.06.2013, 23:31
  • 2
    Вы can' t код сообщения в комментариях, добавьте его в своем вопросе – Tarun 14.06.2013, 23:54
  • 3
    о, i' m извините за это. Спасибо я сделал это. Выручите меня. – daviestar 16.06.2013, 02:17
  • 4
    Don' t знают. Добавьте exp_internal 1 к верхней части сценария и считайте подробный вывод. – vcoppolecchia 16.06.2013, 05:04

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

send "output=$(sudo virsh list --all | awk \"/running/{print \$2}\" | tail -2); sudo virsh dominfo $output"
0
ответ дан 11.10.2019, 13:53

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

spawn ssh -l $username $ip -p $sshport
sleep 5
expect "password:"
send "$pass\r"
interact
0
ответ дан 11.10.2019, 13:53

Теги

Похожие вопросы