質問
各シリアル回線にどのデバイスが接続されているかをすぐに判断できるように、コンソール サーバーの 48 ポートにログインできるようにするスクリプトを作成しようとしています。
基本的に、ホスト/ポートのリストを指定して、リストの最初のデバイスに Telnet 接続し、対話モードのままにし、ログインしてデバイスを確認できるようにするスクリプトを作成できるようにしたいと考えています。 Telnet セッション。リスト内の次のセッションに接続します。
私が直面している問題は、実行可能な bash スクリプト内から Telnet セッションを開始すると、セッションが入力を待たずにすぐに終了してしまうことです。
たとえば、次のコードがあるとします。
$ 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 セッションが自動的に閉じられるのを止める方法を知っている人はいますか?
解決
ターミナル入力をにリダイレクトする必要があります。 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 など) を開始します。
エキスパート 以前使用していたコマンド...うーん。リモートセッションから何かを期待する
送信 - コマンドの送信
送信ユーザー - コメントを標準出力に出力します
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
シェル スクリプトを使用したサーバーへの 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
おそらく、 bash -i を試して、セッションを強制的に対話モードにすることができます。
あなたの例の問題は、スクリプトの入力を(そして間接的に)リンクしていることです。 telnet
) の出力に echo
. 。だから後 echo
完了し、 telnet
が開始されると、それ以上読み取る入力はありません。簡単な修正は交換することです echo "testhost"
による { echo "testhost"; cat; }
.
編集: telnet
パイプから入力を受け取るのが好きではないようです。しかし、 netcat
しており、おそらくこの場合に適しています。
@muz私はSSH、Telnetの設定を持っているので、あなたの問題が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