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
Eu esperaria uma saída que é como ..
server1_hostname
kernel_version
server2_hostname
kernel_version
e assim por diante..
Eu executei esse script com cerca de 80 servidores no server.txt
E a saída que obtive 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 obtive saída para apenas 1 host, o que é xxxxdev01
e também vem com o banner ssh e outros avisos.
Preciso de saída de todos os outros hosts e sem banner ssh .. O que está errado aqui?
bash
shell-script
ssh
Sendo Gokul
fonte
fonte
sshpass -p password root@server histname
?ssh -t -t root@
... para forçar um pseudo-terminal.Respostas:
Não sei dizer por que você não está obtendo a saída esperada dos comandos
hostname
euname
, mas posso ajudar com o texto estranho.As linhas "Pseudo-terminal" estão sendo impressas
ssh
porque tentam 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:A linha "Warning: no access to tty" vem do shell no sistema remoto.
csh
etcsh
imprimirá essa mensagem sob certas circunstâncias. É possível que tenha sido acionado por algo no.cshrc
arquivo ou similar no sistema remoto, tentando acessar algum recurso que requer um TTY.fonte
Use o seguinte código,
fonte
Se seus hosts estiverem armazenados da seguinte maneira
server.txt
Você pode
fonte
O stdin não está acessível aos seus comandos remotos. O que você pode fazer é usar o sinalizador "-s" do bash para ler comandos do stdin:
No manual do bash:
Portanto, isso deve fazer o que você deseja:
Consulte também: /programming/305035/how-to-use-ssh-to-run-shell-script-on-a-remote-machine
fonte
Isso funciona muito bem para mim:
note que use em
-t -t
vez de-T
para evitar o errofonte
Eu acho que o ssh enquanto come o resto para stdin. você pode consultar a FAQ do Bash 89 para obter detalhes. Com um FileDescriptor, os seguintes códigos devem funcionar como sua expectativa.
fonte