여러 호스트에서 명령을 실행하지만 성공한 경우에만 명령을 인쇄하시겠습니까?

여러 호스트에서 명령을 실행하지만 성공한 경우에만 명령을 인쇄하시겠습니까?

이것이 내가 하고 싶은 일이다.

100개 이상의 호스트를 확인하고 해당 호스트에 파일이 존재하는지 확인하고 싶습니다. 파일이 존재한다면 호스트 이름과 명령 출력을 인쇄하고 싶습니다.

이 예에서는 호스트 3개(host1.example.org, 호스트2.example.org, 호스트3.example.org)가 있다고 가정해 보겠습니다. 파일은 /etc/foobarhost2.example.org에 있지만,host1.example.org 또는host3.example.org에는 없습니다.

  1. ls -l /etc/foobar목록에 있는 모든 호스트에서 실행 하고 싶습니다 .
  2. 해당 호스트에 파일이 있으면 호스트 이름과 명령 출력을 인쇄합니다.
  3. 호스트에 파일이 없으면 아무 것도 인쇄되지 않습니다. 나는 추가적인 소음을 원하지 않는다.
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

관련 정보