LoginSignup
0
0

More than 3 years have passed since last update.

SSHでポートフォワード接続して、ファイルの送受信をする

Posted at

環境

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
0
0
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
0
0