Script para ssh e executar um comando não funciona

9

Abaixo está o script.

Eu queria entrar em vários servidores e verificar a versão do kernel.

#!/bin/bash
#input server names line by line in server.txt
cat server.txt | while read line
do
sshpass -p password ssh root@$line << EOF
hostname
uname -r
EOF
done

Espero que a saída seja como ..

server1_hostname
kernel_version
server2_hostname
kernel_version

e assim por diante.

Eu executei este script com cerca de 80 servidores no server.txt

E a saída que recebi foi como .....

Pseudo-terminal will not be allocated because stdin is not a terminal. 
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.

========================================================================
================================ WARNING ===============================
========================================================================
This system is solely for the use of authorized personnel. Individuals
using this system are subject to having some or all of their activities
monitored and recorded. Anyone using this system expressly consents to
such monitoring and is advised that any unauthorized or improper use of
this system may result in disciplinary action up to and including
termination of employment. Violators may also be subject to civil and/or
criminal penalties.
========================================================================

Warning: no access to tty (Bad file descriptor).
Thus no job control in this shell.
xxxxdev01
2.6.32-431.23.3.el6.x86_64
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.

Aqui eu tenho saída para apenas 1 host, que é xxxxdev01 e também vem com o banner ssh e outro aviso.

Eu preciso da saída de todos os outros hosts e sem o banner do ssh. O que está errado aqui?

    
por Being Gokul 23.08.2014 / 13:45

6 respostas

10

Não posso dizer por que você não está obtendo a saída esperada dos comandos hostname e uname , mas posso ajudar com o texto estranho.

As linhas "Pseudo-terminal" estão sendo impressas por ssh porque ele tenta alocar um TTY por padrão quando nenhum comando a ser executado foi fornecido na linha de comando. Você pode evitar essa mensagem adicionando "-T" ao comando ssh:

sshpass -p password ssh -T root@$line

A linha "Aviso: nenhum acesso a tty" está vindo do shell no sistema remoto. csh e tcsh imprimirão essa mensagem em determinadas circunstâncias. É possível que seja acionado por algo no arquivo .cshrc ou similar no sistema remoto, tentando acessar algum recurso que requer um TTY.

    
por 24.08.2014 / 00:43
4

Use o código a seguir,

#!/bin/bash
#input server names line by line in server.txt
cat server.txt | while read line
do
  sshpass -p password ssh root@$line 'hostname;uname -r'
done
    
por 23.08.2014 / 14:39
1

Se seus hosts estiverem armazenados, siga em server.txt

host1.tld
host2.tld
....

Você pode

mapfile -t myhosts < server.txt; for host in "${myhosts[@]}"; do ssh username@"$host" 'hostname;uname -r'; done
    
por 23.08.2014 / 16:02
1

O stdin não está acessível para seus comandos remotos. O que você pode fazer é usar o sinalizador "-s" do bash para ler os comandos do stdin:

Do manual do bash:

-s        If the -s option is present, or if no arguments remain after
          option processing, then commands are read from the standard 
          input.  This option allows the positional parameters to be set
          when  invoking  an  interactive shell.

Então, isso deve fazer o que você quer:

#!/bin/bash
#input server names line by line in server.txt
cat server.txt | while read line
do
    sshpass -p password ssh root@$line bash -s << EOF
hostname
uname -r
EOF
done

Veja também: link

    
por 27.10.2015 / 12:37
0

Eu acho que o ssh no enquanto come o resto para stdin. você pode consultar o Bash FAQ 89 para detalhes. Com um FileDescriptor, os códigos a seguir devem funcionar como sua expectativa.

while read line <& 7
do
sshpass -p password ssh root@$line << EOF
hostname
uname -r
EOF
done 7< server.txt
    
por 16.12.2015 / 09:51
0

Isso funciona muito bem para mim:

 # cat hostsname.txt 
operation01  172.20.68.37 5fDviDEwew
ngx-gw01     172.20.68.36 FiPp2UpRyu
gateway01    172.20.68.35 KeMbe57zzb
vehicle01    172.20.68.34 FElJ3ArM0m
# cat hostsname.txt | while read hostname ipaddr passwd; do sshpass -p $passwd /usr/bin/ssh-copy-id $ipaddr;done

observe que use -t -t em vez de -T para evitar o erro

Pseudo-terminal will not be allocated because stdin is not a terminal

    
por 19.03.2017 / 15:59