我在使用以下命令时遇到问题:
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 密钥进行无密码访问。]