ruby の net-ssh-shell を使う

net-ssh version 2 だと環境変数の設定ができなくて困った。

https://github.com/mitchellh/net-ssh-shell

を使って bash を動かせば普段、ssh を使うような感覚で使用することができる。

インストール

gem install net-ssh-shell

で良いのだが、github にある最新のバージョンを使うには

git clone https://github.com/mitchellh/net-ssh-shell.git

を実行して取得したファイルに gem のファイルを置き換える。

使い方

Net::SSH.start('host', 'user') do |ssh|
  ssh.shell do |sh|
    sh.execute "ls"
    sh.execute "exit"
  end
end

のようにして使用する。

sh.execute "exit"

で exit を実行しないと終了しない。

.bashrc などの設定が悪さをする場合に、読み込まないようにする

私の .bashrc は自動で screen を実行するようになっていて この場合、net-ssh-shell がうまく使えない。 ssh.shell にシェルとそのオプションを渡して .bashrc と .bash_profile を読み込まないようにする。

Net::SSH.start('host', 'user') do |ssh|
  ssh.shell('bash --norc --noprofile') do |sh|
    sh.execute "ls"
    sh.execute "exit"
  end
end

nohup でコマンドを SSH 切断後も続けて実行させる

nohup コマンドに実行したいコマンドを渡す。

Net::SSH.start('host', 'user') do |ssh|
  ssh.shell do |sh|
    sh.execute "nohup some_command > out 2>&1 &"
    sh.execute "exit"
  end
end

のようにすれば良い。

rvm の ruby を使う

必要ならば

source ~/.rvm/scripts/rvm

として、

rvm use ruby-1.9.2-head

などとすれば良い。

Net::SSH.start('host', 'user') do |ssh|
  ssh.shell do |sh|
    sh.execute "source ~/.rvm/scripts/rvm"
    sh.execute "rvm use ruby-1.9.2-head"
    sh.execute "ruby -v"
    sh.execute "exit"
  end
end

コマンドの終了ステータスを調べて処理を分岐させる

net-ssh-shell 0.1.0 にはバグがあって execute! が動かないので、 github から取得する必要がある(2011-03-19)。 0.2.0 ではバグは直っている(2011-07-22)。

sh.execute! を実行して、exit_status で終了ステータスを得る。

Net::SSH.start('host', 'user') do |ssh|
  ssh.shell do |sh|
    c = sh.execute! "cd not_exit_directory"
    if c.exit_status != 0
      puts "Directory does not exist."
    end
    sh.execute "exit"
  end
end

execute! の戻り値

Net::SSH::Shell#execute! は Net::SSH::Shell::Process のオブジェクトを返す。 command や exit_status を取得できる。

Net::SSH::start('host', 'user') do |ssh|
  ssh.shell do |sh|
    pr = sh.execute! "env" do |shell_process|
      shell_process.on_output do |pr, data|
        print(data)
      end
    end
    p pr.class
    p pr.command
    p pr.exit_status
  end
end

Tags of current page

,