
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.txt
e hostname >> /agentnotthere.txt
arquivos . 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 >> filename
na máquina remota.
Como posso fazer com que meu script, que usa ssh
para 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 ssh
várias vezes (isso aumentará a ssh
sobrecarga, mas você pode atenuar a maior parte usando ControlPersist
o ssh
arquivo 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 something
modelo antigo, você pode usarpgrep
epkill
. Eles estão no padrãocoreutils
, então, a menos que você use sistemas realmente antigos, eles devem estar disponíveis neles