Ниже приведен сценарий.
Я хотел войти на несколько серверов и проверить версию ядра.
#!/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.
Здесь я получил вывод только для 1 хоста, который xxxxdev01
также поставляется с баннером ssh и другим предупреждением.
Мне нужен вывод всех других хостов и без ssh-баннера .. Что здесь не так?
bash
shell-script
ssh
Быть Гокулом
источник
источник
sshpass -p password root@server histname
?ssh -t -t root@
..., чтобы вызвать псевдо-терминал.Ответы:
Я не могу сказать вам , почему вы не получаете ожидаемый результат от
hostname
иuname
команд, но я могу помочь постороннему тексту.Строки «псевдотерминала» печатаются,
ssh
потому что он пытается выделить TTY по умолчанию, когда в командной строке не было предоставлено ни одной команды для выполнения. Вы можете избежать этого сообщения, добавив «-T» к команде ssh:Строка «Предупреждение: нет доступа к tty» поступает из оболочки удаленной системы.
csh
иtcsh
напечатает это сообщение при определенных обстоятельствах. Возможно, это вызвано чем-то в этом.cshrc
или аналогичном файле на удаленной системе, пытаясь получить доступ к некоторой функции, которая требует TTY.источник
Используйте следующий код,
источник
Если ваши хосты хранятся в следующем порядке
server.txt
Вы можете
источник
Stdin не доступен для ваших удаленных команд. Что вы можете сделать, это использовать флаг "-s" bash для чтения команд из stdin:
Из руководства по bash:
Так что это должно делать то, что вы хотите:
Смотрите также: /programming/305035/how-to-use-ssh-to-run-shell-script-on-a-remote-machine
источник
Это прекрасно работает для меня:
обратите внимание, что используйте
-t -t
вместо того,-T
чтобы избежать ошибкиисточник
Я полагаю, что SSH в то же время съесть все остальное в stdin. Вы можете обратиться к Bash FAQ 89 за подробностями. С FileDescriptor следующие коды должны работать как вы ожидаете.
источник