RubyでRTX1300へSSH接続して設定ファイルを表示する

RubyからRTX1300へSSH接続して設定ファイルを表示するための備忘録です。

本来はnet-sshのみで実装する予定だったんですが、RTX1300のSSHサーバがRFC4254のSec 6.5にあるexecを実装していないようで、
open_channelを使って書く必要がありました。
既に似たようなことをやっているnet-ssh-telnetで軽い動作確認をした時のコードになります。

正直に言ってSSHして設定ファイルを表示する だけなら、expectコマンドを使ってシェルで書いた方が早いです。

コード

net-sshnet-ssh-telnetを使っています。
パスワード認証のサンプルなので公開鍵はnet-sshのコードを見ながら変更してください。

require 'net/ssh'
require 'net/ssh/telnet'

# 環境に応じて書き換える
host = '192.168.100.1'
user = 'hoge'
pass = 'fuga'

ssh_options = {
  host_name: host,
  user: user,
  password: pass,
}
ssh = Net::SSH.start(nil, nil, ssh_options)

telnet = Net::SSH::Telnet.new(
  'Session' => ssh,
  'Prompt' => /^>\s+$/,
)

# エンコードを指定
# 設定する値はドキュメントを見てバージョンにあった値を設定
# http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/setup/console_character.html
telnet.cmd('console character en.ascii')

# show configなどで一定行が表示される場合にページングされるのを防ぐ
# これを実行しないとnet-ssh-telnetが待機状態になったままになる
telnet.cmd('console lines infinity')

# show configの実行結果を表示する
# net-ssh-telnetだと、最後に`> `が表示されてしまうので注意
puts telnet.cmd('show config')

特筆することはないのですが、以下2つの設定を実行するようにしておくと、
止まったまま全然動かないなと思うこともも少なくなるはずです。

# エンコードを指定
# 設定する値はドキュメントを見てバージョンにあった値を設定
# http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/setup/console_character.html
telnet.cmd('console character en.ascii')

# show configなどで一定行が表示される場合にページングされるのを防ぐ
# これを実行しないとnet-ssh-telnetが待機状態になったままになる
telnet.cmd('console lines infinity')

また、何故エラーが出ているのかが分からない場合は、ssh_optionsverboseを追加するとデバッグ情報がみれます。

ssh_options = {
  host_name: host,
  user: user,
  password: pass,
  verbose: :debug,
}