#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
оно еще не существует.