에 나열된 모든 서버에 로그인하기 위한 스크립트를 생성해야 합니다 servers.txt
. 비밀번호 없는 것이 아닌 비밀번호를 사용하고 싶습니다. 로그인한 후 변수를 설정하고 if
- then
- 을 실행해야 합니다 else
. 작업이 완료된 후에는 원격 컴퓨터가 아닌 로컬 컴퓨터에 파일이 생성되어야 합니다. (로컬) 파일에는 일부 프로세스가 실행되고 있지 않은 컴퓨터의 호스트 이름이 포함됩니다.
일반적인 아이디어는 다음과 같습니다.
#!/bin/bash
while read line
do
sshpass -p ******** ssh "mydomain1\admin1"@$line bash -s << EOF
pwd=*********
var=$"(ps -ef | grep http | grep -v grep | wc -l)"
if (( var > 0 ))
then
echo "$pwd" | sudo -S ps -ef | grep patrol | grep -v grep | awk '{print $2}' | xargs kill
echo "$pwd" | sudo -S rm -rf /data/abc /etc/efg
#need to create the log on local machine, not on remote machine
hostname >> /find.txt
else
#need to create the log on local machine, not on the remote machine
hostname >> /agentnotthere.txt
fi
EOF
#servers.txt contains server names
done < servers.txt
분명히 위의 5-16행은 원격 호스트에서 실행될 명령이 포함된 here 문서를 구성합니다. 이 문서에는 소개 단락 hostname >> /find.txt
과 hostname >> /agentnotthere.txt
코드의 주석에 명시된 대로 (원격) 호스트 이름이 원격 컴퓨터의 파일이 아닌 로컬 파일에 기록되기를 원합니다. 분명히 원격 시스템의 명령이 파일에 기록됩니다.command >> filename
원격 컴퓨터에서.
ssh
원격 시스템에서 일부 명령을 실행하는 데 사용되는 스크립트가 원격 시스템에서 실행된 테스트 결과를 기반으로 로컬 파일에 출력을 쓰도록 하려면 어떻게 해야 합니까 ?
답변1
원하는 것을 달성하는 쉬운 방법은 없다고 생각합니다. 이는 원격 시스템에서 실행되는 스크립트와 별도로 로컬 호스트에 파일을 작성하는 것을 의미합니다.
그러나 스크립트 출력을 로컬 파일로 쉽게 파이프할 수 있습니다.
ssh host << EOF > output_file
some commands
to be executed
EOF
이렇게 하면 여러 번 실행되도록 스크립트를 재구성할 수 있습니다 (이로 인해 오버헤드가 추가되지만 구성 파일에서 이를 사용하면 대부분을 줄일 ssh
수 있습니다 ).ssh
ControlPersist
ssh
따라서 다음과 같은 결과가 나옵니다(pseudo-bash).
echo "get the output of var script" | ssh host > var_value
if var read from the file is more than zero; then
echo "the thing you want" | ssh host >> /find.txt
else
echo "the other thing you want" | ssh host >> /agentnotthere.txt
fi
이것은 귀하의 사용 사례에 잘 작동합니다 :)
스크립트 자체에 대한 나의 두 가지 생각:
- 이 작업에는 bash 스크립트를 작성하는 것보다 Ansible 또는 다른 구성 관리 도구 중 하나가 더 적합할 수 있습니다.
- 보안 관점에서 키 인증 대신 SSH 비밀번호를 사용하는 것은 좋지 않습니다. 하지만 회사 정책/이를 지원하지 않는 오래된 내장 콘텐츠 등으로 인해 이것이 가능하지 않은 상황에 직면했습니다.
ps aux | grep -v grep | grep something
pgrep
이전 상용구를 사용하는 대신pkill
. 이는 표준coreutils
이므로 매우 오래된 시스템을 사용하지 않는 한 제대로 작동합니다.