環境
Ubuntu 16.04.7 LTS (Xenial Xerus)
ruby 2.5.0p0
やりたい事
Rubyプログラムをポートフォワードで指定したサーバーに転送した後、転送先のサーバーでRubyプログラムを実行させて、csvファイルを標準出力させます。そして、標準出力したcsvファイルを、自分のローカル環境に持ってくるという事をやります。
コード
def ssh_connect
begin
# ファイルを転送
_cmd = system('scp -P 54322 -i /home/.ssh/id_rsa /home/syori.rb server@153.153.xx.xx:/home')
# ポートフォワードの設定
Net::SSH.start(
'153.153.xx.xx',
'username',
:keys => '/home/.ssh/id_rsa',
:port => 54322
) do |_a|
_a.forward.local(2222,'192.168.xx.xx', 54323)
_a.exec!('ruby syori.rb')
end
# ファイルを取得する
_cmd = system('scp -P 54322 -i /home/.ssh/id_rsa server@153.153.xx.xx:/home/users.csv /home')
rescue => ex
print "***** " + self.class.name.to_s + "." + __method__.to_s + " *****\n"
print(ex.class," -> ",ex.message)
end
end
解説
system
RubyでLinuxコマンドを発行するメソッドです。戻り値は、ture/falseが返ってきます。
scp
ファイル転送するコマンド(プロトコル)です。ファイル転送というと、ひと昔はftpがよく使われていたと思いますが、ftpはログインする時のアカウント情報を暗号化できないため、セキュリティを高めるために、SSH機能が標準装備されているscpを使う事が基本になります。
scpのオプション
-P
ポート番号を指定します。SSHのポート番号は22が、ウェルノウンポート番号として指定されていますが、外向けに公開しているサーバーであれば、変な攻撃を受けないために、カスタマイズしている場合があると思います。接続するサーバーのSSHのポート番号を指定します。
-i
SSH通信で利用する公開鍵を保存しているパスを絶対パスで設定します。大抵、ホームの.sshに置かれます。
転送するファイル名を絶対パスで設定します。転送先の指定は、転送先のサーバー名:転送先のディレクトリを絶対パスで指定します。
ポートフォワードの解説
Net::SSH.start(
フォワード元IPアドレス,
フォワード元のユーザー名,
:keys => 接続元の秘密鍵の絶対パス,
:port => 接続元のポート番号
) do |_a|
_a.forward.local(フォワード元のポート番号(何でもいい),
'ポートフォワード先のIPアドレス',
フォワード先のポート番号)
_a.exec!('接続先で実行したいコマンド')
end