一尘不染

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

linux

对于那些想回复我应该使用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,是因为我使用了可以选择要连接到的设备的菜单。

谢谢


阅读 418

收藏
2020-06-02

共1个答案

一尘不染

混合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 }'

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

2020-06-02