Here’s what I want to do.
I want to check over 100 hosts and see if a file exists on that host. If the file does exist, then I want to print the hostname and the output of the command.
In this example example, assume that I have three hosts: host1.example.org host2.example.org host3.example.org . The file
/etc/foobar
exists on host2.example.org, but not on host1.example.org or host3.example.org .
- I want to run
ls -l /etc/foobar
on each host in the list.- If this file exists on that host, then print the hostname and the output of the command.
- If the file does not exist on that host, then don’t print anything. I don’t want the extra noise.
HOSTLIST="host1.example.org host2.example.org host3.example.org" for HOST in $HOSTLIST do echo "### $HOST" ssh $HOST "ls -ld /etc/foobar" done
Ideal output would be:
### host2.example.org drwx------ 3 root root 4096 Apr 10 16:57 /etc/foobar
But the actual output is:
### host1.example.org ### host2.example.org drwx------ 3 root root 4096 Apr 10 16:57 /etc/foobar ### host3.example.org
I don’t want the lines for host1.example.org or host3.example.org to print.
I am experimenting braces to contain the output spit out by
echo
andssh
, but I can’t figure out the magic syntax to do what I want. I am sure that I have done this in the past without control characters,HOSTLIST="host1.example.org host2.example.org host3.example.org" for HOST in $HOSTLIST do # If 'ls' shows nothing, don't print $HOST or output of command # This doesn't work { echo "### $HOST" && ssh $HOST "ls -ld /etc/foobar" ; } 2>/dev/null done
Answer
in this issue i recommend use pssh. Thx pssh you could very easy run command on many remote servers at once.
put host into (i.e hosts_file)- each server in 1 line like:
host1.tld
host2.tld
Usage:
pssh -h hosts_file "COMMAND"
in you example it will be
pssh -h hosts_file "ls -l /etc/foobar"
Attribution
Source : Link , Question Author : Stefan Lasiewski , Answer Author : user64602