我想要做的是运行一个非常简单的命令:
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
答案 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
,该子命令中的所有命令共享输入。子命令
read
和ssh
命令都可以读取target_hosts.txt
的输入。虽然read
占用一行,但运行ssh
,默认情况下ssh
将消耗所有剩余输入,然后无需读取,脚本结束