linux - 使用 'expect'命令远程传递密码给SSH运行脚本

标签 linux bash ssh expect

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

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

我以为它会使用我的 RSA key ,但我收到错误消息:

"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 等)。

最佳答案

你在两个方面做错了:

  1. 如果你想让expectssh交互,你需要从expect开始ssh脚本而不是之前。

  2. 如果你把脚本(/path/to/script/test.sh)放到sshstdin,你无法再与 ssh 进程通信。

您应该使用 scp 将脚本复制到远程主机,然后运行它。

预期脚本可能如下所示:

/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

关于linux - 使用 'expect'命令远程传递密码给SSH运行脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36630516/

相关文章:

linux - 在bash中使用awk检索字符之间的字符串并分配给新变量

c - 使用 scp 和 sshpass 处理错误情况

mysql - 通过 SSH session 使用 mysqldump 时显示的明文密码条目

bash - 使用扩展文件属性对目录中的文件进行排序

c++ - Windows 和 Linux 中 USB 串口的区别

linux - 用于重新启动应用程序的 Bash 脚本

linux - 限制允许使用进程树的 CPU 百分比?

bash - Youtube-dl下载脚本调试

perl - 通过ssh执行perl替换[shell脚本中的perl one-liner]

python - 运行 python 脚本时的一个简单错误