Bash在多个服务器上运行RSH



我有一个类似的服务器列表文件:

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

但是,它仅转到第一个" severname1",重命名文件并打印回声。它永远不会输入其余的服务器,甚至没有打印回声。我不知道为什么它只是为第一个工作。

有人给我帮助吗?

不要让 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之间匹配。您可以选择使用read _ server _ <&3而不是依赖read -u,如果您希望代码与Bash以外的其他外壳兼容。
  • _ S吃了您不希望read放入内容的情况。read _ server _将第一个字段放入_,第二个字段中server,然后将第三个字段置于_中。

相关内容

  • 没有找到相关文章

最新更新