Bash:在多个主机

时间:2015-10-27 10:18:48

标签: bash ssh

我想要做的是运行一个非常简单的命令:

cat content.txt >> target.file

但我想在很多主机上这样做。

所以我这样接近它:

  • 拥有文件中的主机列表
  • 循环列表并执行ssh $line 'cat content.txt >> target.file'

但是当用简单的回声" $ line"进行测试时,这似乎并没有起作用。我找回了我的台词。 使用ssh $ line' ls'进行测试时在循环中我只得到一个结果。

#!/bin/bash
cat target_hosts.txt | while read line
do
  echo `ssh "$line" 'ls'`
done

2 个答案:

答案 0 :(得分:2)

如果您想将cat个文件放入其他服务器,可以说出transfer file to remote host and append to file if existing中建议的内容:

somecommand | ssh somehost 'cat - >> file.log'

也就是说,使用stdin作为cat的馈线。我刚做了一个测试,它确实有效。

在你的情况下,这应该是:

while IFS= read -r line
do
   cat content.txt | ssh "$line" 'cat - >> target.file'
done < target_hosts.txt

或者,更好,gniourf_gniourf suggests

ssh "$line" 'cat - >> target.file' < content.txt

或者甚至更好,只需删除-,因为在没有任何参数(chepner's suggestion)时它是cat的默认值:

ssh "$line" 'cat >> target.file' < content.txt

答案 1 :(得分:2)

因为ssh命令将来自target_hosts.txt的输入,您必须重定向ssh的输入以防止它输入您的输入

#!/bin/bash
while read line
do
  ssh "$line" 'ls' < /dev/null
done < target_hosts.txt

更多详情:

while read line
do
  ssh "$line" 'ls' < /dev/null
done

是一个子命令,其输入为文件target_hosts.txt,该子命令中的所有命令共享输入。子命令

中有2个命令
  • SSH

readssh命令都可以读取target_hosts.txt的输入。虽然read占用一行,但运行ssh,默认情况下ssh将消耗所有剩余输入,然后无需读取,脚本结束