0

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

1.) 为什么没有阻止调用上传!实际上阻​​塞,直到创建文件夹。2.) 是否有某种方法可以通过较低级别的调用强制它阻塞,或者我必须等待几秒钟然后轮询以查看文件夹是否存在?

更新:我怀疑真正的问题是因为我试图通过单独的 ssh 连接更改权限,这可能是也可能不是我登录到集群的同一台机器。换句话说,该文件夹是在一台机器上创建的,但是当我尝试更改权限时,它还没有被复制到其他机器上。有什么方法可以结束一个问题吗?

4

2 回答 2

1

您可以尝试使用 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

于 2014-01-29T00:35:04.527 回答
0

v2 SFTP 文档明确说明upload!在操作完成之前会阻塞:http:
//net-ssh.rubyforge.org/sftp/v2/api/classes/Net/SFTP/Session.html#M000116

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

要手动轮询,您可以使用类似循环的方法sleep来持续检查远程端,直到出现您期望的文件夹。

于 2011-08-27T23:16:51.427 回答