ssh para vários hosts e sudo vários comandos

2

Eu preciso fazer um loop e ssh para vários hosts e executar uma série de comandos em cada um deles.

algo como:

for i in $(jot -w '%02.0f' 14 1)
>do ssh user@host$i sudo -i "command1; command2; command3"
>done

mas não consigo que funcione corretamente. Já vi várias coisas no Google como sudo sh -c , piping to sudo, etc, mas não consigo descobrir.

  • Estou ssh'ing como um usuário comum que pode sudo sem senha (ssh como root não habilitado)
  • command1 não retornando 0 não deve impedir que o comando2 seja executado, etc, portanto ;
  • Estou executando o loop de um mac, por isso jot -w , que é aproximadamente equivalente a seq -f no linux
  • ssh'ing para o CentOS 5.4
  • Eu gostaria que ele fosse executado com $ PATH do root, então eu não tenho que especificar o caminho completo para os comandos, mas não é totalmente necessário

obrigado antecipadamente!

    
por carillonator 17.11.2010 / 22:39

5 respostas

6

Acho que acertar as citações é muito chato. Em vez disso, tenho a tendência de apenas passar comandos para bater no host remoto através de um pipe. Dessa forma, você não precisa se preocupar em obter o escape na linha de comando do ssh. Basta passar para o canal exatamente o que você digitaria se estivesse conectado de forma interativa.

CMDS="sudo bash -c '/usr/bin/id; /usr/bin/id; '/usr/bin/id"
for i in 0 1; do
  echo $CMDS | ssh -t host$i bash
done

Que retorna

uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)
    
por 17.11.2010 / 23:08
6

Tentar passar strings de comando entre aspas por ssh é sempre um desafio. Você não menciona o tipo de mensagem de erro que está recebendo, mas eis alguns pensamentos:

A configuração sudo padrão em muitos sistemas requer que sua sessão tenha um TTY válido associado a ela. Isto requer ou (a) chamar o ssh com a opção "-t", ou (b) remover a opção "requiretty" da sua configuração do sudo.

Isso funciona para mim (o destino é um conjunto de sistemas RHEL5):

for i in 0 1; do
  ssh -t host$i sudo -i "echo one; echo two; echo 'three four'"
done

Isso resulta em:

one
two
three four
Connection to host0 closed.
one
two
three four
Connection to host1 closed.

Há diversas ferramentas que facilitarão sua vida se você fizer esse tipo de coisa com frequência:

E assim por diante. Eu costumo usar scripts de shell, eu mesmo.

    
por 17.11.2010 / 22:49
1

Acho que o pssh é o que você precisa para trabalhar.

    
por 17.11.2010 / 22:49
0

link

Este é um vencedor claro: D

    
por 17.11.2010 / 22:48
0

Dê uma olhada no BatchLogin:

link

BatchLogin is a free software (GPL) licensed tool that allows you to manage connections to servers in serial format across diverse environments. It has its limitations, but for the most part, any script or data file can be automatically transferred and executed across a multiple server environment, regardless of the complexity of the "zone" (I.E.: iDMZ, DMZ, etc). It does this in a way that shell scripts and access to servers can easily be managed on a "per admin" basis.

    
por 18.11.2010 / 03:15