Bash, Expect: выполнение команды после того, как SSH не работает - PullRequest
0 голосов
/ 25 апреля 2018

Мне нужно авторизоваться на ВМ и выполнить там некоторую команду. Я прошел через все вопросы, связанные с той же темой, но не нашел решения с EXPECT. Я использую EXPECT, так как мне нужно передать пароль при использовании SSH.

Я получаю сообщение «ошибка команды не найдена» при выполнении сценария, но вручную он работает нормально.

#!/usr/bin/expect -f

set user [lindex $argv 0]
set to [lindex $argv 1]
set pass [lindex $argv 2]
set command [lindex $argv 3]
puts "$user, $to , $command and $pass ."
# connect via scp
spawn sudo ssh -t -t -v $user@$to << EOF
    ls
EOF

#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send $pass\n
}
}
interact

Получена ошибка:

spawn sudo ssh -t -t -v username @ server_ip << EOF Неверное имя команды "ls" во время выполнения "ls" (файл "./establishSSHConnection.sh" строка 10) </p>

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Ожидайте (будучи построенным поверх Tcl) здесь нет документов.

Если вы хотите выполнить команду удаленно, а затем завершить сеанс ssh, выполните

set command "ls -lrt"  ; # for example
spawn sudo ssh -t -t -v $user@$to $command
# ... log in logic
expect eof
0 голосов
/ 25 апреля 2018

Похоже, вы пытаетесь отправить команды в удаленную систему в документе "здесь":

spawn sudo ssh -t -t -v $user@$to << EOF
    ls
EOF

Вместо этого вы должны использовать exp_send для отправки команды ls непосредственно перед «взаимодействием», то есть удалите документ «здесь»:

spawn sudo ssh -t -t -v $user@$to

И поместите здесь команду ls в конце:

expect {
    -re ".*es.*o.*" {
        exp_send "yes\r"
        exp_continue
    }
    -re ".*sword.*" {
        exp_send "$pass\r"
    }
}
exp_send "ls\r"
interact

РЕДАКТИРОВАТЬ:

Ах, я неправильно понял. Если вы просто хотите выполнить команду, то вам нужно указать другому концу закрыть соединение:

expect {
    -re ".*es.*o.*" {
        exp_send "yes\r"
        exp_continue
    }
    -re ".*sword.*" {
        exp_send "$pass\r"
    }
}
exp_send "ls\r"
exp_send "exit\r"
expect {
    eof {puts "Connection closed"}
    timeout {puts "Connection timed out"}
}
...