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
이유가 거의 없음 ) 전체 배열이 삭제될 수 있습니다.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
in을 대신 사용 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
a를 사용하여 이스케이프해야 합니다 .\
$