저는 서버 세트에서 디스크 공간을 자동으로 수집하는 작업을 하고 있습니다.
표준 터미널에서 다음을 실행하면:
ssh server1 ssh server2 df -h
그런 다음 명령의 출력을 얻었습니다.
그러나 For 루프를 사용하는 스크립트에서 이것을 시도하면. 그런 다음 실패했습니다.
스크립트 예:
#!/bin/bash
GROUP="server1 server2"
for s in $GROUP; do
ssh bastion1 ssh ${s} df -h
done
후자의 예에서는 출력(또는 해당 문제에 대한 오류)이 발생하지 않습니다. 다양한 이스케이프와 인용을 시도했지만 여전히 운이 없습니다. 이것이 제가 간과하고 있는 명백한 뭔가라는 느낌이 듭니다. 어떤 충고?
답변1
두 가지 방법이 있습니다
방법 1:
Groups="server1 server2"
echo $Groups | xargs -n1 | xargs -I'{}' echo ssh '{}' df
참고:- 위 명령의 출력이 양호하면 echo
마지막에 삭제하면 원격 서버에서 명령이 실행됩니다. 환경 변수와 마찬가지로 변수를 대문자로 사용하지 마십시오.
방법 2:
아래 스크립트를 참고하시면 됩니다
#!/bin/bash
# ssh password less login is required
# mention below remote server seperated by space
remote_srv=( 127.0.0.1 127.0.0.2 127.0.0.3 )
do_ssh() {
ssh $s "$@"
echo -e
}
header() {
echo "#==================={$@}==========================#"
}
n=${#remote_srv[@]} # number of ip's in array
for (( i=0;i<$n;i++)); do
echo -e
echo "$(tput bold)$(tput setaf 2)* Connected Server: ${remote_srv[$i]} @@ $(date) @@"
echo "* Fetching info...$(tput sgr 0)"
s=${remote_srv[$i]}
header "Memory Usage"
do_ssh free -m
header "Disk Usage"
do_ssh df -h
done
## EOF
답변2
UNIX는 더 나은 솔루션을 제공하므로 ssh가 필요하지 않고 df 또는 du 등을 실행할 필요가 없습니다.
서버에서 사용하고 세션을 닫을 수 있지만 tmux command
를 통해 열면 프로그램이 닫히지 않습니다 tmux
. tmux
화면 명령과 유사하지만 매우 복잡하고 유용합니다.