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

Max*_*Max 125 linux ssh 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"
Run Code Online (Sandbox Code Playgroud)

我脚本的输出:

spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
usr@$myhost.example.com's password: you're out
Run Code Online (Sandbox Code Playgroud)

我想拥有我的SSH会话,只有当我退出它才能返回我的bash脚本.我之前使用bash的原因是因为我使用了一个菜单,我可以选择连接哪个单元.

谢谢

Pio*_*ról 78

混合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
Run Code Online (Sandbox Code Playgroud)

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

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

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


dot*_*nix 52

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

一个例子:

sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh user@192.168.1.200 ls -l /tmp
Run Code Online (Sandbox Code Playgroud)

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

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

  • 从安全角度来看非常危险 - 命令行参数可以由系统上的任何其他进程读取.有可能覆盖它们,并希望`sshpass`可以做到这一点,但即使这样,它还有一段时间,但是当密码可供任何/每个进程查看时,它仍然可以启动. (8认同)
  • 为了完整起见,我提到“man sshpass”向潜在用户提供了合适的安全警告,指出“-p”是最不安全的使用方式,并提供“-e”选项以通过环境变量获取密码,这至少使它远离命令行。 (2认同)

dr-*_*jan 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"
Run Code Online (Sandbox Code Playgroud)

这可以让您与远程计算机进行交互,直到您注销.然后你会回到bash.

  • 我用"expect eof"取代了"interact"和"EOD",它对我有用.这是在Mac上. (7认同)
  • 这个页面上没有任何答案对我有用,但@ Emmanuel建议使用`expect eof`解决了这个问题. (2认同)

dam*_*n_c 15

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

#!/usr/bin/expect

set timeout 20

set cmd [lrange $argv 1 end]
set password [lindex $argv 0]

eval spawn $cmd
expect "Password:"
send "$password\r";
interact
Run Code Online (Sandbox Code Playgroud)

把它/usr/bin/exp,然后你可以使用:

  • exp <password> ssh <anything>
  • exp <password> scp <anysrc> <anydst>

完成!

  • @user `"assword"` 将匹配 `Password` 和 `password`。 (3认同)

Tim*_*mah 7

还要确保使用

send -- "$PWD\r" 
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

一个简单的期望脚本

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
Run Code Online (Sandbox Code Playgroud)

例:

    ./Remotelogin.exp <ip> <user name> <password>
Run Code Online (Sandbox Code Playgroud)


use*_*374 6

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


Jim*_*mbo 5

我发现使用Bash 脚本中的小型Expect 脚本有用的另一种方法如下。

...
Bash script start
Bash commands
...
expect - <<EOF
spawn your-command-here
expect "some-pattern"
send "some-command"
...
...
EOF
...
More Bash commands
...
Run Code Online (Sandbox Code Playgroud)

这有效,因为 ...If the string "-" is supplied as a filename, standard input is read instead...