1

「test.rb」という Ruby ファイルがあり、Net::SCP 経由でサーバーにアップロードしました。

ファイルの内容は次のとおりです。

puts "Hello, World"

Net::SSH 経由でそのファイルを実行し、STDOUT または STDERR を取得するにはどうすればよいですか?

これは私が得ているエラーです:

Bash: Ruby not found 

これは、Net::SSH がログイン シェルをロードしないためです。

私は Net::SSH::Shell から SSHkit まですべてを試し、スクリプトを実行して STDOUT を取得するという問題を解決しました。

ログイン シェルにアクセスできない場合、Net::SSH 経由でスクリプトを実行し、STDOUT または STDERR を取得するにはどうすればよいですか?

Ruby-2.1.0 を使用しています。

command = "ruby -e'print :hello'"
Net::SSH.start(server_connection.host, server_connection.ssh_username, port: server_connection.ssh_port, paranoid: false)  do |ssh|
  job.stdout  = ""
  job.stderr = ""
  ssh.exec! command do |channel, stream, data|
    job.stdout << data if stream == :stdout
    job.stderr << data if stream == :stderr
  end
  ssh.close
end
4

2 に答える 2

1

これは少し説明するのに役立つかもしれません:

require 'net/ssh'

# put commands to send to the remote Ruby here...
CMDs = [
  '-v',
]

print 'Enter your password: '
password = gets.chomp

Net::SSH.start('localhost', ENV['USER'], :password => password) do |ssh|

  remote_ruby = ssh.exec!('/usr/bin/which ruby').chomp
  puts 'Using remote Ruby: "%s"' % remote_ruby

  CMDs.each do |cmd|

    puts 'Sending: "%s"' % cmd

    stdout = ''
    ssh.exec!("#{ remote_ruby } #{ cmd }") do |channel, stream, data|
      stdout << data if stream == :stdout
    end

    puts 'Got: %s' % stdout
    puts
  end

end

それを Ruby ファイルに保存します。ローカル マシンで SSH アクセスを有効にしてから、そのスクリプトを実行します。パスワードの入力を求めるプロンプトが表示されたら、localhost に接続し、デフォルトの Ruby へのパスを取得します。次に、 内のすべてのコマンドをループしてCMDs実行し、それらの STDOUT を返します。

その他のオプションについては、Net::SSH 概要を参照してください。

/usr/bin/which ruby

システムが特定のコマンドに使用する実行可能ファイルを特定する標準的な方法です。PATH を検索し、そのコマンドへのパスを返します。Ruby が OS にバンドルされているか、yum または apt-get を使用してインストールされている場合、通常、*nix マシンの場合は /usr/bin/ruby になります。ソースからインストールした場合、/usr/local/bin/ruby にある可能性があります。

RVM、rbenv、または Homebrew を使用した場合は、それらの存在を嗅ぎつけて、作成者が推奨するあらゆるトリックを使用する必要があります。このコードはしばらくハングし、おそらく例外が発生します。

私のマシンでそのコードを実行すると、次のように出力されます。

パスワードを入力してください: some(secret)thang
リモート Ruby の使用: "/usr/bin/ruby"
送信:「-v」
入手: ruby​​ 1.8.7 (2012-02-08 パッチレベル 358) [universal-darwin12.0]
于 2014-01-03T05:09:43.270 に答える
0

これを試して:

 ssh username@host "ruby -e'print :hello'"

これにより、ホスト マシンで Ruby が実行され、リモート マシンで他のスクリプトを実行するのと同じ方法で出力が得られます。

require 'net/ssh'

host = "localhost"
username = "tuxdna"
password = "SOMEAWESOMEPASSWORDHERE"
command = "ruby -e'print :hello'"

class Job
  attr_accessor :stdout
  attr_accessor :stderr
end

job = Job.new

Net::SSH.start(host, username, password: password)  do |ssh|
  job.stdout  = ""
  job.stderr = ""
  ssh.exec! command do |channel, stream, data|
    job.stdout << data if stream == :stdout
    job.stderr << data if stream == :stderr
  end
  # ssh.close
end
p job

出力:

$ ruby myssh.rb
#<Job:0x00000002bed0a0 @stdout="hello", @stderr="">
于 2014-01-03T02:57:55.517 に答える