#! /bin/bash
cd /path/to/ssh_logs || exit 1
for targethost in a b c; do
log_file="${targethost}/$(date --iso-8601=seconds).log"
mkdir -p "${targethost}" || { echo "Error: ${targethost}";exit 1; }
{ ssh batchuser@"${targethost}" "$command"; rc=$?;
echo $'\n'"finished (with exit code ${rc}): $(date --iso-8601=seconds)";
} >"$log_file" 2>&1
done
Editar 1:
Alguma explicação é necessária (eu também alterei detalhes do script):
- Em um diretório -
/path/to/ssh_logs
neste exemplo - um subdiretório para cada host de destino é criado no qual os arquivos de saída são colocados. Uma alternativa é colocar todos os arquivos no mesmo diretório e tornar a parte do host do nome do arquivo. Isso é mais uma questão de gosto (para quantidades razoáveis de arquivos). Assim, o primeiro passo é tentar mudar para este diretório (e abortar se isso falhar). -
for targethost in a b c; do ... ; done
é o loop sobre os hosts. No exemplo, os nomes de host são codificados no script. Alternativamente, você poderia escrevê-los em um arquivo de texto, um por linha ou separado por espaço, e obter os nomes no script desta maneira:for targethost in $(<targethosts.txt); do
- O caminho do arquivo de saída é o subdiretório desse host, o registro de data e hora atual e o ".log".
- O subdiretório é criado se ainda não existir (o script imprime o host e é abortado se isso falhar).
- A saída de dois comandos é redirecionada para o arquivo: A chamada ssh em si e - se você quiser - o timestamp (incluindo o código de saída do ssh) imediatamente após o ssh terminar, para que você possa ver do log quanto tempo demorou. Depois que o stdout dos comandos foi redirecionado para o arquivo, stderr é redirecionado para stdout para que as mensagens cheguem ao arquivo também.