SSH接続
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#https://github.com/net-ssh/net-ssh/blob/master/README.rdoc #coding: shift_jis #gem install net-ssh require 'rubygems' require 'net/ssh' Net::SSH.start('192.168.xxx.xxx','user', :keys=>'id.key', :passphrase=>'', :port=>'22') do |ssh| #ブロックはメソッドに渡す構造化された引数 channel = ssh.open_channel do |ch| puts "1", ch.class # Net::SSH::Connection::Channel puts "2", ch # <Net::SSH::Connection::Channel:xxx> =begin channel.request_pty do |ch,success| #ブロック引数は名前に関係なく、TrueClass,Channnelが返ってきている。 raise 'could not obtain pty' if !success #ptyは疑似端末 puts "3", success.class # TrueClass puts "4", success # True puts "5", ch.class # Net::SSH::Connection::Channel puts "6", ch # <Net::SSH::Connection::Channel:xxx> end =end =begin ch.exec "ls" do |ch,success| #処理は走るけど標準出力を持ってこない。下記参照channel.waitが必要。 raise 'failed to execute command' unless success puts "7", success.class # TrueClass puts "8", success # True puts "9", ch.class # Net::SSH::Connection::Channel puts "10", ch # <Net::SSH::Connection::Channel:xxx> ch.on_data do |c, data| puts data end end =end =begin #この書き方だと標準出力を持ってこれる。 ssh.exec!("ls") do |ch,stream,data| puts "11", ch # TrueClass puts data if stream == :stdout end =end ch.exec "ls" do |ch| #このch.execがないchannelがcloseされない ch.on_data { |c,data| puts data } #channel.waitを入れて、1,2,12,13と正しく処理が流れればon_dataが取得できる。 end ch.on_close { puts "done" } end channel.wait #この行がないと12,13が表示されてから1,2となる。 #channel.waitがあっても、ch.execがないと処理が終わらない。 puts "12", channel.class puts "13", channel end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#coding: utf-8 require 'rubygems' require 'net/ssh' Net::SSH.start('192.168.xxx.xxx','user', :keys=>'id.key', :passphrase=>'', :port=>'22') do |ssh| channel = ssh.open_channel do |ch| channel.request_pty { |c,success| raise '' if !success } ch.exec "sudo pwd" do |ch| ch.on_data do |ch,data| if data =~ /sudo/ ch.send_data "xxx" #このifがないとパスワードを何度も送信している。 elsif data =~ /\w+/ puts data end end end ch.on_close { puts "done" } end channel.wait end |
SCP接続
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# coding: utf-8 # sudo gem install net-scp # sudo gem install net-ssh require 'rubygems' require 'net/ssh' require 'net/scp' Net::SSH.start('xxx.com','user',:keys=>'id.key',:passphrase=>'pass',:port=>'22') do |ssh| ssh.exec 'mysqldump -u db_user -pXXX -h xxx.com db > test.sql' ssh.loop ssh.scp.download! "./test.sql","./test.sql" ssh.loop ssh.exec 'rm test.sql' ssh.loop end |
レンサバで運用しているMySQLのバックアップをローカルのUbuntuへ保存。
必要であればcronに登録。