我正在编写一个“工具” - 一些bash脚本 - 可以自动化集群中每台服务器上的安装和配置。
“工具”从主服务器运行。它将自己(通过SCP)分配并分发给其他所有服务器,并通过“批量”SSH解压缩副本。
在设置过程中,该工具会从主服务器发出以下远程命令:echo './run_audit.sh' | ssh host4 'bash -s'
。该方法在许多情况下都有效,除非存在交互行为,因为标准输入已在使用中。
有没有办法通过SSH以交互方式运行远程bash脚本?
作为起点,请考虑以下情况:echo 'read -p "enter name:" name; echo "your name is $name"' | ssh host4 'bash -s'
在上面的情况下,提示永远不会发生,我该如何解决?
提前致谢。
答案 0 :(得分:9)
直接运行命令,如下所示:
ssh -t host4 bash ./run_audit.sh
对于一个安可,修改shell脚本,使其从命令行或配置文件而不是从stdin(或优先于stdin)读取选项。
我是第二个丹尼斯威廉姆森的建议,而是寻找傀儡/等等。
答案 1 :(得分:1)
听起来你可能想看看expect
。
答案 2 :(得分:0)
不要通过stdin将命令传递给ssh,而是将shell脚本复制到远程机器:
scp ./run_audit.sh host4:
然后:
ssh host4 run_audit.sh
对于集群部署,我使用Fabric ...它运行在SSH协议之上,不需要守护进程。编写fabfile.py时很容易:
from fabric.api import run
def host_type():
run('uname -s')
然后:
$ fab -H localhost,linuxbox host_type
[localhost] run: uname -s
[localhost] out: Darwin
[linuxbox] run: uname -s
[linuxbox] out: Linux
Done.
Disconnecting from localhost... done.
Disconnecting from linuxbox... done.
当然它可以做更多......包括交互式命令,以及用于SSH的〜/ .ssh目录文件的中继。更多fabfile.org。当然,你会忘记bash来完成这些任务。 ; - )