Bash在多台服务器上运行rsh

时间:2015-05-13 23:35:46

标签: linux bash

我有一个像这样的服务器列表文件:

xxx ServerName1 xxx
xxx ServerName2 xxx
...

现在我想转到每个服务器从本地重命名文件。我的Bash脚本是这样的:

#!/bin/bash

while read line
do
   server=`echo $line | awk '{print $2}'` # get server name
   rsh $server mv /a/b/c.txt /a/b/d.txt   # rename on the server
   echo "rename file in $server"          # print echo
done < server.txt

但是,它只会转到第一个&#34; SeverName1&#34;,重命名文件并打印回声。它永远不会到达其他服务器,甚至不会打印回声。我不知道为什么它只适用于第一个。

有人给我一个帮助吗?

1 个答案:

答案 0 :(得分:2)

不要让rsh吃掉输入流的其余部分 - 如果有的话,下次循环尝试while read时,任何内容都无法读取开始。最简单的方法是从/dev/null重定向stdin:

rsh "$server" mv /a/b/c.txt /a/b/d.txt </dev/null

或者,你可以循环除0以外的FD(注意这里使用awk是愚蠢的;你可以告诉bash本身只挑选每行的第二个字段,我在下面的代码中做了):

while read -u 3 _ server _; do              # get server name (with read)
   rsh "$server" mv /a/b/c.txt /a/b/d.txt   # rename on the server
   echo "rename file in $server"            # print echo
done 3< server.txt

解释一些可能不太明显的要点:

  • 3是文件描述符号;它需要在-u 33< server.txt之间进行匹配。如果您希望代码与bash以外的shell兼容,则可以选择使用read _ server _ <&3而不是依赖read -u
  • 您不希望_将内容放入read个字段。 read _ server _将第一个字段放入_,将第二个字段放入server,将第三个字段放入_