이것이 내가 하고 싶은 일이다.
100개 이상의 호스트를 확인하고 해당 호스트에 파일이 존재하는지 확인하고 싶습니다. 파일이 존재한다면 호스트 이름과 명령 출력을 인쇄하고 싶습니다.
이 예에서는 호스트 3개(host1.example.org, 호스트2.example.org, 호스트3.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
출력을 중괄호로 감싸고 뱉어내려고 하는데 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 덕분에 많은 원격 서버에서 동시에 매우 쉽게 명령을 실행할 수 있습니다.
호스트를 서버당 한 줄씩(예: 호스트_파일)에 넣습니다. 예:
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