загружать каталоги с помощью sftp?

<p>у меня возникли проблемы с загрузкой каталогов (которые содержат другие каталоги глубиной в несколько уровней) по sftp. я понимаю, что могу обойти это, используя gzipping, но я не понимаю, почему это необходимо.</p><p>во всяком случае, я стараюсь</p><pre><code>sftp> put bin/ uploading bin/ to /home/earlz/blah/bin bin/ is not a regular file sftp> put -r bin/ uploading bin/ to /home/earlz/blah/bin couldn't canonicalise: no such file or directory unable to canonicalise path "/home/earlz/blah/bin" </code></pre><p>я думаю, что последнее сообщение об ошибке совершенно глупо. таким образом, каталог не существует? почему бы не создать каталог?</p><p>есть ли какой-либо вопрос об этой проблеме с sftp, или я должен просто использовать scp?</p>

<p><strong> исправлено </strong>: я изначально ошибочно утверждал, что openssh не поддерживает <code>put -r</code>. да, но очень странным образом. кажется, ожидается, что каталог назначения уже существует с тем же именем, что и исходный каталог.</p><pre><code>sftp> put -r source uploading source/ to /home/myself/source couldn't canonicalize: no such file or directory etc. sftp> mkdir source sftp> put -r source uploading source/ to /home/myself/source entering source/ source/file1 source/file2 </code></pre><p>что особенно странно, это то, что это применимо, даже если вы дадите другое имя для пункта назначения:</p><pre><code>sftp> put -r source dest uploading source/ to /home/myself/dest couldn't canonicalize: ... sftp> mkdir dest sftp> put -r source dest uploading source/ to /home/myself/dest/source couldn't canonicalize: ... sftp> mkdir dest/source sftp> put -r source dest uploading source/ to /home/myself/dest/source entering source/ source/file1 source/file2 </code></pre><p>для лучшей реализации рекурсивного <code>put</code> вы можете использовать инструмент командной строки putty <code>psftp</code>. это в <code>putty-tools</code> пакет под debian (и, скорее всего, ubuntu).</p><p>с другой стороны, filezilla будет делать то, что вы хотите, если вы хотите использовать графический интерфейс.</p>

<p>я не знаю, почему sftp делает это, но вы можете только рекурсивно копировать, если каталог назначения уже существует. так сделай это ...</p><pre><code>sftp> mkdir bin sftp> put -r bin </code></pre>

<p>возможно, вам будет интересно использовать <code>rsync</code>. команда для этого будет</p><pre><code> rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/ </code></pre><p>это скопирует все в <code>bin/</code> и поместите его на удаленный сервер в <code>/home/earlz/blah/bin/</code>. в качестве дополнительного преимущества, он сначала проверит, не изменился ли файл на удаленной стороне, и если нет, то не отправит его повторно. кроме того, вы можете добавить опцию -z, и она сожмет ее для вас.</p>

<p><code>lcd</code>: ваша локальная папка (с подпапками)</p><p><code>cd</code>: ваша удаленная папка</p><p><code>put -r .</code></p>

<p>могу ли я предложить несколько сложный ответ, без архивирования, но с учетом tar?</p><p>вот так:</p><pre><code>tar -cf - ./bin | ssh target.org " ( cd /home/earlz/blah ; tar -xf - ) " </code></pre><p>это упакует каталог ./bin с tar (-cf: = create file), filename - (none, stdout) и перенаправит его через ssh-команду на target.org (который также может быть ip), где команда в кавычках выполняется: cd to blah и tar -xf (извлечь файл) - нет, нет имени, просто stdin.</p><p>это как если бы вы упаковали пакет дома, принесли его на почту, а затем поехали на работу, где ожидали пакет, и открыли его.</p><p>может быть, есть гораздо более элегантное решение, которое просто использует sftp.</p>

<p>вы можете использовать <a href="http://yafc.sourceforge.net/">yafc</a> (пока еще клиент ftp/sftp). опция <code>-r</code> работает там очень хорошо.</p>

<p>вы можете использовать <strong> rsync </strong>, который является очень мощной альтернативой для scp и sftp, особенно при обновлении копий с компьютера a на компьютер b, так как он не ' t копировать файлы, которые не были изменены; он также может удалять с компьютера b файлы, которые были удалены с компьютера a (конечно, только если это указано).</p><p>например :</p><pre><code>rsync -zrp /home/a/ user@remote.host.com:/home/b/ </code></pre><p>опция -r предназначена для рекурсивного копирования файлов, -z включает сжатие во время передачи, а -p сохраняет права доступа к файлам (создание, редактирование и т.д.) при копировании, чего scp не выполняет afaik. возможно еще много вариантов; как обычно, прочитайте справочные страницы.<br> <a href="https://superuser.com/questions/387477/sftp-upload-all-files-directories-and-sub-directories-contained-in-a-folder">оригинальный ответ каролос</a> </p>

<p>войдите на удаленный сервер с помощью ssh, используйте sftp, чтобы снова подключиться к вашему устройству, затем используйте <code>get -r</code> команда для передачи каталогов на удаленный сервер. команда get позволяет рекурсивно передавать каталоги, не создавая каталог.</p><pre><code>ssh remote ip sftp local ip get -r whichever-dir </code></pre>

<p>случай sftp:</p><p>мне нужно было скопировать эту структуру на моем ftp:</p><pre><code>mainfolder --- folder --- subfolder | | file1.txt file2.txt </code></pre><p>это решило мою проблему:</p><pre><code>cd ./mainfolder mkdir folder put -r /from/source/folder/* /mainfolder/folder/ cd ./folder mkdir subfolder put -r /from/source/folder/subfolder/* /mainfolder/folder/subfolder/ </code></pre>

<p>я только что узнал из <a href="https://wiki.archlinux.org/index.php/sftp\_chroot#installation">arch linux wiki</a> , что можно смонтировать sftp-ресурс с помощью sshfs. я использую <a href="https://www.linuxtechi.com/configure-chroot-sftp-in-linux/">sftp-сервер с chroot и jail</a> и sshfs работает очень хорошо.</p><ol> <li>mount: <code>sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory></code></li> <li>разправка: <code>fusermount -u <your/local/mount/directory></code></li> </ol>