Мне нужно создать сценарий bash, который будет удаленно запускать другой сценарий на партии машин. Для этого я передаю сценарий через SSH.

ssh -p$port root@$ip 'bash -s' < /path/to/script/test.sh

Я думал, что он будет использовать мои ключи RSA, но получаю сообщение об ошибке:

"Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)"

Я безуспешно пытался использовать sshpass. Итак, моим следующим решением было использовать expect. Я никогда раньше не использовал expect, и я уверен, что мой синтаксис не подходит.

ssh -p$port root@$ip 'bash -s' < /path/to/script/test.sh
/usr/bin/expect <<EOD
expect "password"
send "$spass\n"
send "\n"
EOD

У меня есть root-доступ ко всем машинам, и ЛЮБОЕ решение будет работать, пока код остается в bash. Просто имейте в виду, что это будет выполняться в цикле с глобальными переменными ($ spass, $ ip, $ port и т. Д.), Передаваемыми из родительского скрипта.

2
Acrid_Soul 14 Апр 2016 в 20:54

2 ответа

Лучший ответ

Вы делаете это неправильно двумя способами:

  1. Если вы хотите, чтобы expect взаимодействовал с ssh, вам нужно запускать ssh из скрипта expect, а не раньше.

  2. Если вы поместите сценарий (/path/to/script/test.sh) в stdin из ssh, вы больше не сможете взаимодействовать с процессом ssh.

Лучше скопировать сценарий на удаленный хост с помощью scp, а затем запустить его.

Сценарий Expect может выглядеть так:

/usr/bin/expect <<EOF
spawn ssh -p$port root@$ip
expect "password"
send "$Spass\r"
expect "$ "
send "/path/to/script/on/remote/server/test.sh\r"
expect "$ "
interact
EOF
4
Jakuje 14 Апр 2016 в 19:13
    #!/usr/bin/expect
    #Replace with remote username and remote ipaddress
    spawn /usr/bin/ssh -o StrictHostKeyChecking=no username@IPAddress
    #Replace with remote username and remote ipaddress
    expect "username@IPAddress's password: "
    #Provide remote system password
    send "urpassword\n"
    #add commands to be executed. Also possible to execute bash scripts
    expect "$ " {send "pwd\n"} # bash command
    expect "$ " {send "cd mytest\n"}
    expect "$ " {send "./first.sh\n"} # bash scripts
    expect "$ " {send "exit\n"}
    interact
0
Shebin Jacob 18 Июл 2017 в 11:30