Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:在多台主机上追加文件_Bash_Ssh - Fatal编程技术网

Bash:在多台主机上追加文件

Bash:在多台主机上追加文件,bash,ssh,Bash,Ssh,我要做的是运行一个非常简单的命令: cat content.txt >> target.file 但是我想在很多主机上做这个 所以我是这样处理的: 在文件中有一个主机列表 在列表上循环并执行ssh$line'cat content.txt>>target.file' 但这似乎不起作用,当用一个简单的回音“$line”进行测试时,我得到了我的线路。 在循环中使用ssh$行“ls”进行测试时,我只得到一个结果 #!/bin/bash cat target_hosts.txt | w

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

cat content.txt >> target.file
但是我想在很多主机上做这个

所以我是这样处理的:

  • 在文件中有一个主机列表
  • 在列表上循环并执行
    ssh$line'cat content.txt>>target.file'
但这似乎不起作用,当用一个简单的回音“$line”进行测试时,我得到了我的线路。 在循环中使用ssh$行“ls”进行测试时,我只得到一个结果

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

如果您想
cat
将一个文件插入另一台服务器,您可以说出以下建议:

也就是说,将stdin用作
cat
的馈线。我刚做了一个测试,它工作了

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

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

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

#!/bin/bash
while read line
do
  ssh "$line" 'ls' < /dev/null
done < target_hosts.txt
#/bin/bash
读行时
做
ssh“$line”'ls'
更多详情:

while read line
do
  ssh "$line" 'ls' < /dev/null
done
读取行时
做
ssh“$line”'ls'
是一个子命令,其输入为file
target_hosts.txt
,此子命令中的所有命令共享该输入。子命令中有2个命令

  • 阅读
  • ssh

read
ssh
命令都可以从
target_hosts.txt
读取输入。当
read
消耗一行,然后运行
ssh
时,默认情况下
ssh
将消耗所有剩余的输入,然后就没有什么可读取的了,您的脚本结束时

只需
ssh“$line”ls
就可以工作了。循环当然没有问题,但我建议使用一个奇特的工具:GNU parallel。看,我认为你不能将本地文件
cat
放入远程机器。你可能必须把它复制到那里,一旦它到了那里,然后猫就可以抓住它了,但我想它还没到那里。根据描述,即使是
ls
也不起作用。@fedorqui您当然可以
cat
这样做:
sshuser@host“cat>>目标\u文件”
sshuser@host“cat>>目标文件”
更好!嗯,在我看来,它就像一个表情符号:)@gniourf_gniourf添加了您的建议,以确保完整性。谢谢:)连字符是不必要的
cat
在没有任何参数的情况下从标准输入读取。@gniourf_gniourf oops抱歉,我只是将注意力集中在间接的方向上,而不是在没有
-
的情况下。您可以在读取-r行时为
read
命令使用不同的文件描述符,而不是
ssh "$line" 'cat >> target.file' < content.txt
#!/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