Ssh para uma caixa, execute um comando, envie os dados para um arquivo e, em seguida, passe para o próximo endereço IP [duplicado]

3

Eu quero executar um script do meu servidor Jump, tê-lo em um servidor SSH, em seguida, executar um comando (como rm <file> , top ou ls -lsa ), em seguida, levar essa saída e colocá-lo em um arquivo no meu servidor Jump, em seguida, passar para o próximo IP na lista.

Eu gostaria de poder fornecer ao script uma lista de endereços IP e executá-lo em todos eles.

Até agora eu tenho

ssh <IP> 'find ./<Path> -mtime +15 -exec rm <filename> {} \;' > <filename>

Mas tudo isso é ssh para a caixa, execute o comando e liste as informações. Eu preciso disso para executar o comando, saída de dados para um arquivo no meu servidor de salto e, em seguida, passar para a próxima caixa.

Alguma sugestão?

    
por Dolyak 06.06.2013 / 21:56

1 resposta

2

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

  1. 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).
  2. 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
  3. O caminho do arquivo de saída é o subdiretório desse host, o registro de data e hora atual e o ".log".
  4. O subdiretório é criado se ainda não existir (o script imprime o host e é abortado se isso falhar).
  5. 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.
por 06.06.2013 / 22:10