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は暗号化されてないから使うべきではない?
(´・ω・`)