在bash脚本中使用expect来为SSH命令提供密码
对于那些想要回复的人,我应该使用SSH密钥,请放弃
我试图在bash脚本中使用expect来提供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\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脚本。 之所以我期望使用bash,是因为我使用了一个菜单,我可以select连接到哪个单元。
谢谢
混合bash和预期不是达到预期效果的好方法。 我只想使用Expect:
#!/usr/bin/expect eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com #use 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
示例解决schemebash可能是:
#!/bin/bash /usr/bin/expect -c 'expect "\n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com; interact }'
这将等待进入,而不是返回(一会儿)交互式会话。
最简单的方法是使用sshpass 。 这是在Ubuntu / Debian回购协议中可用,你不必处理与bash的期望。
一个例子:
sshpass -p<password> ssh <arguments> sshpass -ptest1324 ssh user@192.168.1.200 ls -l /tmp
上述命令可以很容易地与bash脚本集成。
注意:请阅读man sshpass
安全注意事项部分,以充分理解安全隐患。
在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\n" interact EOD echo "you're out"
这应该让你与远程机器交互,直到你注销。 那么你会回来bash。
找了几个月的问题的答案后,我终于find了一个真正的最佳解决scheme:写一个简单的脚本。
#!/usr/bin/expect set timeout 20 set cmd [lrange $argv 1 end] set password [lindex $argv 0] eval spawn $cmd expect "assword:" send "$password\r"; interact
把它放到/usr/bin/exp
,然后你可以使用:
-
exp <password> ssh <anything>
-
exp <password> scp <anysrc> <anydst>
完成!
使用帮助工具fd0ssh
(来自hxtools,而不是pmt),它的工作原理,而不必期待从ssh程序的特定提示。
一个简单的期望脚本
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\r" interact
例:
./Remotelogin.exp <ip> <user name> <password>
另外请确保使用
send -- "$PWD\r"
相反,因为以破折号( – )开头的密码将会失败。
上面不会解释一个以破折号开头的string作为发送命令的选项。
另一种我觉得从bash脚本中使用小期望脚本的方法如下。
... 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...