Как создавать вложенные каталоги с помощью Net ::SFTP (Ruby)

#ruby-on-rails #ruby #sftp #net-sftp

#ruby-on-rails #ruby #sftp #net-sftp

Вопрос:

Я пытаюсь создать несколько каталогов одновременно. В настоящее время sftp.mkdir! path создается только один уровень каталога за раз. Например, я могу создать /test , а затем должен создать другой каталог /test/secure_token и так далее и тому подобное. Есть ли способ, которым я могу создать /test/secure_token один вызов, а не два?

Ответ №1:

Мне не удалось найти решение для этого, поэтому я создал следующий метод:

 def sftp_makedirs(sftp, remotedir)
  return if remotedir == "."
  return if sftp.file.directory?(remotedir)
  raise StandardError, "path '#{remotedir}' already exists, but not a dir"
rescue Net::SFTP::StatusException  #(2, "no such file")
  sftp_makedirs(sftp, File.dirname(remotedir))
  sftp.mkdir!(remotedir)
end
  

Как это работает:

  • Он завершает рекурсию при достижении пустого пути (иначе текущего каталога ).)
  • Он завершается, если каталог существует
  • Возникает исключение, если путь существует, но не является каталогом
  • Если путь не существует, он проверяет, существует ли его база, и создает последний уровень пути

Ответ №2:

Я запустил следующий скрипт ruby с хостом, именем пользователя и паролем, переданными в качестве аргументов командной строки:

 require 'net/sftp'

Net::SFTP.start(host, username, password: password) do |sftp|
  sftp.mkdir!("/home/#{username}/test/test2")
end
  

И смог успешно создать многоуровневый каталог на удаленном хосте.

В rubydoc не упоминается, что #mkdir! невозможно создать многоуровневые каталоги, и он даже дает примерный аргумент как «/path/ to/directory»

https://www.rubydoc.info/github/net-ssh/net-sftp/Net/SFTP/Session:mkdir !

У вас не должно возникнуть проблем, если вы просто передадите весь путь к каталогу, который пытаетесь создать, так что, возможно, это странная причуда вашего удаленного хоста? Трудно сказать без дополнительной информации.

Комментарии:

1. Это просто завершается неудачей, если test оно еще не существует.