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?
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
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
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
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