在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...