
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
이유가 거의 없음 ) 전체 배열을 제거할 수 있습니다.grep
awk
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
또는 프로세스 에 대한 정보를 얻으려는 것처럼 보입니다 .iasync
research
다음을 사용하는 것이 가장 좋습니다 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 n
n
sh -c
xargs
답변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
" 패턴), 로 이스케이프해야 하며 문자 \
도 마찬가지입니다 $
.