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(이렇게 하면 오버헤드가 증가 하지만 구성 파일 에서 ssh사용하면 대부분을 완화할 수 있습니다 ).ControlPersistssh

대신에 다음과 같은 결과가 나올 것입니다(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사용할 수 있습니다 . 표준에 있으므로 매우 오래된 시스템을 사용하지 않는 한 사용할 수 있습니다.pgreppkillcoreutils

관련 정보