我尝试运行以下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
答案 0 :(得分:2)
ssh
/ rsh
- 对另一台主机不会神奇地继续在该主机上执行您的脚本。在脚本中执行ssh hostname
与在shell中执行ssh hostname
具有完全相同的效果 - 它连接到该机器,在那里运行交互式shell,并将您留在该shell中。只有在您自己关闭ssh
/ rsh
连接后,您的脚本才会继续执行。
要在该主机上执行某些操作,您需要提供要在该主机上运行的显式命令,如下所示:
rsh $host2 sudo yum -y install $package
请注意,这只是一个用于说明目的的简单示例;它可能不足以修复脚本的整个逻辑,但应该指向正确的方向。
答案 1 :(得分:1)
是即可。我的答案仅在阅读您的“问题”时提供,而不是您在所发布的代码中提供的内容。
我这样做了很多年,如下所示。
预先启用基于SSH密钥的身份验证。这可以手动完成,但我过去使用perl
和expect
完成了此操作。
运行如下所示的for
循环以对所有服务器执行操作:
for cat hosts_list
;做ssh $ i dmidecode | grep -m 1'序列号:';完成
上面的oneliner将为我提供host_list
中提到的所有服务器的序列号。这是拉序列号的一个例子。但是,您可以按照完全相同的逻辑编写完整的bashged脚本。
要获得更高级的要求,请考虑使用perl
上可用的ssh
和CPAN
模块