web-dev-qa-db-ja.com

bashスクリプトを使用してtelnetセッションを自動化する

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つの問題があります:

  1. スクリプトからリモートシステムでコマンドを実行する方法(人間の介入なし)

    いくつかのテストコードでの経験から、telnet 10.1.1.1が実行されると、telnetがインタラクティブセッションに入り、スクリプト内の後続のコード行がローカルで実行されると推測できましたシステム。ローカルシステムではなくリモートシステムでコード行を実行するにはどうすればよいですか?

  2. ローカルシステムのTelnetセッションのアクティビティのログファイルを取得できません。使用したstdoutリダイレクトは、リモートシステムでコピーを作成します(コピー操作を実行してログをローカルシステムにコピーしたくない)。この機能を実現するにはどうすればよいですか?

73
khan

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
72
joemooney

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を使用します。

75
thiton

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ドキュメントを提供します。

それが誰かに役立つことを願っています;)

41
biera

これは私のために働いた..

ユーザー名とパスワードが必要な複数の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)"
  1. コマンド 'screen -ls'を使用して、バックグラウンドで実行中の画面がないことを確認します。
  2. http://www.gnu.org/software/screen/manual/screen.html#Stuff を読んで、画面とそのオプションの詳細を読んでください。
  3. sample_script.shの「-p」オプションは特定のウィンドウを事前選択して再接続し、「-X」オプションを介してコマンドを送信します。そうしないと、「No screen session found」エラーが表示されます。
10
Nikhil

以下は私のために働いています...あなたが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
2

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
2
A R

そのためにsshを使用します。パスワードを使用せずにキーを生成し、リモートマシンの.authorized_keysに配置します。リモートで実行するスクリプトを作成し、他のマシンにコピーしてから、sshを使用してリモートで実行します。

私はこのアプローチを何度も使用し、大きな成功を収めました。また、telnetよりもはるかに安全

1
TMS
#!/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"
1
shaman888

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 "'^]'."
0
grepit