Script chamando ssh; deseja criar log na máquina local

Script chamando ssh; deseja criar log na máquina local

Preciso criar um script que faça login em todos os servidores listados em servers.txt. Quero usar senha, sem senha. Depois de fazer login, preciso definir uma variável e executar um if-  then-  else. Após a conclusão do trabalho, deve-se criar um arquivo na máquina local e não na remota. O arquivo (local) conterá os nomes de host das máquinas onde determinado processo não estava em execução.

A ideia geral é:

#!/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

Obviamente, as linhas 5 a 16 acima formam um documento aqui contendo comandos para executar no host remoto. Nesse documento aqui, tenho comandos hostname >> /find.txte hostname >> /agentnotthere.txtarquivos . Conforme declarado em meu parágrafo introdutório e novamente nos comentários do código, quero que o nome do host (remoto) seja gravado em um arquivo local, não em um arquivo na máquina remota. Obviamente, um comando na máquina remota irá gravar em um arquivocommand >> filenamena máquina remota.

Como posso fazer com que meu script, que usa sshpara executar alguns comandos em máquinas remotas, grave a saída em um arquivo local com base nos resultados de testes realizados na máquina remota?

Responder1

Não acho que exista uma maneira fácil de fazer o que você deseja, ou seja, gravar arquivos separados em seu host local a partir de um script em execução em uma máquina remota.

Você pode facilmente canalizar a saída do script para um arquivo local:

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

Com isso, você pode reestruturar o script para que ele seja executado sshvárias vezes (isso aumentará a sshsobrecarga, mas você pode atenuar a maior parte usando ControlPersisto ssharquivo de configuração).

Então, em vez disso, você terminará com algo assim (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

Isso deve se adequar perfeitamente ao seu caso de uso :)

Meus dois centavos sobre o script em si:

  • Ansible ou uma das outras ferramentas de gerenciamento de configuração é provavelmente mais adequada para esta tarefa em vez de escrever scripts bash
  • Usar senhas SSH em vez de autenticação de chave é ruim do ponto de vista de segurança. Mas já estive em situações em que é impossível implementar isso por causa da política da empresa/coisas incorporadas antigas que não suportam isso/etc.
  • Em vez de usar o ps aux | grep -v grep | grep somethingmodelo antigo, você pode usar pgrepe pkill. Eles estão no padrão coreutils, então, a menos que você use sistemas realmente antigos, eles devem estar disponíveis neles

informação relacionada