Ruby Net-SFTP не блокируется при загрузке

Я использую библиотеку ruby ​​Net-SFTP для загрузки папки с файлами на удаленный сервер с помощью загрузки! команду и обнаружив, что когда я восстанавливаю контроль, загрузка папки еще не завершена. Это было бы не так важно, за исключением того факта, что мне нужно изменить права доступа к этой папке, и я не могу выполнить их с помощью команды загрузки из-за umask на удаленном сервере. У меня нет учетной записи root на удаленном сервере, поэтому в основном мне нужно дождаться появления папки, а затем изменить ее разрешения. Когда я пытаюсь изменить разрешения, иногда папки еще нет, но в конце концов она появится. Я думаю, мой вопрос двоякий.

1.) Почему не блокируется вызов загрузки! фактически блокируется, пока папка не будет создана. 2.) Есть ли какой-то способ заставить его заблокироваться вызовом более низкого уровня, или мне нужно подождать пару секунд, а затем опросить, чтобы увидеть, есть ли папка?

ОБНОВЛЕНИЕ: я подозреваю, что настоящая проблема заключается в том, что я пытаюсь изменить разрешения через отдельное соединение ssh, которое может быть или не быть той же машиной, на которой я вхожу в кластер. Другими словами, папка была создана на одном компьютере, но не была реплицирована на другие к моменту, когда я пытаюсь изменить разрешения. Есть ли способ закрыть вопрос?


person Ben    schedule 27.08.2011    source источник
comment
Какую версию net/sftp вы используете и как выглядит ваш код? Я попробовал это здесь с 2.0.2, и он блокирует загрузку. Вы уверены, что используете загрузку! (и не загрузить)?   -  person undur_gongor    schedule 28.08.2011


Ответы (2)


Вы можете попробовать использовать базовый сеанс SSH сеанса SFTP для запуска команды:

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

person drewish    schedule 29.01.2014

В документации по SFTP v2 конкретно указано, что upload! блокируется до завершения операции:
http://net-ssh.rubyforge.org/sftp/v2/api/classes/Net/SFTP/Session.html#M000116

Однако, если вы используете параллельный сеанс SFTP или SSH, вы сами по себе. Вы должны вручную опросить, чтобы операция была завершена, или синхронизировать ваши сеансы каким-либо другим способом.

Для ручного опроса вы можете сделать что-то вроде цикла, используя sleep для непрерывной проверки удаленного конца, пока не появится ожидаемая папка.

person Casper    schedule 27.08.2011