Ruby Net-SFTP no se bloquea al cargar

I'm using the ruby library Net-SFTP to upload a folder of a files to a remote server using the upload! command, and finding that when I regain control, the folder has not finished uploading. It wouldn't be all that important except for the fact that I need to change the permissions of this folder and I can't accomplish them through the upload command due to a umask on the remote server. I do not have a root account on the remote server, so basically I need to wait for the folder to be there, then change its permissions. When I try to change the permissions, sometimes the folder is not there yet, but will show up eventually. I guess my question is two-fold.

1.) Why isn't the blocking call to upload! actually blocking until the folder has been created. 2.) Is there some way of forcing it to block with a lower level call, or do I have to wait a couple of seconds and then poll to see if the folder is there yet?

UPDATE: I suspect the real issue is because I'm trying to change permissions over a separate ssh connection, which may or may not be the same machine as I'm logging into a cluster. In other words, the folder has been created on one machine, but it hasn't been replicated across the others by the time I try to change permissions. Is there some way to close a question?

preguntado el 27 de agosto de 11 a las 19:08

Which version of net/sftp are you using and how is your code looking like? I tried it here with 2.0.2 and it does the upload in a blocking way. Are you sure you use "upload!" (and not "upload")? -

2 Respuestas

You could try using the SFTP Session's underlying SSH session to run the command:

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"

Or you could let SFTP change the permissions:

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

Respondido el 29 de enero de 14 a las 04:01

The v2 SFTP docs say specifically that upload! blocks until the operation is complete:

However if you're running a concurrent SFTP or SSH session, then you are on your own. You have to manually poll for the operation to be complete, or synchronize your sessions some other way.

To manually poll you can do it with something like a loop using sleep to continuously check the remote end until the folder you are expecting appears.

Respondido 28 ago 11, 03:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.