通过ssh调用交互式bash脚本

时间:2012-07-07 06:54:16

标签: bash scripting ssh scp ssh-tunnel

我正在编写一个“工具” - 一些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'

在上面的情况下,提示永远不会发生,我该如何解决?

提前致谢。

3 个答案:

答案 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来完成这些任务。 ; - )