是否可以运行使用rsh / ssh在主机上循环的脚本

时间:2013-01-23 09:12:54

标签: linux bash csh

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

2 个答案:

答案 0 :(得分:2)

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

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

rsh $host2 sudo yum -y install $package

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

答案 1 :(得分:1)

即可。我的答案仅在阅读您的“问题”时提供,而不是您在所发布的代码中提供的内容。

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

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

  • 运行如下所示的for循环以对所有服务器执行操作:

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

上面的oneliner将为我提供host_list中提到的所有服务器的序列号。这是拉序列号的一个例子。但是,您可以按照完全相同的逻辑编写完整的bashged脚本。

要获得更高级的要求,请考虑使用perl上可用的sshCPAN模块