11

各シリアル回線に接続されているデバイスをすばやく判別できるように、48 ポートのコンソール サーバーにログインできるスクリプトを作成しようとしています。

基本的に、ホスト/ポートのリストを指定して、リストの最初のデバイスに telnet し、ログインしてデバイスを確認できるように対話モードのままにするスクリプトを作成できるようにしたいと考えています。 telnet セッション、リスト内の次のセッションに接続します。

私が直面している問題は、実行可能な bash スクリプト内から telnet セッションを開始すると、セッションが入力を待たずにすぐに終了することです。

たとえば、次のコードがあるとします。

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

while read line
do
        telnet $line
done
$

コマンド 'echo "hostname" | 次の出力が表示されます。

$ 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セッションが自動的に閉じられるのを止める方法を知っている人はいますか?

4

9 に答える 9

7

telnetターミナル入力をプロセスにリダイレクトする必要があります。これはである必要があります/dev/tty。したがって、スクリプトは次のようになります。

#!/bin/bash

for HOST in `cat`
do
  echo Connecting to $HOST...
  telnet $HOST </dev/tty
done
于 2008-09-19T10:41:43.730 に答える
5

期待するプログラムを見るべきだと思います。最新のすべての 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"

spawnコマンドは、リモート ログイン プログラム (telnet、ssh、netcat など) を開始します。

expextコマンドは、リモート セッションから何かを期待するために使用されていました... うーん..

send - コマンドの送信

send_user - コメントを標準出力に出力する

于 2008-09-19T10:07:53.250 に答える
1

ありがとうデイブ-私が行方不明だったのは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
于 2008-09-19T14:12:24.680 に答える
1

シェル スクリプトを使用したサーバーへの Telnet の例:

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 
于 2009-11-02T12:43:30.163 に答える
0

@muz ssh を使用した設定で telnet を使用していないため、問題が telnet に関連しているかどうかをテストすることはできませんが、次のスクリプトを実行すると、パスワードを要求するさまざまなマシンに連続してログが記録されます。

for i in adele betty
do
ssh all@$i
done
于 2008-09-19T13:30:33.673 に答える
0

あなたの例の問題は、スクリプトの入力 (および間接的にtelnet) を の出力にリンクすることですechoechoそのため、完了して開始した後はtelnet、読み取る入力はもうありません。簡単な修正は、に置き換えるecho "testhost"こと{ echo "testhost"; cat; }です。

編集:telnetパイプから入力を受け取るのが好きではないようです。ただし、netcatこの場合は適切であり、おそらく適切です。

于 2008-09-19T10:11:40.260 に答える
0

おそらく、bash -i を試して、セッションを強制的に対話モードにすることができます。

于 2008-09-19T09:58:35.283 に答える
0

環境が X11 ベースの場合、telnet を実行している xterm を開くことができます。

xterm -e telnet $host $port

xterm での操作は対話型であり、シェル スクリプトは xterm が終了するまで停止します。

于 2009-11-02T12:56:37.650 に答える
0

これらのリンクを試してください。

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

于 2011-09-15T06:36:42.523 に答える