这就是我想做的。
我想检查 100 多个主机并查看该主机上是否存在文件。如果该文件确实存在,那么我想打印主机名和命令的输出。
在此示例中,假设我有三个主机: host1.example.org host2.example.org host3.example.org 。该文件/etc/foobar
存在于 host2.example.org 上,但不存在于 host1.example.org 或 host3.example.org 上。
- 我想
ls -l /etc/foobar
在列表中的每个主机上运行。 - 如果该主机上存在该文件,则打印主机名和命令的输出。
- 如果该主机上不存在该文件,则不打印任何内容。我不想要额外的噪音。
HOSTLIST="host1.example.org host2.example.org host3.example.org"
for HOST in $HOSTLIST
do
echo "### $HOST"
ssh $HOST "ls -ld /etc/foobar"
done
理想的输出是:
### host2.example.org
drwx------ 3 root root 4096 Apr 10 16:57 /etc/foobar
但实际输出是:
### host1.example.org
### host2.example.org
drwx------ 3 root root 4096 Apr 10 16:57 /etc/foobar
### host3.example.org
我不希望打印 host1.example.org 或 host3.example.org 的行。
echo
我正在尝试用大括号来包含and吐出的输出ssh
,但我无法弄清楚执行我想要的操作的神奇语法。我确信我过去曾在没有控制字符的情况下完成过此操作,
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
答案1
在本期中我建议使用噗噗。谢谢 pssh,您可以非常轻松地同时在许多远程服务器上运行命令。
将主机放入(即hosts_file) - 每个服务器在1行中,例如:
host1.tld
host2.tld
用法:
pssh -h hosts_file "COMMAND"
在你的例子中它将是
pssh -h hosts_file "ls -l /etc/foobar"
答案2
这对我有用:
for HOST in $HOSTLIST; do
ssh $HOST '[ -f /etc/passwd ] && echo $(hostname) has file'
done
答案3
set -- host1.example.org host2.example.org
for host; do
ssh "$host" sh -c '[ -e /etc/foobar ] && { printf %s\\n "$1"; ls -ld /etc/foobar; }' _ "$host"
done
答案4
for host in host1 host2 host3 ;do ssh $host 'echo -n "[$(hostname -s)]"; /sbin/ifconfig |grep Bcast' ;done
[host1] inet addr:xxx.xxx.138.30 Bcast:xxx.xxx.143.255 Mask:255.255.248.0 [host2] inet addr:xxx.xxx.138.14 Bcast:xxx.xxx.143.255 Mask:255.255.248.0 [host3] inet addr:xxx.xxx.82.146 Bcast:xxx.xxx.82.255 Mask:255.255.255.128