4

Net::SFTP を使用して SFTP サイトにファイルをアップロードしようとしています。

問題は、Ruby プロセスが戻らないことです。フリーズし、立ち往生し、終わりがありません... 停止するには、Ctrl-C を押す必要があります。

  • sftp を使用して、コマンド ラインで ftp サーバーに接続できます。
  • Linux (Ubuntu) と Snow Leopard でこのコードを試してみましたが、同じことを行います。
  • Net::SSH と Net::SFTP の最新バージョンをインストールしました。
    • からgem list net:
      • net-sftp (2.0.5)
      • net-ssh (2.1.4)
  • ハッシュ引数のさまざまな組み合わせ (以下のコードを参照)
  • Net::SFTP.start最初に SSH セッションを作成する代わりに呼び出しを試みました。
  • SFTP protocol version 3コマンド ライン ツールを使用してログインし、バージョンを尋ねると、サーバーは " " で応答します。
  • 私は走っていますRuby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin10.7.0]

:verbose(最後の数行)からのデバッグ出力:

D, [2011-07-29T17:30:52.692192 #19399] DEBUG -- tcpsocket[80c06478]: read 36 bytes
D, [2011-07-29T17:30:52.692609 #19399] DEBUG -- tcpsocket[80c06478]: received packet nr 7 type 99 len 12
I, [2011-07-29T17:30:52.692751 #19399]  INFO -- net.ssh.connection.session[80bd5da0]: channel_success: 0
D, [2011-07-29T17:30:52.692817 #19399] DEBUG -- net.sftp.session[80bd5c24]: sftp subsystem successfully started
D, [2011-07-29T17:30:52.693625 #19399] DEBUG -- tcpsocket[80c06478]: queueing packet nr 8 type 94 len 28
D, [2011-07-29T17:30:52.693834 #19399] DEBUG -- tcpsocket[80c06478]: sent 52 bytes

サンプルコード:

require 'rubygems'
require 'net/sftp'

FTP = "someftpsite"
FTP_USER_NAME = "user"
FTP_PASSWORD = "password"
hash = {:password => FTP_PASSWORD, :verbose => :debug, :keys=>[""],:auth_methods => ["password"], :timeout => 5, :port=>22}
begin
    Net::SSH.start(FTP,FTP_USER_NAME, hash) do |test|
    test.sftp.upload!("localfile","remotefile")
end
rescue Exception => err
    puts "error:#{err.inspect}"
end

編集: 2011 年 8 月 22 日

これは、SFTP サーバーの対話性に関連しているようです。この問題は、expect を使用してシェル スクリプトを作成し、Ruby からシェルを実行してファイルを実行することで解決しました。シェル スクリプトは実行時に作成されます。これは本当にハックに思えますが、Ruby を使用して動作させることができた唯一の方法です。他の誰かに提案がある場合は、これを行うためのより良い方法を見つけたいと思います。

4

1 に答える 1

1

代わりに公開/秘密鍵認証を使用できます。 http://net-ssh.rubyforge.org/ssh/v1/chapter-2.html#s2

于 2013-01-04T06:34:29.120 に答える