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

1

Eu preciso criar um script que faça login em todos os servidores listados em servers.txt . Eu quero usar senha, sem senha. Após o login, preciso definir uma variável e executar um if - then - else . Depois que o trabalho estiver concluído, ele deve criar um arquivo na máquina local, não no remoto. O arquivo (local) conterá o (s) nome (s) do host das máquinas onde determinado processo não estava sendo executado.

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-16 do acima formam um documento aqui contendo comandos para executar no host remoto. Nesse documento aqui, Eu tenho comandos hostname >> /find.txt e hostname >> /agentnotthere.txt . Como declarado no meu parágrafo introdutório, e novamente nos comentários no código, Eu quero que o nome do host (remoto) seja gravado em um arquivo local, não é um arquivo na máquina remota. Obviamente, um comando command >> filename na máquina remota irá gravar em um arquivo na máquina remota .

Como posso obter meu script? que usa ssh para executar alguns comandos em máquinas remotas, gravar saída em um arquivo local com base nos resultados dos testes realizados na máquina remota?

    
por A K 29.05.2018 / 13:17

1 resposta

1

Eu não acho que haja uma maneira fácil de fazer o que você queria, ou seja, escrever para separar arquivos em seu host local de um script que está sendo executado em uma máquina remota.

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

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

Com isso, você pode reestruturar o script para que ele execute ssh várias vezes (isso aumentará a sobrecarga de ssh , mas você poderá reduzir a maior parte dele usando ControlPersist no arquivo ssh config) .

Então, você vai acabar 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 ao seu caso de uso bem:)

Meus dois centavos sobre o script em si:

  • Ansible ou uma das outras ferramentas de gerenciamento de configuração é provavelmente mais adequado para essa tarefa em vez de escrever scripts bash
  • O uso de senhas SSH em vez de chave auth é ruim do ponto de vista de segurança. Mas eu estive em situações em que é impossível implementar isso por causa da política da empresa / material embutido antigo que não suporta isso / etc.
  • Em vez de usar o antigo boilerplate ps aux | grep -v grep | grep something , você pode usar pgrep e pkill . Eles estão no padrão coreutils , então, a menos que você use sistemas realmente antigos, eles devem estar disponíveis neles
por 29.05.2018 / 19:12