I have a text file in which I have a list of servers. I'm trying to read the server one by one from the file, SSH
in the server and execute ls
to see the directory contents. My loop runs just once when I run the SSH
command, however, for SCP
it runs for all servers in the text file and exits, I want the loop to run till the end of text file for SSH. Following is my bash script, how can I make it run for all the servers in the text file while doing SSH
?
#!/bin/bash
while read line
do
name=$line
ssh abc_def@$line "hostname; ls;"
# scp /home/zahaib/nodes/fpl_* abc_def@$line:/home/abc_def/
done < $1
I run the script as $ ./script.sh hostnames.txt
I open-sourced a command line tool called Overcast to make this sort of thing easier.
First you import your servers:
Once that's done you can run commands across them using wildcards, like so:
The problem with this code is that
ssh
starts reading data from stdin, which you intended forread line
. You can tellssh
to read from something else instead, like/dev/null
, to avoid eating all the other hostnames.Change your loop to a for loop:
It's not parallel ssh but it works.
A little more direct is to use the -n flag, which tells ssh not to read from standard input.