5

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

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

提前致谢。

4

3 回答 3

9

直接运行命令,如下所示:

ssh -t host4 bash ./run_audit.sh

对于再演,修改 shell 脚本,使其从命令行或配置文件而不是从标准输入(或优先于标准输入)读取选项。

我同意 Dennis Williamson 的建议,改为研究 puppet/etc。

于 2012-07-07T13:06:13.877 回答
1

听起来你可能想调查一下expect

于 2012-07-07T06:56:15.233 回答
0

不要通过标准输入将命令通过管道传输到 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 来完成这些任务。;-)

于 2012-07-07T19:10:36.947 回答