adn*_*ann 3 ruby-on-rails net-sftp
我有一个Ruby on Rails(Rails 3.2.14和ruby 1.9.3)应用程序,它将2个文件上传到远程SFTP服务器.SFTP代码是:
require 'net/sftp'
Rails.logger.info("Creating SFTP connection")
uri = URI.parse('sftp://'+ host)
Net::SFTP.start(uri.host,'user', :password=>'password',:port=>port) do |sftp|
Rails.logger.info("SFTP Connection created, uploading files.")
sftp.upload!("public/file1.txt", "./file1.txt")
Rails.logger.info("First file uploaded.")
sftp.upload!("file2.txt", "./file2.txt")
Rails.logger.info("Both files uploaded, terminating connection.")
end
Rails.logger.info("Connection terminated.")
Run Code Online (Sandbox Code Playgroud)
这两个文件都正确地上传到远程服务器,但连接似乎没有关闭.当我执行此功能并分析我的控制台时,我一直收到错误,我看到"两个文件都已上传,终止连接".记录器消息正在运行,但之后没有任何内容.我试过用了
sftp.close(:handle)
sftp.close!(:handle)
#and
sftp.close_connection()
Run Code Online (Sandbox Code Playgroud)
但他们都没有工作.有关为什么会发生这种情况以及如何纠正它的任何想法?我通过单个实例Engine Yard云服务器运行它.
编辑 这是我日志中的最后几行:创建SFTP连接创建SFTP连接,上传文件.上传第一个文件.上传两个文件,终止连接.
在那之后,没什么.使用'tail -f'命令查看我的日志时,日志会上升到最后一行,并且应用程序会重定向到内部服务器错误页面.
Ghi*_*his 10
Net::SFTP.start('host', 'user', password: 'pass', port: 22) do |sftp|
# Do stuff
end
Run Code Online (Sandbox Code Playgroud)
相当于:
session = Net::SSH.start('host', 'user', password: 'pass', port: 22)
sftp = Net::SFTP::Session.new(session)
sftp.connect!
# Do stuff
sftp.close_channel unless sftp.nil?
session.close unless session.nil?
Run Code Online (Sandbox Code Playgroud)
对于那些无法找到实际关闭连接的方法的人,不使用自动关闭块,以下是我可以实现的方法:
require 'net/ssh'
require 'net/sftp'
begin
# Instance SSH/SFTP session :
session = Net::SSH.start('host', 'user', password: 'pass', port: 22)
sftp = Net::SFTP::Session.new(session)
# Always good to timeout :
Timeout.timeout(10) do
sftp.connect! # Establish connection
# Do stuff
end
rescue Timeout::Error => e
# Do some custom logging
puts e.message
ensure
# Close SSH/SFTP session
sftp.close_channel unless sftp.nil? # Close SFTP
session.close unless session.nil? # Then SSH
# If you really really really wanna make sure it's closed,
# and raise after 10 seconds delay
Timeout.timeout(10) do
sleep 1 until (sftp.nil? or sftp.closed?) and (session.nil? or session.closed?)
end
end
Run Code Online (Sandbox Code Playgroud)
如果在执行某些其他任务之前未关闭连接,则有时可能会在rails中遇到如下错误:
IOError (not opened for reading) # Not closed when rendering controller action
ActionView::Template::Error (not opened for reading) # Not closed when rendering template
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5751 次 |
| 最近记录: |