Важно понимать, что аргументы, переданные в 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"'\'
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'
«Перемещение» по сути является копированием, а затем удалением исходного файла.
Если вы хотите "переместить" файл по сети, вы должны сделать именно это. Это всегда предпочтительнее, так как в случае сбоя сетевого подключения вы можете повторить попытку копирования без потери каких-либо данных (, если ваши файлы были переданы неправильно, но впоследствии удалены ).
После передачи файлов необходимо удалить исходные файлы на сервере, например, с помощью:
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
просто удаляет файлы (и )после их передачи.
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
для резервного копирования, когда он передает только те файлы, которые изменились с момента последней синхронизации, что экономит много времени и трафика.
Несмотря на то, что слово «переместить» означает «двигаться» на английском языке. Это не то, что он делает в компьютерах. команда mv была создана только для того, чтобы улучшить вашу человеческую фиксацию на физических объектах.
Переименовать, более уместно. Вот почему rename и mv взаимозаменяемы. Перемещение файла из одного каталога в другой в той же файловой системе просто «переименовывает» файл с новым полным именем, включая новый путь.
Думайте о файлах как о простом вертикальном списке из двух столбцов на листе бумаги. Путь указан слева, а содержимое файла справа.
"Перемещение" просто стирает левый столбец и записывает новое значение. Содержимое файла никуда не «ушло». Файловая система — это связующее, в котором находятся эти страницы.
Если вы думаете, что перемещаете файл из той или иной файловой системы, (в том числе с одного компьютера на другой,)это не так . То, что вы делаете, копируете его с одного на другое, а затем «стираете» его на первом. (что, конечно же, на самом деле не стирает его, а просто забывает о нем.)
Перемещается не файл. Это только вы сами.