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

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

제가 하고 싶은 일은 다음과 같습니다.

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

이 예제에서는 3개의 호스트(host1.example.org,host2.example.org,host3.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에 대한 행이 인쇄되는 것을 원하지 않습니다.

echoand 에 의해 생성된 출력을 포함하기 위해 중괄호를 실험하고 있지만 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. 감사합니다 pssh를 사용하면 한 번에 많은 원격 서버에서 명령을 매우 쉽게 실행할 수 있습니다.

호스트를 (예: 호스트_ 파일 )에 넣습니다. 각 서버는 다음과 같이 한 줄로 구성됩니다
.

용법:

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

관련 정보