web-dev-qa-db-fra.com

Script à ssh et exécuter une commande ne fonctionne pas

Vous trouverez ci-dessous le script.

Je voulais vous connecter à plusieurs serveurs et vérifier la version du noyau.

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

Je m'attendrais à une sortie qui va comme ..

server1_hostname
kernel_version
server2_hostname
kernel_version

etc..

J'ai rencontré ce script avec environ 80 serveurs dans Server.txt

Et la sortie que j'ai eu était comme .....

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.

Ici, j'ai reçu une sortie pour seulement 1 hôte, qui est xxxxdev01 Et cela aussi vient avec la bannière SSH et l'autre avertissement.

J'ai besoin de la sortie de tous les autres hôtes et sans bannière SSH .. Qu'est-ce qui ne va pas ici?

10
Being Gokul

Le STDIN n'est pas accessible à vos commandes distantes. Ce que vous pouvez faire est d'utiliser le drapeau "-s" de bash pour lire des commandes de STDIN:

Du manuel 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.

Cela devrait donc faire ce que vous voulez:

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

Voir aussi: https://stackoverflow.com/questions/305035/how-to-utuse-ssh-to-run-shell-script-on-a-remote-machine

1
nimai

Cela fonctionne bien pour moi:

 # 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

notez que l'utilisation -t -t à la place de -T Pour éviter l'erreur

Pseudo-terminal ne sera pas alloué car STDIN n'est pas un terminal

1
Valiant Jiang

Si vos hôtes sont stockés comme suit server.txt

Host1.tld
Host2.tld
....

Vous pouvez

mapfile -t myhosts < server.txt; for Host in "${myhosts[@]}"; do ssh username@"$Host" 'hostname;uname -r'; done
1
Valentin Bajrami

Je suppose que le SSH dans le moment mangez le reste à Stdin. Vous pouvez renvoyer le Bash FAQ 89 pour plus de détails. Avec un fichier FileDeScriptor, les codes suivants doivent fonctionner comme vos attentes.

while read line <& 7
do
sshpass -p password ssh root@$line << EOF
hostname
uname -r
EOF
done 7< server.txt
0
Leon Wang