Unten ist das Skript.
Ich wollte mehrere Server anmelden und nach der Kernelversion suchen.
#!/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
Ich würde eine Ausgabe erwarten, die wie folgt geht.
server1_hostname
kernel_version
server2_hostname
kernel_version
und so weiter..
Ich habe dieses Skript mit ungefähr 80 Servern in server.txt ausgeführt
Und die Ausgabe, die ich bekam, war wie .....
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.
Hier habe ich nur für 1 Host ausgegeben, xxxxdev01
und das kommt auch mit dem SSH-Banner und anderen Warnungen.
Ich brauche die Ausgabe aller anderen Hosts und ohne SSH-Banner. Was läuft hier falsch?
bash
shell-script
ssh
Gokul sein
quelle
quelle
sshpass -p password root@server histname
?ssh -t -t root@
..., um ein Pseudo-Terminal zu erzwingen.Antworten:
Ich kann Ihnen nicht sagen, warum Sie nicht die erwartete Ausgabe von den Befehlen
hostname
und erhaltenuname
, aber ich kann Ihnen mit dem fremden Text helfen.Die "Pseudo-Terminal" -Zeilen werden gedruckt,
ssh
weil standardmäßig versucht wird, eine TTY zuzuweisen, wenn in der Befehlszeile kein auszuführender Befehl angegeben wurde. Sie können diese Meldung vermeiden, indem Sie dem Befehl ssh "-T" hinzufügen:Die Zeile "Warnung: Kein Zugriff auf tty" kommt von der Shell auf dem Remote-System.
csh
undtcsh
druckt diese Nachricht unter bestimmten Umständen. Es ist möglich, dass es durch etwas in der.cshrc
oder einer ähnlichen Datei auf dem Remote-System ausgelöst wird , das versucht, auf eine Funktion zuzugreifen, für die ein TTY erforderlich ist.quelle
Verwenden Sie den folgenden Code:
quelle
Wenn Ihre Hosts wie folgt gespeichert sind
server.txt
Du kannst
quelle
Das stdin ist für Ihre Remote-Befehle nicht zugänglich. Was Sie tun können, ist das "-s" -Flag von bash zu verwenden, um Befehle aus dem stdin zu lesen:
Aus dem Bash-Handbuch:
Das sollte also tun, was Sie wollen:
Siehe auch: /programming/305035/how-to-use-ssh-to-run-shell-script-on-a-remote-machine
quelle
Das funktioniert gut für mich:
Beachten Sie, dass Sie
-t -t
anstelle von verwenden-T
, um den Fehler zu vermeidenquelle
Ich denke, die SSH in der Zwischenzeit frisst den Rest auf, um zu stdin. Weitere Informationen finden Sie in den Bash- FAQ 89 . Mit einem FileDescriptor sollten die folgenden Codes Ihren Erwartungen entsprechen.
quelle