4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Telnetでもリモートコマンド実行がしたい!

Posted at

sshは遠隔でコマンドを叩けて良いなぁ、Telnetでも出来ないかなぁと思ってたんですが、expectコマンドで実装できたので上げてみます。
※動作環境はUbuntu16.04ですが、expectコマンドがあればUbuntuでもCentosでもMacでも動くハズ。

# こんな感じでコマンドを投げたい
ssh ubuntu@192.168.10.1 ls

expect

シェル上で対話的な処理を自動化できるコマンドです。
基本的にはexpectでシェル上の文字列の出現を待ち、sendコマンドで文字列(コマンドなど)を送ります。
中身はシェルのコマンドではなく、TCLスクリプトです。

expectスクリプトとして書くか、シェルスクリプトの中に書くことも出来ます。

  • expect
#!/usr/bin/expect
# TCLの空間
  • Bash
#!/bin/bash
expect -c "
# TCLの空間
"

expect導入

Telnetで遠隔コマンド実行をするスクリプトを動かすにはexpectコマンドが必要なので入れましょう。
大抵の場合最初から入っている気がしますが、

sudo apt install -y expect

Ubuntu16ならこれで入ります。(MacやCentosにもあります。)

expectで自動Telnet & 遠隔コマンド実行君

様々なログインパターン(ユーザー名・パスワードの有無、プロンプト)に対応したので、大抵の機器にはログインできると思います。(ログイン後enableが必要だったりすると上手くいかないかもですが。。。)

#!/usr/bin/expect -f

# telnetpass.exp
# usage = ./telnetpass.exp 172.24.0.1 loginid loginpass

set RemoteHost [lindex $argv 0]
set UserName [lindex $argv 1]
set PW [lindex $argv 2]
set Prompt "\[#$%<>\]"

set timeout 30
spawn telnet ${RemoteHost}
expect -re "\[Uu\]sername|\[Ll\]ogin" {

  ### With Username
  send -- "${UserName}\r"

    ### With Username & Password
    expect -re "\[Pp\]ass\[Ww\]ord" {

      ### Login
      send -- "${PW}\r"
      expect -re ${Prompt}

    ### With username, Without Password
    } ${Prompt} {
      ### After Login

    }

### Without Username & Password
} ${Prompt} {
  ### After Login
    
### Catch Error
} default { 
  exit 2 
} timeout {
  exit 2
} # END

### Run Commnads
set i 3
while { [lindex $argv $i ] != "" } {
  set CMD [lindex $argv $i ]

  send -- "${CMD}\r"
  expect -re ${Prompt}
  incr i
}

exit 0

実行してみる

sudo chmod +xなどで実行権限をつけましょう。
4番目の以降の引数が全てコマンドと認識され、リモートで実行されます。
パスワードない場合など、ログインに必要な引数が3つに満たない場合は、無い引数に '' を渡してください。

### 実行方法
./telnetpass.exp (ip) (username) (password) (command 1) (command 2) ... (command N)
ubuntu@ubuntu01:$ ./telnetpass.exp 172.24.0.100 ubuntu ubuntu123 'ls /home' 'echo hoge' 'echo fuga'

spawn telnet 172.24.0.100
Trying 172.24.0.100...
Connected to 172.24.0.100.
Escape character is '^]'.
Ubuntu 16.04.5 LTS
ubuntu02 login: ubuntu
Password: 
(snip)
ubuntu@ubuntu02:~$ ls /home
ubuntu
ubuntu@ubuntu02:~$ echo hoge
hoge
ubuntu@ubuntu02:~$ echo fuga
fuga
ubuntu@log-sv-client01:~$ ubuntu@ubuntu01:$

パスワードがヒストリに残る?
Telnetは暗号化されてないから使うべきではない?
(´・ω・`)

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?