스크립트가 ssh를 호출하여 로컬 시스템에 로그를 생성하려고 합니다.

스크립트가 ssh를 호출하여 로컬 시스템에 로그를 생성하려고 합니다.

에 나열된 모든 서버에 로그인하기 위한 스크립트를 생성해야 합니다 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.txthostname >> /agentnotthere.txt코드의 주석에 명시된 대로 (원격) 호스트 이름이 원격 컴퓨터의 파일이 아닌 로컬 파일에 기록되기를 원합니다. 분명히 원격 시스템의 명령이 파일에 기록됩니다.command >> filename원격 컴퓨터에서.

ssh원격 시스템에서 일부 명령을 실행하는 데 사용되는 스크립트가 원격 시스템에서 실행된 테스트 결과를 기반으로 로컬 파일에 출력을 쓰도록 하려면 어떻게 해야 합니까 ?

답변1

원하는 것을 달성하는 쉬운 방법은 없다고 생각합니다. 이는 원격 시스템에서 실행되는 스크립트와 별도로 로컬 호스트에 파일을 작성하는 것을 의미합니다.

그러나 스크립트 출력을 로컬 파일로 쉽게 파이프할 수 있습니다.

ssh host << EOF > output_file              
some commands
to be executed
EOF

이렇게 하면 여러 번 실행되도록 스크립트를 재구성할 수 있습니다 (이로 인해 오버헤드가 추가되지만 구성 파일에서 이를 사용하면 대부분을 줄일 ssh수 있습니다 ).sshControlPersistssh

따라서 다음과 같은 결과가 나옵니다(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 somethingpgrep이전 상용구를 사용하는 대신 pkill. 이는 표준 coreutils이므로 매우 오래된 시스템을 사용하지 않는 한 제대로 작동합니다.

관련 정보