I have a text file with various IP addresses.

I would like to cycle through each, and issue a command:

cat ips.txt | xargs -L 1 `ssh me@__IP__ echo "text" > file; reboot;`

But I'm unsure how to pass the xargs value to _IP_.

Could someone explain how this could be accomplished?


You don't need either cat or xargs for this: a simple read in a loop would suffice:

while read -r IP;do
    ssh me@$IP echo "text" > file
done < ips.txt

For future reference, what you want for xargs can be achieved with the -I option: you supply a name after -I and any instances of that name in the command itself will be replaced by the arguments xargs receives on the pipe:

... | xargs -L 1 -I myip ssh me@myip 'echo "text">file;reboot'
  • Thanks! I was using -I earlier, which was actually rebooting my server by mistake for some reason :) thanks this is very helpful! – d-_-b Dec 24 '13 at 22:55
  • 2
    @d-_-b This is because the shell (rightfully) interprets the semicolon as terminating the xargs command. To avoid this, quote your arguments: ... shh me@myip 'echo text > file;reboot' – Joseph R. Dec 24 '13 at 23:05
  • From man page: -I Implies -x and -L 1 – Pablo A Apr 5 '20 at 0:46

With GNU Parallel you can do it in parallel:

parallel --slf ips.txt --nonall 'echo "text" > file; reboot;'

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.