Bash, Expect: выполнение команды после того, как SSH не работает
Мне нужно войти в ВМ и выполнить там какую-то команду. Я прошел через все вопросы, связанные с той же темой, но не нашел решения с 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)
2 ответа
Похоже, вы пытаетесь отправить команды в удаленную систему в документе "здесь":
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"}
}
Expect (строится поверх Tcl) не имеет здесь документов.
Если вы хотите выполнить команду удаленно, а затем завершить сеанс ssh, выполните
set command "ls -lrt" ; # for example
spawn sudo ssh -t -t -v $user@$to $command
# ... log in logic
expect eof