【问题标题】:Is it possible to run a script which loops through hosts with rsh/ssh是否可以运行一个使用 rsh/ssh 遍历主机的脚本
【发布时间】:2013-01-23 09:12:54
【问题描述】:

我尝试运行以下 csh 脚本,该脚本通过 ssh 连接到我们网络上的所有计算机,目的是 yum 安装作为参数传递的软件。但是,一旦我将 rsh 连接到另一台主机,该脚本将无法继续。有没有办法解决这个问题?

if ($1 == "")then
    echo -n "Please enter a package to install\n"
    set package=$<
else set package = $#argv
endif

set numlines = `cat $NM_HOME/sh_local/nc_network2.txt | grep -v "^#" | fgrep "%" |  wc -l`
while ($numlines>0)
    set line = `cat $NM_HOME/sh_local/nc_network2.txt | grep -v "^#" | fgrep "%" | tail -$numlines | head -1`
    set host2 = `echo $line | cut -f 1 -d %`
    set where = `echo $line | cut -f 2 -d %`
    if ($host2 == $this_machine) then 
    echo "This is $host2....skipping rsh to this machine"
    echo ""
    goto yum
    endif
    echo ""
    echo "logging into $host2 $where"
    echo ""
    sleep 1
    rsh $host2
    yum:
    echo ""
    echo "Preparing to install $package on $host2"
    sudo yum -y install $package
    if ($host2 == $this_machine) then 
    goto decrement
    else
    logout
    goto decrement
    endif

    decrement:
    @ numlines--

end

【问题讨论】:

    标签: linux bash csh


    【解决方案1】:

    ssh/rsh-ing 到另一个主机不会神奇地继续在该主机上执行脚本。在脚本中执行ssh hostname 与在你的shell 中执行ssh hostname 具有完全相同的效果——它连接到那台机器,在那里运行一个交互式shell,然后将你留在那个shell 中。只有在您自己关闭 ssh/rsh 连接后,您的脚本才会继续执行。

    为了在该主机上执行某些操作,您需要提供要在该主机上运行的显式命令,如下所示:

    rsh $host2 sudo yum -y install $package

    请注意,这只是一个用于说明目的的简单示例;这可能不足以修复脚本的整个逻辑,但应该为您指明正确的方向。

    【讨论】:

    • 感谢您的帮助,我快到了。我现在唯一的问题是,一旦 yum 安装完成,我必须退出交互式 shell。是否有 rsh $host2 sudo yum -y install $package;注销类型命令?
    • man rsh 在 Mac 上(即 BSD rsh)声明 rsh normally terminates when the remote command does. 在我的 Ubuntu 机器上,rsh 是指向 ssh 的符号链接,并且 ssh 也会在远程命令已完成,但手册没有说明rsh 行为的任何具体内容,而且我没有设置rsh 服务器,所以我无法测试。
    【解决方案2】:

    是的。我的答案仅通过阅读您的“问题”而不是您在发布的代码中提供的内容来提供。

    我已经做了很多年了,如下所示。

    • 创建一个主机列表,每行一个主机。
    • 预先启用基于 SSH 密钥的身份验证。这可以手动完成,但我过去曾使用 perlexpect 完成。

    • 如下运行for 循环以在所有服务器上执行操作:

      对于我在cat hosts_list;做 ssh $i dmidecode | grep -m 1 '序列号:';完成

    oneliner 上面会给我host_list 中提到的所有服务器的序列号。这是一个提取序列号的示例。但是,您可以按照完全相同的逻辑编写完整的 bash 脚本。

    对于更高级的要求,考虑使用perlCPAN 上可用的ssh 模块

    【讨论】:

      猜你喜欢
      • 2019-07-02
      • 1970-01-01
      • 2017-11-09
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 2016-08-03
      相关资源
      最近更新 更多