Сценарій до ssh та запуск команди не працює


10

Нижче - сценарій.

Я хотів увійти в декілька серверів і перевірити наявність ядра.

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

Я б очікував, що вихід буде такий, як ..

server1_hostname
kernel_version
server2_hostname
kernel_version

і так далі..

Я запустив цей сценарій із близько 80 серверів у server.txt

І вихід, який я отримав, був як .....

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.

Тут я отримав вихід лише для одного хоста, який є, xxxxdev01і це теж постачається з банером ssh та іншими попередженнями.

Мені потрібен вихід усіх інших хостів і без ssh банера. Що тут не так?


Що станеться, якщо ви користуєтесь одним із серверів вручну та запустите sshpass -p password root@server histname?
terdon

1
Використовуйте ssh -t -t root@..., щоб примусити псевдотермінал.
garethTheRed

Відповіді:


11

Я не можу сказати, чому ви не отримуєте очікуваного результату від команд hostnameта unameкоманд, але я можу допомогти із стороннім текстом.

Рядки "Псевдотермінал" друкуються через те, sshщо він намагається виділити TTY за замовчуванням, коли в командному рядку не було передбачено виконання команди. Ви можете уникнути цього повідомлення, додавши "-T" до команди ssh:

sshpass -p password ssh -T root@$line

Рядок "Попередження: доступ до tty" не надходить із оболонки на віддаленій системі. cshі tcshнадрукує це повідомлення за певних обставин. Цілком можливо, що він запускається чимось у .cshrcподібному файлі або подібному файлі на віддаленій системі, намагаючись отримати доступ до якоїсь функції, яка вимагає TTY.


4

Використовуйте наступний код,

#!/bin/bash
#input server names line by line in server.txt
cat server.txt | while read line
do
  sshpass -p password ssh root@$line 'hostname;uname -r'
done

Це те, що я спробував спочатку. Але це не дає мені очікуваного результату.
Бути Гокулем

1

Якщо ваші хости зберігаються, як описано нижче server.txt

host1.tld
host2.tld
....

Ти можеш

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

1

Stdin недоступний для віддалених команд. Що ви можете зробити, це використовувати прапор "-s" bash для читання команд з stdin:

З посібника з 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.

Отже, це потрібно робити те, що ви хочете:

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

Дивіться також: /programming/305035/how-to-use-ssh-to-run-shell-script-on-a-remote-machine


1

Це для мене чудово:

 # 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

зауважте, що використовуйте -t -tзамість цього, -Tщоб уникнути помилки

Псевдотермінал не буде виділено, оскільки stdin не є терміналом


1
Вам слід прочитати про форматування. Ваша відповідь може бути чудовою, але зараз вона майже не читається.
roaima

0

Я здогадуюсь ssh в той час, як з'їдають решту до stdin. ви можете ознайомитись з Bash FAQ 89 для деталей. З FileDescriptor наступні коди повинні працювати як ваше очікування.

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

альтернативний спосіб - використовувати / dev / null для ssh. FileDescriptor можна ігнорувати. `під час читання рядка; зробити sshpass -p пароль ssh root @ $ line </ dev / null << EOF .... зроблено <server.txt`
Леон Ван
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.