Linux:ssh 命令在 bash 脚本之外有效,但在脚本之内无效?

Linux:ssh 命令在 bash 脚本之外有效,但在脚本之内无效?

我在使用以下命令时遇到问题:

echo "Pass for router:"
read -s pass

/usr/bin/expect - << EXPCT
spawn ssh 192.168.10.1 -l root 'opkg list-installed' > list-installed.txt
#echo @pass
expect -timeout 10000 "password: "
send -- "$pass\n";
expect "#"
interact
EXPCT

返回:

Pass for router:
spawn ssh 192.168.10.1 -l root 'opkg list-installed' > list-installed.txt
[email protected]'s password: 
ash: opkg list-installed: not found
spawn_id: spawn id exp6 not open
    while executing
"interact"

问题是当我使用手册时:

ssh 192.168.10.1 -l root 'opkg list-installed' > list-installed.txt

它运行完美。其他几点:

'opkg list-installed' > list-installed.txt

这样做可以成功运行命令opkg 列表安装在远程机器中,并将结果保存在本地机器中。这是唯一可行的方法。如果我使用 SSH 登录,然后尝试执行该命令,它不起作用,或者如果它有效,它会保存在远程路径中。

答案1

对于这样的事情你应该尝试SSH 通行证或者使用 SSH 密钥。这将解决您的 expect 问题(对于这类问题,expect 就像是 Hammer)。

这样,您只需发出标准 ssh 命令:

sshpass -p $pass ssh [email protected] 'opkg list-installed' > list-installed.txt

答案2

尝试这种方式,首先连接然后在远程运行命令。而不是直接在连接上传递命令。

echo "Pass for router:"
read -s pass

/usr/bin/expect - << EXPCT
spawn ssh 192.168.10.1 -l root
opkg list-installed > list-installed.txt
#echo @pass
expect -timeout 10000 "password: "
send -- "$pass\n";
expect "#"
interact
EXPCT

答案3

有件事让我一次又一次感到困惑:在 stdin 上循环遍历主机名列表时,忘记使用 ssh 的 -n 选项

sshopts="-o StrictHostKeyChecking=no -o ConnectTimeout=5 "
sshopts+=" -n" # keep it from swallowing stdin

while read remotehostname; do
    sshpass [...] ssh ${sshopts} [...]
done < ${HOSTFILE}

[插入标准社论,说明为什么 sshpass 本质上是不安全的,除非您以交互方式提示输入 SSHPASS 变量,并且所有有能力的系统管理员都应该大发雷霆,直到他们当地的安全指南允许通过 ssh 密钥进行无密码访问。]

相关内容