0

以下のコードを使用して、リモート マシンのファイル リストを作成しようとしています。

Net::SSH.start(host_name, 'ec2-user') do |ssh|
  cmd = "ls #{get_ls_command(dir_loc, extension)}"
  ssh.exec!(cmd) do |channel, stream, data|
  if stream == :stderr
    # do something -- and error has been raised. 
    # for now raise an exception 
    puts data
    raise "Error in fetching file data"
 end
 return data.split("\n")
end

ファイルの数が多い場合、exec コマンドから返されるデータは切り捨てられ、ファイルの部分的なリストのみが返されます。サイズの制限があるようです。増やす方法知ってる人いますか?

4

1 に答える 1

0

あなたのコードは完全ではendありません。 がなく、実際のネストを表していない「間違った」インデントがあります。しかし、私は私たちが持っているもので作業しようとします

このメソッドは、受信したデータをチャンクでブロックに返します。return ステートメントでdataは、実際には、上記のデータの最後に返されたチャンクを指しています。つまり、ブロックが 1 回だけ生成された場合 (最大で 8000 バイトの iirc で生成されます)、コードが偶然にしか機能しないことを意味します。

複数の利回りで安全を確保するには、まずデータを完全に収集してから、適切に処理する必要があります。次のようなものでそれを行うことができます:

Net::SSH.start(host_name, 'ec2-user') do |ssh|
  cmd = "ls #{get_ls_command(dir_loc, extension)}"

  result = ""
  ssh.exec!(cmd) do |channel, stream, data|
    if stream == :stderr
      # do something -- and error has been raised. 
      # for now raise an exception 
      puts data
      raise "Error in fetching file data"
    end
    result << data
  end

 return result.split("\n")
end
于 2012-05-08T10:10:20.983 に答える