Poniżej znajduje się skrypt.
Chciałem zalogować się do kilku serwerów i sprawdzić wersję jądra.
#!/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
Oczekiwałbym produkcji, która idzie jak ...
server1_hostname
kernel_version
server2_hostname
kernel_version
i tak dalej..
Uruchomiłem ten skrypt z około 80 serwerami w server.txt
A wynik, który uzyskałem, był jak .....
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.
Tutaj otrzymałem dane wyjściowe tylko dla 1 hosta, który również jest xxxxdev01
dostarczany z banerem ssh i innym ostrzeżeniem.
Potrzebuję danych wyjściowych wszystkich innych hostów i bez bannera ssh. Co się tutaj dzieje?
bash
shell-script
ssh
Będąc Gokul
źródło
źródło
sshpass -p password root@server histname
?ssh -t -t root@
..., aby wymusić pseudoterminal.Odpowiedzi:
Nie mogę ci powiedzieć, dlaczego nie otrzymujesz oczekiwanych danych wyjściowych z poleceń
hostname
iuname
, ale mogę pomóc z obcym tekstem.Linie „pseudo-terminalu” są drukowane,
ssh
ponieważ próbuje domyślnie przydzielić TTY, gdy w wierszu poleceń nie podano żadnego polecenia do wykonania. Możesz uniknąć tej wiadomości, dodając „-T” do polecenia ssh:Linia „Ostrzeżenie: brak dostępu do tty” pochodzi z powłoki w systemie zdalnym.
csh
itcsh
wydrukuje tę wiadomość w określonych okolicznościach. Możliwe, że jest on wyzwalany przez coś w tym.cshrc
lub podobnym pliku w systemie zdalnym, próbując uzyskać dostęp do funkcji wymagającej TTY.źródło
Użyj następującego kodu,
źródło
Jeśli Twoje hosty są przechowywane w następujący sposób
server.txt
Możesz
źródło
Stdin nie jest dostępny dla twoich zdalnych poleceń. Możesz użyć flagi „-s” bash do odczytu poleceń ze standardowego wejścia:
Z podręcznika bash:
To powinno zrobić, co chcesz:
Zobacz także: /programming/305035/how-to-use-ssh-to-run-shell-script-on-a-remote-machine
źródło
Działa to dla mnie świetnie:
Uwaga: użyj
-t -t
zamiast,-T
aby uniknąć błęduźródło
Wydaje mi się, że ssh w międzyczasie zjadam resztę na standardowe wyjście. szczegółowe informacje można znaleźć w FAQ Bash 89 . W przypadku FileDescriptor następujące kody powinny działać zgodnie z oczekiwaniami.
źródło