在 Bash 脚本中使用 Expect 为 SSH 命令提供密码

新手上路,请多包涵

我正在尝试在 Bash 脚本中使用 expect 来提供 SSH 密码。提供密码是可行的,但我并没有像我应该的那样进入 SSH 会话。它可以追溯到海峡。

我的脚本:

 #!/bin/bash

read -s PWD

/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com'
expect "password"
send "$PWD\n"
EOD
echo "you're out"

我的脚本的输出:

 spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
usr@$myhost.example.com's password: you're out

我想要我的 SSH 会话,并且只有当我退出它时,才能回到我的 Bash 脚本。

我在 expect 之前使用 Bash 的原因是因为我必须使用菜单。我可以选择要连接的单元/设备。

对于那些想回复我应该使用SSH密钥的人,请弃权。

原文由 Max 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 557
2 个回答

混合 Bash 和 Expect 并不是达到预期效果的好方法。我会尝试只使用Expect:

 #!/usr/bin/expect
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com

# Use the correct prompt
set prompt ":|#|\\\$"
interact -o -nobuffer -re $prompt return
send "my_password\r"
interact -o -nobuffer -re $prompt return
send "my_command1\r"
interact -o -nobuffer -re $prompt return
send "my_command2\r"
interact

bash 的示例解决方案可能是:

 #!/bin/bash
/usr/bin/expect -c 'expect "\n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com; interact }'

这将等待 Enter 然后返回(片刻)交互式会话。

原文由 Piotr Król 发布,翻译遵循 CC BY-SA 4.0 许可协议

最简单的方法是使用 sshpass 。这在 Ubuntu / Debian 存储库中可用,您不必处理将期望与 Bash 集成。

一个例子:

 sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh user@192.168.1.200 ls -l /tmp

上面的命令可以很容易地与 Bash 脚本集成。

注意: 请阅读 man sshpass 中的 安全注意事项 部分,以全面了解安全影响。

原文由 dotnix 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏