【问题标题】:calling an interactive bash script over ssh通过 ssh 调用交互式 bash 脚本
【发布时间】:2012-07-07 13:08:24
【问题描述】:

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

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

提前致谢。

【问题讨论】:

  • 看看 puppet 或类似的配置管理器。并且不要以交互方式进行分布式配置。

标签: bash scripting ssh scp ssh-tunnel


【解决方案1】:

直接运行命令,如下:

ssh -t host4 bash ./run_audit.sh

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

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

【讨论】:

  • 一开始我并没有意识到,但这有效!使用无密码身份验证 (DSA),我将脚本 SCP 到所有服务器并远程执行它们。该解决方案既是分布式的又是交互式的,这正是我最初想要的方式。我刚刚介绍了配置以根据丹尼斯的评论替换提示,但这不是重点。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    听起来你可能想看看expect

    【讨论】:

    • 作为解决眼前问题的创可贴,是的。正确的解决方法是不需要交互式配置。
    • 当然 - 但这并不总是一种奢侈(在这种情况下,它是一个批处理脚本,但在更一般的情况下,它可能是一个不容易修改的不同可执行文件)。
    猜你喜欢
    • 2012-10-23
    • 2017-03-18
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2017-05-05
    • 1970-01-01
    相关资源
    最近更新 更多