Переместить (не копировать )файлы с сервера на локальный компьютер

Важно понимать, что аргументы, переданные в ssh, объединяются, чтобы составить командную строку оболочки , интерпретируемую оболочкой входа удаленного пользователя.

Таким образом, чтобы иметь возможность запускать some-shell-codeна C через ssh-соединение с B, вам нужно построить командную строку для B, чтобы оболочка входа пользователя B правильно интерпретировала ее, чтобы передать это some-shell-codeкак есть. к ssh.

Если текущая оболочка на A, оболочка входа пользователя на B и оболочка входа пользователя на C — все bash, одна и та же версия (и используется одна и та же локаль, если часть этого кода содержит -символы ASCII ), а $CODEсодержит код bashдля выполнения на C, вы можете сделать:

printf -v quoted_CODE %q "$CODE"
ssh B "ssh C $quoted_CODE"

Если вы не уверены, что оболочка входа пользователя на B или C — bash, и вам не нужно передавать какую-либо информацию через стандартный ввод, вы можете просто выполнить:

ssh B ssh C bash <<< "$CODE"

Или если вы знаете, что sshdна A и B разрешают входящие LC_*переменные(AcceptEnv LC_*общие вsshd_config):

LC_CODE=$CODE ssh -o SendEnv=LC_CODE B '
  ssh -o SendEnv=LC_CODE C bash -c '\'' eval "$LC_CODE"'\'
4
02.01.2021, 12:40
4 ответа

scpничего не удалит с сервера, вы можете запустить rmна сервере после успешного выполнения scp:

scp -r obs@180.78.5.547:/home/obs/folder/test.txt /home/yuan/folder/ \
  && ssh obs@180.78.5.547 'rm /home/obs/folder/test.txt'
3
18.03.2021, 22:39

«Перемещение» по сути является копированием, а затем удалением исходного файла.

Если вы хотите "переместить" файл по сети, вы должны сделать именно это. Это всегда предпочтительнее, так как в случае сбоя сетевого подключения вы можете повторить попытку копирования без потери каких-либо данных (, если ваши файлы были переданы неправильно, но впоследствии удалены ).

После передачи файлов необходимо удалить исходные файлы на сервере, например, с помощью:

ssh obs@180.78.5.547 'rm /home/obs/folder/test.txt'

Опция -r, которую вы использовали в своем примере, предназначена для рекурсивного копирования файлов, что означает, что вы хотите копировать каталоги файлов по сети. Я полагаю, вы хотите переместить все файлы по сети (передать, а затем удалить все файлы внутри исходного каталога ).

При копировании или "перемещении" файлов между двумя машинами я предлагаю использоватьrsync. Он будет передавать только новые и измененные файлы и пропускать уже идентичные файлы в месте назначения. У него есть возможность удалить исходные файлы за один раз,после того, как они были переданы, что должно имитировать поведение, которое вы предположительно ожидаете при "перемещении" файла с одной машины на другую:

rsync -aPEmivvz --remove-source-files obs@180.78.5.547:/home/obs/folder /home/yuan

И только для одного файла, который вы бы использовали:

rsync -aPEmivvz --remove-source-files obs@180.78.5.547:/home/obs/folder/file.txt /home/yuan/folder/

Использование опции --remove-source-filesпросто удаляет файлы (и )после их передачи.

21
18.03.2021, 22:39

rsync имеет опцию --remove-source-files. Он удаляет все синхронизированные файлы, отличные от -dir.

Вероятно, это сработает:

rsync -avz --remove-source-files obs@180.78.5.547:/home/obs/folder/test.txt /home/yuan/folder/

Обратите внимание, что на исходном и целевом компьютерах необходимо установить rsync.

Попробуйте запустить с --dry-run, чтобы убедиться, что он работает, прежде чем запускать его.

Преимущество rsyncпо сравнению с scpзаключается в том, что он может копировать права доступа к файлам, права собственности, символические ссылки, использовать сжатие для ускорения передачи по медленным соединениям и выполнять хеширование для проверки успешности передачи перед удалением.

Я обычно использую rsyncдля резервного копирования, когда он передает только те файлы, которые изменились с момента последней синхронизации, что экономит много времени и трафика.

8
18.03.2021, 22:39

Ложки нет.

Несмотря на то, что слово «переместить» означает «двигаться» на английском языке. Это не то, что он делает в компьютерах. команда mv была создана только для того, чтобы улучшить вашу человеческую фиксацию на физических объектах.

Переименовать, более уместно. Вот почему rename и mv взаимозаменяемы. Перемещение файла из одного каталога в другой в той же файловой системе просто «переименовывает» файл с новым полным именем, включая новый путь.

Думайте о файлах как о простом вертикальном списке из двух столбцов на листе бумаги. Путь указан слева, а содержимое файла справа.

"Перемещение" просто стирает левый столбец и записывает новое значение. Содержимое файла никуда не «ушло». Файловая система — это связующее, в котором находятся эти страницы.

Если вы думаете, что перемещаете файл из той или иной файловой системы, (в том числе с одного компьютера на другой,)это не так . То, что вы делаете, копируете его с одного на другое, а затем «стираете» его на первом. (что, конечно же, на самом деле не стирает его, а просто забывает о нем.)

Перемещается не файл. Это только вы сами.

3
18.03.2021, 22:39

Теги

Похожие вопросы