문제

각 직렬 회선에 어떤 장치가 연결되어 있는지 빠르게 확인할 수 있도록 콘솔 서버 48개 포트에 로그인할 수 있는 스크립트를 작성하려고 합니다.

본질적으로 나는 호스트/포트 목록이 주어지면 목록의 첫 번째 장치에 텔넷을 연결하고 대화형 모드로 전환하여 로그인하고 장치를 확인한 다음 장치를 닫을 수 있는 스크립트를 갖고 싶습니다. 텔넷 세션은 목록의 다음 세션에 연결됩니다.

내가 직면한 문제는 실행 가능한 bash 스크립트 내에서 텔넷 세션을 시작하면 세션이 입력을 기다리지 않고 즉시 종료된다는 것입니다.

예를 들어, 다음 코드가 제공됩니다.

$ cat ./telnetTest.sh
#!/bin/bash

while read line
do
        telnet $line
done
$

'echo "hostname"명령을 실행할 때 | testscript.sh '다음 출력을받습니다.

$ echo "testhost" | ./telnetTest.sh
Trying 192.168.1.1...
Connected to testhost (192.168.1.1).
Escape character is '^]'.
Connection closed by foreign host.
$

텔넷 세션이 자동으로 닫히는 것을 중지하는 방법을 아는 사람이 있습니까?

도움이 되었습니까?

해결책

터미널 입력을 다음으로 리디렉션해야 합니다. telnet 프로세스.이것은 /dev/tty.따라서 스크립트는 다음과 같습니다.

#!/bin/bash

for HOST in `cat`
do
  echo Connecting to $HOST...
  telnet $HOST </dev/tty
done

다른 팁

살펴보시면 될 것 같아요 예상하다 프로그램.모든 최신 Linux 배포판에 존재합니다.다음은 몇 가지 예시 스크립트입니다.

#!/usr/bin/expect -f
spawn telnet $host_name
expect {
   "T0>"                {}
   -re "Connection refused|No route to host|Invalid argument|lookup failure"
                        {send_user "\r******* connection error, bye.\n";exit}
   default              {send_user "\r******* connection error (telnet timeout),
 bye.\n";exit}
}
send "command\n"
expect -timeout 1 "something"

명령은 원격 로그인 프로그램(telnet, ssh, netcat 등)을 시작합니다.

확장 명령은 ...흠..원격 세션에서 뭔가를 기대합니다

보내다 - 명령을 보내는 중

send_user - stdout에 주석을 인쇄하려면

Dave에게 감사드립니다. 제가 놓친 것은 TTY 리디렉션이었습니다.

관심 있는 분들을 위해 제가 사용한 완전한 솔루션은 다음과 같습니다.

#!/bin/bash

TTY=`tty` # Find out what tty we have been invoked from.
for i in `cat hostnames.csv` # List of hosts/ports
do
        # Separate port/host into separate variables
        host=`echo $i | awk -F, '{ print $1 }'`
        port=`echo $i | awk -F, '{ print $2 }'`
        telnet $host $port < $TTY # Connect to the current device
done

쉘 스크립트 예를 사용하여 서버에 텔넷 연결:

Test3.sh 파일:

#!/bin/sh

#SSG_details is file from which script will read ip adress and uname/password
#to telnet.

SSG_detail=/opt/Telnet/SSG_detail.txt

cat $SSG_detail | while read ssg_det ; do

   ssg_ip=`echo $ssg_det|awk '{print $1}'`
   ssg_user=`echo $ssg_det|awk '{print $2}'`
   ssg_pwd=`echo $ssg_det|awk '{print $3}'`


   echo " IP to telnet:" $ssg_ip
   echo " ssg_user:" $ssg_user
   echo " ssg_pwd:" $ssg_pwd

   sh /opt/Telnet/Call_Telenet.sh $ssg_ip $ssg_user $ssg_pwd 

done


exit 0

그만큼 Call_Telenet.sh 스크립트는 다음과 같습니다:

#!/bin/sh

DELAY=1 
COMM1='config t'                 #/* 1st commands to be run*/
COMM2='show run'
COMM3=''
COMM4=''
COMM5='exit'
COMM6='wr'
COMM7='ssg service-cache refresh all'
COMM8='exit'                     #/* 8th command to be run */


telnet $1 >> $logfile 2>> $logfile |&
sleep $DELAY
echo -p $2 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $3 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $4 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $5 >> $logfile 2>> $logfile
sleep $DELAY

sleep $DELAY
sleep $DELAY
sleep $DELAY
echo -p $COMM7 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $COMM8 >> $logfile 2>> $logfile
sleep $DELAY

exit 0

위 파일을 다음과 같이 실행하세요.

$> ./test3.sh 

아마도 bash -i를 시도하여 세션을 대화형 모드로 만들 수 있습니다.

귀하의 예에서 문제는 스크립트의 입력을 (그리고 간접적으로) 연결한다는 것입니다. telnet)의 출력에 echo.그래서 후에 echo 완료되었고 telnet 시작되면 더 이상 읽을 입력이 없습니다.간단한 수정은 교체하는 것입니다. echo "testhost" ~에 의해 { echo "testhost"; cat; }.

편집하다: telnet 파이프에서 입력을 받는 것을 좋아하지 않는 것 같습니다.하지만, netcat 그렇습니다. 아마도 이 경우에 적합할 것입니다.

@muz 텔넷이없는 SSH로 설정이 있으므로 문제가 Telnet과 관련이 있는지 테스트 할 수는 없지만 다음 스크립트를 실행하면 암호를 요구하는 다른 기계에 연속적으로 로그인합니다.

for i in adele betty
do
ssh all@$i
done

귀하의 환경이 X11 기반인 경우 telnet을 실행하는 xterm을 열 수 있습니다.

xterm -e telnet $host $port

xterm의 작업은 대화형이며 xterm이 종료될 때까지 쉘 스크립트가 중지됩니다.

다음 링크를 사용해 보세요.

http://planetozh.com/blog/2004/02/telnet-script/

http://www.unix.com/unix-dummies-questions-answers/193-telnet-script.html

#!/bin/sh
( echo open hostname
sleep 5
echo username
sleep 1
echo password
sleep 1
echo some more output, etc. ) | telnet

그들은 나를 위해 일했습니다 :D

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top