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

등등..

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 banner없이 다른 모든 호스트의 출력이 필요합니다. 여기서 무엇이 잘못 되었습니까?


서버 중 하나를 수동으로 사용하여 실행하면 어떻게됩니까 sshpass -p password root@server histname?
terdon

1
ssh -t -t root@의사 터미널을 강제 실행 하려면 ...을 사용하십시오 .
garethTheRed

답변:


11

hostnameand uname명령 에서 예상되는 결과를 얻지 못하는 이유를 알 수는 없지만 관련 없는 텍스트로 도움을 줄 수 있습니다.

"의사 터미널"행은 ssh명령 행에서 실행할 명령이 제공되지 않은 경우 기본적으로 TTY를 할당하려고하기 때문에 인쇄됩니다 . ssh 명령에 "-T"를 추가하여 해당 메시지를 피할 수 있습니다.

sshpass -p password ssh -T root@$line

"경고 : tty에 액세스 할 수 없음"행이 원격 시스템의 쉘에서 나옵니다. csh그리고 tcsh특정 상황에서 해당 메시지를 인쇄합니다. .cshrcTTY가 필요한 일부 기능에 액세스하려고 시도하여 원격 시스템의 유사한 파일에있는 무언가에 의해 트리거되었을 수 있습니다.


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

이것이 내가 먼저 시도한 것입니다. 그러나 그것은 나에게 기대되는 결과를주지 않습니다.
Gokul 되세요

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에 액세스 할 수 없습니다. bash의 "-s"플래그를 사용하여 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

다른 방법은 ssh에 / dev / null을 사용하는 것입니다. FileDescriptor는 무시해도됩니다. `줄을 읽는 동안; sshpass -p 암호를 수행하십시오 ssh root @ $ line </ dev / null << EOF .... done <server.txt`
Leon Wang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.