A continuación se muestra el guión.
Quería iniciar sesión en varios servidores y verificar la versión del 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
Esperaría una salida que va como ...
server1_hostname
kernel_version
server2_hostname
kernel_version
y así..
Ejecuté este script con unos 80 servidores en server.txt
Y la salida que obtuve fue 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.
Aquí obtuve salida para solo 1 host, que es xxxxdev01
y eso también viene con el banner ssh y otra advertencia.
Necesito la salida de todos los demás hosts y sin banner ssh. ¿Qué está mal aquí?
bash
shell-script
ssh
Ser gokul
fuente
fuente
sshpass -p password root@server histname
?ssh -t -t root@
... para forzar un pseudo-terminal.Respuestas:
No puedo decirte por qué no obtienes el resultado esperado de los comandos
hostname
yuname
, pero puedo ayudarte con el texto extraño.Las líneas "Pseudo-terminal" están siendo impresas por
ssh
porque intenta asignar un TTY de forma predeterminada cuando no se proporcionó ningún comando para ejecutar en la línea de comando. Puede evitar ese mensaje agregando "-T" al comando ssh:La línea "Advertencia: sin acceso a tty" proviene del shell en el sistema remoto.
csh
etcsh
imprimirá ese mensaje bajo ciertas circunstancias. Es posible que se active por algo en el.cshrc
archivo o similar en el sistema remoto, intentando acceder a alguna función que requiere un TTY.fuente
Usa el siguiente código,
fuente
Si sus hosts se almacenan de la siguiente manera en
server.txt
Usted puede
fuente
El stdin no es accesible para sus comandos remotos. Lo que puede hacer es usar el indicador "-s" de bash para leer los comandos del stdin:
Del manual bash:
Entonces esto debería hacer lo que quieras:
Ver también: /programming/305035/how-to-use-ssh-to-run-shell-script-on-a-remote-machine
fuente
Esto funciona muy bien para mí:
tenga en cuenta que use en
-t -t
lugar de-T
para evitar el errorfuente
Supongo que el ssh en el tiempo se come el resto para stdin. puede consultar las preguntas frecuentes 89 de Bash para obtener más detalles. Con un FileDescriptor, los siguientes códigos deberían funcionar según sus expectativas.
fuente