従来 rubyでNet::Telnetなんかを使ってARPテーブルの監視や動的なIPフィルタリング等をしていた。あとはSNMP関連なども
でも、それはローカルネットワークだから良かった話。遠隔地のルータを監視しようと思うと生パスワードが飛び交うのはイヤだし、通信内容も暗号化したい。
というわけで、Net::SSHを gem install net-sshしてサンプルコードを見ながら、遠隔地のRTX-1200に向けて
ssh.exec! 'show arp lan1'
等としてみるのだが、closed stream (IOError)等と言われてうまく動作しない。
試しにコマンド部分を 'ls /etc'に変えて最寄りのunixマシンに投げると動くので、rubyのコード自体はさほど間違ってないはず。
おっかしいなぁと思って、シェル上からssh user@router 'show arp lan1'を投入してみると、Channel request 'exec' is not supported !!
そう、YAMAHAのRTXシリーズのsshではexecは効かないのであった。
代替策として、 gem install net-ssh-telnetして
require 'rubygems'
require 'net/ssh'
require 'net/ssh/telnet'
s = Net::SSH::Telnet.new(
"Dump_log" => "/dev/null", # /dev/stdout would be work for debug
"Host" => @remotehostname,
"Username" => @user,
"Password" => @password
)
arp_string = s.cmd("show arp lan1")
のようにして解決したのであった