여기 문서를 한 줄로 사용하시겠습니까?

여기 문서를 한 줄로 사용하시겠습니까?

ssh여기 문서를 사용하여 원격 호스트에서 명령을 실행하는 간단한 스크립트가 있습니다 .

명령줄에서 한 줄로 수행하려고 했지만 스크립트 외부에서 여기 문서를 수행하는 방법을 알 수 없었습니다. 가능합니까? 여기 문서에 대한 문서를 검색하고 읽는 데 시간을 보냈지만 결과가 나오지 않았습니다.

이 스크립트는 잘 작동합니다. SSH를 통해 원격으로 실행하려면 here-document 섹션이 필요했지만 awk일반적으로 간단한 작업을 위해 한 줄로 작성하는 것을 좋아합니다.

#!/bin/bash
# it looks up all my hosts with 'db' in the name
# then gets the PID of any rsyncs running as user 'research'
# and pumps them into xargs

getHosts=(`curl --silent "http://assetts.lab/all_hosts" | grep -v ^# | awk -F" " '{print$1}'|grep db`)
for BOX in ${getHosts[@]};do
    echo "$BOX: "
    ssh -T sshUser@$BOX <<"EOF"
ps -ef | egrep "rsync|iasync" | awk -F" " '{if ($1 ~ "research") print $2}'|sudo xargs -i ps -fp '{}'
#ps -ef | egrep "rsync|iasync" | awk -F" " '{if ($1 ~ "research") print $2}'|sudo xargs -i kill '{}'
EOF
    echo
done

아마도 간단한 것이 빠졌을 것입니다 ... 어쨌든 어떤 제안이라도 감사드립니다 :)

답변1

나는 여기 문서의 사용에 관해 어떤 조치도 취할 필요가 없다고 생각하지만,하다스크립트의 다른 사항을 상당히 단순화할 수 있는지 확인하십시오(이로 인해 여기 문서가 더 이상 사용되지 않게 됩니다).

우선, 배열을 채우는 파이프라인이 단순화될 수 있으며(파이핑 할 getHosts이유가 거의 없음 ) 전체 배열을 제거할 수 있습니다.grepawk

curl -s 'http://assetts.lab/all_hosts' |
awk -F ' ' '!/^#/ && $1 ~ /db/ { print $1 }' |
while IFS= read -r remote; do
   # rest of code
done

grep여기서는 + awk+ grep명령을 단일 명령으로 결합했습니다 awk. 또한 awk명령을 통해 호스트 이름을 중간 변수에 저장하는 대신 루프에 직접 입력하도록 했습니다 .

루프 내부에서는 사용자 에게 속한 rsync또는 프로세스 에 대한 정보를 얻으려는 것처럼 보입니다 .iasyncresearch

다음을 사용하는 것이 가장 좋습니다 pgrep.

pgrep -l -U research 'rsync|iasync'

이러한 프로세스에 신호를 보내려면 옵션 pkill대신 사용 pgrep하고 삭제하세요 -l.

전체 스크립트는 다음과 같습니다.

#!/bin/sh

curl -s 'http://assetts.lab/all_hosts' |
awk -F ' ' '!/^#/ && $1 ~ /db/ { print $1 }' |
while IFS= read -r remote; do
   printf 'Processing host "%s"\n' "$remote"
   ssh "$remote" 'pgrep -l -U research "rsync|iasync"'
done

또는 다음을 사용하여 xargs:

#!/bin/sh

curl -s 'http://assetts.lab/all_hosts' |
awk -F ' ' '!/^#/ && $1 ~ /db/ { print $1 }' |
xargs -I {} sh -c '
   printf "Processing host \"%s\"\n" "$1"
   ssh "$1" "pgrep -l -U research \"rsync|iasync\""' sh {}

지원하는 경우 를 사용하여 여러 프로세스를 한 번에 xargs실행하도록 만들 수 있습니다 . 여기서 계속 실행되어야 하는 동시 명령 수는 다음과 같습니다 .sh -c-P nnsh -cxargs

답변2

EOF bash 기능은 기본적으로 예제에서와 같이 사용하기 위한 것입니다. 즉, 여러 줄의 텍스트를 다른 명령으로 보내기 위한 것입니다.

이것을 한 줄로 원한다면 EOF를 사용해야 합니다.

SSH를 사용하여 원격 호스트에서 명령을 실행하려면 다음을 수행하면 됩니다.

ssh host command

예를 들어:

ssh host "ls -alh"

호스트에서 명령을 실행하고 콘솔에 출력을 반환합니다.

다음과 같이 따옴표를 어떻게 사용하는지 기록해 두면 예제 코드를 한 줄로 다시 작성할 수 있습니다.

ssh host "ps -ef | egrep 'rsync|iasync' | awk -F' ' '{if (\$1 ~ \"research\") print \$2}'"

큰따옴표로 묶인 이 문자열은 작은따옴표 안에 개별 명령에 대한 인수를 넣습니다. 더 많은 큰따옴표가 필요한 경우( "research" 패턴), 로 이스케이프해야 하며 문자 \도 마찬가지입니다 $.

관련 정보