4909


OSXで、telnetで外部機器に接続、外部機器の制御コマンドを実行する方法についての質問です。

下記のように書いてみましたが、うまく動きませんので、どう修正すればよいでしょうか。  
なお、外部機器のログインにはユーザネームとパスワードは不要にしています。

test.sh

[code]

    #!/bin/sh
    sh /Users/hoge/Desktop/cmds.sh | telnet 192.168.1.2 5024 >> auto-telnet.log
    
[/code]

cmds.sh

[code]

    #!/bin/sh
    sleep 30; echo command
    sleep 5; echo exit
    
[/code]


CC BY-SA 3.0
2015-01-20T08:04:24.967
4899
2015-02-18T08:13:12.667
2015-02-18T08:13:12.667
7590
7590
question
macos sh
OSXで、telnetで外部機器に接続、外部機器の制御コマンドを実行するには


GNU NetCat (nc)を使うと便利です。

[code]

    sh /Users/hoge/Desktop/cmds.sh | nc 192.168.1.2 5024 >> auto-telnet.log
    
[/code]


CC BY-SA 3.0
2015-01-20T08:15:33.600
4901
2015-01-20T08:15:33.600
440
4899
answer


よくある簡単なタスクなので[`expect`](http://wiki.tcl.tk/201) コマンドで sleep しながらでもいいでしょう。

以下、順に例を挙げます。

### 練習: bash を立ち上げ `echo`

echo_in_bash.sh:

[code]

    #!/usr/bin/expect -f
    
    # Bash を起動
    spawn bash
    # プロンプト "$" を待ってコマンドを打つ
    expect "$" { send "echo Hello World\r"; }
    expect "$" { send "exit\r"; }
    # 終了
    interact
    
[/code]

### 練習: Google に telnet して ページを取得

get_google_html.sh:

[code]

    #!/usr/bin/expect -f
    set timeout 20
    set address "www.google.com"
    set port "80"
    
    # Telnet で接続
    spawn telnet $address $port
    # 一秒待つ
    sleep 1
    # ドキュメントを要求
    send "GET /\r\r";
    # 終了
    expect eof
    
[/code]

### 実践: 質問にあわせたスクリプトの例

質問の要件では、以下のような感じになるでしょう。待ちプロンプト等は環境に合わせてください。

[code]

    #!/usr/bin/expect -f
    set timeout 20
    set address "my_machine_ip"
    set port "23"
    
    spawn telnet $address $port
    expect "$" { sleep 30; send "command\r"; }
    expect "$" { sleep 5; send "exit\r"; }
    expect eof
    
[/code]


CC BY-SA 3.0
2015-01-20T11:39:56.297
4909
2015-01-20T11:39:56.297
4978
4899
answer