在 Bash 脚本中使用 Expect 为 SSH 命令提供密码
- 2024-09-30 14:02:00
- admin 原创
- 180
问题描述:
我正在尝试使用expect
Bash 脚本来提供 SSH 密码。提供密码有效,但我没有像应该的那样进入 SSH 会话。它直接回到 Bash。
我的脚本:
#!/bin/bash
read -s PWD
/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com'
expect "password"
send "$PWD
"
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 脚本。
我之前使用 Bash 的原因expect
是因为我必须使用菜单。我可以选择要连接到哪个单元/设备。
对于那些想要回复我应该使用 SSH 密钥的人,请弃权。
解决方案 1:
混合使用 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
"
interact -o -nobuffer -re $prompt return
send "my_command1
"
interact -o -nobuffer -re $prompt return
send "my_command2
"
interact
Bash 的示例解决方案可能是:
#!/bin/bash
/usr/bin/expect -c 'expect "
" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com; interact }'
这将等待Enter
然后返回(片刻)交互式会话。
解决方案 2:
最简单的方法是使用sshpass 。它在Ubuntu / Debian存储库中可用,您不必处理将 expect 与 Bash 集成的问题。
举个例子:
sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh user@192.168.1.200 ls -l /tmp
上述命令可以轻松地与 Bash 脚本集成。
注意:请阅读安全注意事项部分,man sshpass
以全面了解安全隐患。
解决方案 3:
在 EOD 之前添加“interact”Expect 命令:
#!/bin/bash
read -s PWD
/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
expect "password"
send -- "$PWD
"
interact
EOD
echo "you're out"
这应该允许您与远程计算机交互,直到您注销。然后您将返回 Bash。
解决方案 4:
经过数月寻找问题的答案后,我终于找到了一个最好的解决方案:编写一个简单的脚本。
#!/usr/bin/expect
set timeout 20
set cmd [lrange $argv 1 end]
set password [lindex $argv 0]
eval spawn $cmd
expect "assword:" # matches both 'Password' and 'password'
send -- "$password
"; # -- for passwords starting with -, see https://stackoverflow.com/a/21280372/4575793
interact
将其放到/usr/bin/exp
,然后你就可以使用:
exp <password> ssh <anything>
exp <password> scp <anysrc> <anydst>
完毕!
解决方案 5:
一个简单的 Expect 脚本:
文件Remotelogin.exp
#!/usr/bin/expect
set user [lindex $argv 1]
set ip [lindex $argv 0]
set password [lindex $argv 2]
spawn ssh $user@$ip
expect "password"
send "$password
"
interact
例子:
./Remotelogin.exp <ip> <user name> <password>
解决方案 6:
还要确保使用
send -- "$PWD
"
相反,以破折号(-)开头的密码将会失败。
上述操作不会将以破折号开头的字符串解释为发送命令的选项。
解决方案 7:
使用辅助工具fd0ssh
(来自 hxtools,ubuntu 的源代码,openSUSE 的源代码,而不是 pmt)。它无需从ssh
程序中期待特定提示即可工作。
它也“比 sshpass 在命令行上传递密码更安全”( - Charles Duffy的评论)。
解决方案 8:
我发现在 Bash 脚本中使用小型Expect 脚本的另一种有用方法如下。
...
Bash script start
Bash commands
...
expect - <<EOF
spawn your-command-here
expect "some-pattern"
send "some-command"
...
...
EOF
...
More Bash commands
...
这是因为...If the string "-" is supplied as a filename, standard input is read instead...
解决方案 9:
sshpass
如果你尝试在Sublime Text构建目标中、Makefile 中使用它,就会出错。sshpass
你可以使用passh
和sshpass
你一起做:
sshpass -p pa$$word ssh user@host
和passh
你一起做:
passh -p pa$$word ssh user@host
注意:不要忘记使用-o StrictHostKeyChecking=no
。否则,第一次使用时连接将挂起。例如:
passh -p pa$$word ssh -o StrictHostKeyChecking=no user@host
参考:
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件