아래는 스크립트입니다.
여러 서버에 로그인하여 커널 버전을 확인하고 싶습니다.
#!/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
등..
나는 server.txt에 있는 약 80개의 서버에서 이 스크립트를 실행했습니다.
내가 얻는 결과는 다음과 같습니다 ...
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 배너는 필요하지 않습니다. 여기서 무슨 문제가 있습니까?
답변1
hostname
및 명령 에서 예상한 출력을 얻지 못하는 이유를 설명할 수는 없지만 uname
관련 없는 텍스트에 대해서는 도움을 드릴 수 있습니다.
ssh
실행할 명령이 명령줄에 제공되지 않을 때 기본적으로 TTY 할당을 시도하기 때문에 "의사 터미널" 줄이 인쇄됩니다 . ssh 명령에 "-T"를 추가하면 이 메시지를 방지할 수 있습니다.
sshpass -p password ssh -T root@$line
"경고: tty에 액세스할 수 없습니다" 줄은 원격 시스템의 셸에서 나옵니다. 어떤 경우에는 메시지를 인쇄합니다 csh
. TTY가 필요한 일부 기능에 액세스하려고 시도하면서 tcsh
원격 시스템의 파일 또는 유사한 파일에 있는 항목에 의해 트리거될 수 있습니다 ..cshrc
답변2
다음 코드를 사용하십시오.
#!/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
답변3
호스트가 다음을 저장하는 경우server.txt
host1.tld
host2.tld
....
당신은 할 수
mapfile -t myhosts < server.txt; for host in "${myhosts[@]}"; do ssh username@"$host" 'hostname;uname -r'; done
답변4
이것은 나에게 효과적입니다.
# 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이 터미널이 아니기 때문에 의사 터미널이 할당되지 않습니다.