Bashスクリプトを使用して、telnet関連のタスクの自動化に取り組んでいます。自動化されると、ユーザーとtelnetの相互作用はなくなります。 (つまり、完全に自動化されます)
スクリプトは次のようになります。
# execute some commands on the local system
# access a remote system with an IP address: 10.1.1.1 (for example)
telnet 10.1.1.1
# execute some commands on the remote system
# log all the activity (in a file) on the Local system
# exit telnet
# continue on with executing the rest of the script.
ここで私が直面している2つの問題があります:
スクリプトからリモートシステムでコマンドを実行する方法(人間の介入なし)
いくつかのテストコードでの経験から、telnet 10.1.1.1が実行されると、telnetがインタラクティブセッションに入り、スクリプト内の後続のコード行がローカルで実行されると推測できましたシステム。ローカルシステムではなくリモートシステムでコード行を実行するにはどうすればよいですか?
ローカルシステムのTelnetセッションのアクティビティのログファイルを取得できません。使用したstdoutリダイレクトは、リモートシステムでコピーを作成します(コピー操作を実行してログをローカルシステムにコピーしたくない)。この機能を実現するにはどうすればよいですか?
expect
スクリプトを記述します。
以下に例を示します。
#!/usr/bin/expect
#If it all goes pear shaped the script will timeout after 20 seconds.
set timeout 20
#First argument is assigned to the variable name
set name [lindex $argv 0]
#Second argument is assigned to the variable user
set user [lindex $argv 1]
#Third argument is assigned to the variable password
set password [lindex $argv 2]
#This spawns the telnet program and connects it to the variable name
spawn telnet $name
#The script expects login
expect "login:"
#The script sends the user variable
send "$user "
#The script expects Password
expect "Password:"
#The script sends the password variable
send "$password "
#This hands control of the keyboard over to you (Nice expect feature!)
interact
走る:
./myscript.expect name user password
Expectも使用することをお勧めしますが、非対話型の使用には通常のシェルコマンドで十分です。 Telnetはstdinでコマンドを受け入れるので、コマンドをパイプするか、それに書き込むだけです。
telnet 10.1.1.1 <<EOF
remotecommand 1
remotecommand 2
EOF
(編集:コメントから判断すると、リモートコマンドは入力を処理するのに時間がかかるか、初期のSIGHUPがtelnetによって適切に取得されません。これらの場合、入力で短いスリープを試みることができます。)
{ echo "remotecommand 1"; echo "remotecommand 2"; sleep 1; } | telnet 10.1.1.1
いずれにせよ、インタラクティブになったり何かをしたりする場合は、expect
を使用します。
Telnetは、HTTPプロトコルを学習するときによく使用されます。以前は、このスクリプトをWebスクレイパーの一部として使用していました。
echo "open www.example.com 80"
sleep 2
echo "GET /index.html HTTP/1.1"
echo "Host: www.example.com"
echo
echo
sleep 2
スクリプトの名前がget-page.shであるとしましょう:
get-page.sh | telnet
hTMLドキュメントを提供します。
それが誰かに役立つことを願っています;)
これは私のために働いた..
ユーザー名とパスワードが必要な複数のtelnetログインを自動化しようとしていました。異なるサーバーからマシンにログを保存しているため、telnetセッションはバックグラウンドで無期限に実行する必要があります。
telnet.shは、 'expect'コマンドを使用してtelnetログインを自動化します。詳細情報はこちらにあります: http://osix.net/modules/article/?id=
telnet.sh
#!/usr/bin/expect
set timeout 20
set hostName [lindex $argv 0]
set userName [lindex $argv 1]
set password [lindex $argv 2]
spawn telnet $hostName
expect "User Access Verification"
expect "Username:"
send "$userName\r"
expect "Password:"
send "$password\r";
interact
sample_script.shは、telnet.shを実行して各telnetセッションのバックグラウンドプロセスを作成するために使用されます。詳細については、コードのコメントセクションを参照してください。
sample_script.sh
#!/bin/bash
#start screen in detached mode with session-name 'default_session'
screen -dmS default_session -t screen_name
#save the generated logs in a log file 'abc.log'
screen -S default_session -p screen_name -X stuff "script -f /tmp/abc.log $(printf \\r)"
#start the telnet session and generate logs
screen -S default_session -p screen_name -X stuff "expect telnet.sh hostname username password $(printf \\r)"
以下は私のために働いています...あなたがIP_sheet.txtにtelnetしたいすべてのIPを入れてください
while true
read a
do
{
sleep 3
echo df -kh
sleep 3
echo exit
} | telnet $a
done<IP_sheet.txt
Bashの代わりにexpectスクリプトを使用できます。以下の例は、パスワードのない組み込みボードにtelnexする方法を示しています
#!/usr/bin/expect
set ip "<ip>"
spawn "/bin/bash"
send "telnet $ip\r"
expect "'^]'."
send "\r"
expect "#"
sleep 2
send "ls\r"
expect "#"
sleep 2
send -- "^]\r"
expect "telnet>"
send "quit\r"
expect eof
そのためにsshを使用します。パスワードを使用せずにキーを生成し、リモートマシンの.authorized_keysに配置します。リモートで実行するスクリプトを作成し、他のマシンにコピーしてから、sshを使用してリモートで実行します。
私はこのアプローチを何度も使用し、大きな成功を収めました。また、telnetよりもはるかに安全
#!/bin/bash
ping_count="4"
avg_max_limit="1500"
router="sagemcom-fast-2804-v2"
adress="192.168.1.1"
user="admin"
pass="admin"
VAR=$(
expect -c "
set timeout 3
spawn telnet "$adress"
expect \"Login:\"
send \"$user\n\"
expect \"Password:\"
send \"$pass\n\"
expect \"commands.\"
send \"ping ya.ru -c $ping_count\n\"
set timeout 9
expect \"transmitted\"
send \"exit\"
")
count_ping=$(echo "$VAR" | grep packets | cut -c 1)
avg_ms=$(echo "$VAR" | grep round-trip | cut -d '/' -f 4 | cut -d '.' -f 1)
echo "1_____ping___$count_ping|||____$avg_ms"
echo "$VAR"
Bash Shell/expectでtelnetを使用する方法は次のとおりです。
#!/usr/bin/expect
# just do a chmod 755 one the script
# ./YOUR_SCRIPT_NAME.sh $YOUHOST $PORT
# if you get "Escape character is '^]'" as the output it means got connected otherwise it has failed
set ip [lindex $argv 0]
set port [lindex $argv 1]
set timeout 5
spawn telnet $ip $port
expect "'^]'."