0

我试图运行以下 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
4

2 回答 2

2

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

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

rsh $host2 sudo yum -y install $package

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

于 2013-01-23T09:21:01.270 回答
1

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

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

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

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

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

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

对于更高级的要求,请考虑使用perlssh可用的模块CPAN

于 2013-01-23T09:43:35.533 回答