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

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

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

명령줄에서 한 줄의 코드로 이 작업을 수행하려고 하는데 여기에 설명된 대로 스크립트 외부에서 수행하는 방법을 모르겠습니다. 가능합니까? 여기 문서에 대해 인터넷 검색하고 읽는 데 시간을 보냈지만 그런 일이 발생하지 않았습니다.

이 스크립트는 잘 작동합니다. SSH를 통해 원격으로 실행하려면 여기에 문서 부분이 필요 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하나의 명령으로 결합했습니다. 또한 호스트 이름을 중간 변수에 저장하지 않고 루프에 직접 입력하는 명령을 사용했습니다.awkgrepawkawk

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

다음을 수행하는 것이 좋습니다 pgrep.

pgrep -l -U research 'rsync|iasync'

이러한 프로세스에 신호를 보내려면 pkillin을 대신 사용 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}'"

큰따옴표로 묶인 이 문자열은 각 명령의 매개변수를 작은따옴표로 묶습니다. 더 많은 큰따옴표("패턴")가 필요한 경우 문자와 마찬가지로 "researcha를 사용하여 이스케이프해야 합니다 .\$

관련 정보