在bash脚本中使用expect为SSH命令提供密码

时间:2011-01-24 10:22:46

标签: linux bash ssh 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脚本。 我之前使用bash的原因是因为我使用了一个菜单,我可以选择连接哪个单元。

由于

9 个答案:

答案 0 :(得分:75)

混合bash和expect不是达到预期效果的好方法。我试着只使用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

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

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

这将等待进入和返回(暂时)交互式会话。

答案 1 :(得分:51)

最简单的方法是使用 sshpass 。这在Ubuntu / Debian repos中可用,您不必处理将expect与bash集成。

一个例子:

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

上述命令可以轻松地与bash脚本集成。

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

答案 2 :(得分:18)

在您的EOD之前添加'interact'prepect命令:

#!/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。

答案 3 :(得分:13)

在寻找问题答案数月之后,我终于找到了一个非常好的解决方案:写一个简单的脚本。

#!/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>

完成!

答案 4 :(得分:7)

一个简单的期望脚本

Remotelogin.exp

class Movies_showdata extends Model {
  protected $fillable = ['show_id', 'showdata_rate', ...other fillable fields ];
}

示例:

    #!/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

答案 5 :(得分:6)

使用帮助工具fd0ssh(来自hxtools,而不是pmt),它可以正常工作,而不必期望来自ssh程序的特定提示。

答案 6 :(得分:6)

还要确保使用

send -- "$PWD\r" 

相反,因为以短划线( - )开头的密码将失败。

上面不会解释以短划线开头的字符串作为发送命令的选项。

答案 7 :(得分:4)

我发现使用bash脚本中的 small 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...

答案 8 :(得分:0)

如果您尝试在Makefile中的Sublime Text构建目标中使用

sshpass,则它会损坏。可以使用sshpass代替passhhttps://github.com/clarkwang/passh

使用sshpass,您可以这样做:

sshpass -p ssh user@host

使用passh,您可以这样做:

passh -p ssh user@host

注意:请不要忘记使用-o StrictHostKeyChecking=no,否则连接将在您第一次使用时挂起。例如:

passh -p ssh -o StrictHostKeyChecking=no user@host

参考文献:

  1. Send command for password doesn't work using expect script in ssh connection
  2. https://askubuntu.com/questions/87449/how-to-disable-strict-host-key-checking-in-ssh
  3. https://linuxcommando.blogspot.com/2008/10/how-to-disable-ssh-host-key-checking.html
  4. https://serverfault.com/questions/330503/scp-without-known-hosts-check
  5. https://debian-administration.org/article/587/pam_mount_and_sshfs_with_password_authentication