![在脚本内部运行时通过 ssh 在远程主机上运行命令失败](https://linux22.com/image/981947/%E5%9C%A8%E8%84%9A%E6%9C%AC%E5%86%85%E9%83%A8%E8%BF%90%E8%A1%8C%E6%97%B6%E9%80%9A%E8%BF%87%20ssh%20%E5%9C%A8%E8%BF%9C%E7%A8%8B%E4%B8%BB%E6%9C%BA%E4%B8%8A%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4%E5%A4%B1%E8%B4%A5.png)
背景:
我的电脑运行的是 Kubuntu 14.04。我是学生宿舍的管理员,宿舍里有一些 Netgear-AP。我的想法是编写一个脚本,通过一个脚本重新启动所有设备。(无法使用 ssh-key)
问题简述:
主机上的 ssh 命令从 shell 中可以正常运行。但如果通过脚本运行则不行。
描述:
我的电脑上有一个脚本:“path/to/localScript”
#!/bin/bash
echo "Hello mister"
reboot
现在如果我直接在 shell 中输入以下内容
sshpass -p '[MYPASSWORD]' ssh [USER]@[HOST] < PATH/TO/LOCALSCRIPT
我得到了输出
Pseudo-terminal will not be allocated because stdin is not a terminal.
Hello mister
Connection to HOST closed by remote host.
AP 确实重新启动了!我尝试了其他命令(如 ping)-> 一切正常。现在我想在脚本中执行完全相同的操作(以便以后也可以添加所有其他 AP ;) )因此我尝试了脚本“rebootThemAll”
#!/bin/bash
echo " Rebooting AP 1"
sshpass -p '[MYPASSWORD]' ssh [USER]@[HOST] < PATH/TO/LOCALSCRIPT
我得到了输出
Rebooting AP1
Pseudo-terminal will not be allocated because stdin is not a terminal.
然后……什么都没发生。我再次在 shell 行上看到我的输入提示,因此脚本停止。我还尝试了多个 AP,看看该错误是否会取消我的脚本,但没有。对于更多 AP,输出如下所示
Rebooting AP1
Pseudo-terminal will not be allocated because stdin is not a terminal.
Rebooting AP2
Pseudo-terminal will not be allocated because stdin is not a terminal.
Rebooting AP3
Pseudo-terminal will not be allocated because stdin is not a terminal.
Rebooting AP4
......
但脚本无法运行。它没有显示“Hello mister”,而且他们也没有重新启动。
有人有想法吗?
答案1
尝试这个:
sshpass -p '[MYPASSWORD]' ssh [USER]@[HOST] 'bash -s' < PATH/TO/LOCALSCRIPT
看来在根本没有终端的情况下才需要该命令。
答案2
我可以使用-T
选项“禁用伪终端分配”来解决这个问题。并且通过使用没有该#!/bin/bash
行的脚本文件,所以刚开始使用
echo "check"
reboot