2011-08-27 77 views
0

我正在使用ruby库Net-SFTP上传文件的文件夹到使用上传的远程服务器!命令,并发现当我重新获得控制权时,该文件夹尚未完成上传。除了我需要更改此文件夹的权限以及由于远程服务器上的umask而无法通过上载命令完成这些操作之外,这并不重要。我在远程服务器上没有root帐户,所以基本上我需要等待该文件夹在那里,然后更改其权限。当我尝试更改权限时,有时该文件夹还没有出现,但最终会显示出来。我想我的问题是双重的。上传的Net-SFTP没有阻塞

1.)为什么不阻止上传!实际上阻​​塞直到文件夹被创建。 2.)是否有某种方式强迫它阻塞一个较低级别的呼叫,还是必须等待几秒钟,然后轮询以查看文件夹是否在那里?

更新:我怀疑真正的问题是因为我试图通过单独的ssh连接更改权限,这可能与我登录到群集时可能是相同的机器。换句话说,该文件夹已经在一台机器上创建,但是当我尝试更改权限时,该文件夹并未被复制。有什么方法可以解决问题吗?

+0

你使用的是哪个版本的net/sftp,以及如何你的代码看起来像?我在2.0.2版本中尝试了它,并以阻塞方式进行上载。你确定使用“上传”吗? (而不是“上传”)? –

回答

0

第2版SFTP文档说特别是upload!阻止,直到操作完成:
http://net-ssh.rubyforge.org/sftp/v2/api/classes/Net/SFTP/Session.html#M000116

但是如果你正在运行一个并发的SFTP或SSH会话,那么你对你自己的。您必须手动轮询操作才能完成,或以其他方式同步会话。

要手动轮询,您可以使用sleep这样的循环来进行连续检查,直到您期望的文件夹出现。

0

你可以尝试使用SFTP会话的基础SSH会话运行命令:

Net::SSH.start("localhost", "user", "password") do |ssh| 
    ssh.sftp.upload!("/local/file.tgz", "/remote/file.tgz") 
    ssh.exec! "cd /some/path && tar xf /remote/file.tgz && rm /remote/file.tgz" 
end 

http://net-ssh.github.io/net-sftp/classes/Net/SSH/Connection/Session.html

或者你可以让SFTP更改权限:

sftp.setstat("/path/to/remote.file", :permissions => 0644) 

http://net-ssh.github.io/sftp/v1/faq.html#2202822