使用“expect”命令将密码传递给 SSH 远程运行脚本

Acr*_*oul 3 linux ssh bash expect

我需要创建一个 bash 脚本,它将在一批机器上远程运行另一个脚本。为此,我通过 SSH 传递了一个脚本。

ssh -p$port root@$ip 'bash -s' < /path/to/script/test.sh
Run Code Online (Sandbox Code Playgroud)

我以为它会使用我的 RSA 密钥,但出现错误:

"Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)"
Run Code Online (Sandbox Code Playgroud)

我尝试使用 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
Run Code Online (Sandbox Code Playgroud)

我对所有机器都有 root 访问权限,只要代码保留在 bash 中,任何解决方案都可以。请记住,这将在具有从父脚本传递的全局变量($spass、$ip、$port 等)的循环中完成。

Jak*_*uje 5

你在两个方面做错了:

  1. 如果要expect与 交互ssh,则需要sshexpect脚本开始,而不是从之前开始。

  2. 如果将脚本 ( /path/to/script/test.sh) 置于stdinof 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
Run Code Online (Sandbox Code Playgroud)