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