Можно ли использовать команды Unix для копирования файла из моего подкаталога на удаленный компьютер через SSH?

17

У меня есть ряд программных файлов, загруженных в мой подкаталог ~/Downloadsна моем персональном компьютере. Я также использую Bash для удаленного подключения к компьютеру с помощью ssh.

Можно ли передать этот файл через sshудаленный компьютер?

ShanZhengYang
источник
Вопрос касается единственного файла ( this file) и нескольких файлов ( a series of software files), лучшее решение зависит от того, есть ли у вас один файл или несколько файлов.
user2768 11.11.15

Ответы:

42

Вы можете использовать scpдля этой цели. Это безопасный способ передачи файлов по протоколу SSH.

Например, чтобы скопировать файл с именем yourfile.txtиз ~/Downloadsк удаленному компьютеру, используйте:

scp ~/Downloads/yourfile.txt your_username@remotehost.edu:/some/remote/directory

Вы можете увидеть больше примеров здесь .

ARG
источник
5
Я думаю, что rsyncможет работать так же, теперь, когда я думаю об этом
ShanZhengYang
1
rsync
слишком
14
@Paebbels Напротив, замените scpвыше, rsyncи это должно работать просто отлично.
8bittree
Я склонен использовать rsyncдля всего, даже для отдельных файлов, потому что это «просто работает» в простых случаях и может быть гораздо более эффективным в других случаях. При использовании либо scpили rsyncна что - либо уже не сжатом и / или зашифрованном, не забудьте включить опцию сжатия на ( -Cдля scp,-z или --compressдля rsync). На самом деле я включаю его по привычке - очень редко можно встретить обстоятельства, когда это когда-либо замедляет работу (возможно, если вы используете медленное устройство с низким энергопотреблением и ограниченной мощностью CPI, например, RPI).
Дэвид Спиллетт
37

Хотя scpэто явно правильный инструмент для этого, если по какой-то причине вы не можете его использовать, вы можете сделать что-то вроде следующего с вашего локального компьютера, чтобы скопировать, скажем, структуру каталогов на удаленный компьютер:

tar -c . | ssh <remote> tar -x

Это создаст tarтекущий каталог на локальном компьютере и запишет тот, tarв stdoutкоторый затем будет передан sshкоманда, где он выполнит удаленную команду, чтобы распаковать файл, из которого он читаетstdin

Отредактировано, чтобы отразить комментарий Дитриха Эппа о -f -том, что он является настройкой по умолчанию как для конца создания, так и для извлечения, поэтому нет необходимости указывать явно.

Эрик Ренуф
источник
7
Возможно, вы захотите добавить -C basedirаргумент для tarизвлечения чего-то, кроме вашего домашнего каталога, если вы делаете это.
Дугал
17

Если вы хотите сделать это чаще, чем в редких случаях, я бы посоветовал монтировать удаленную файловую систему, sshfsесли вы используете Unix-подобный, который поддерживает FUSE (Linux, * BSD, Mac OS X). Создайте каталог под своим домашним каталогом, скажем, ~ / remote-server:

    $ mkdir ~/remote-server

Затем смонтируйте удаленную файловую систему с sshfs . Замените «yourserver.com» на имя хоста вашего удаленного компьютера, а «имя удаленного каталога» на каталог, который вы используете в удаленной системе.

    $ sudo sshfs username@yourserver.com:/name/of/remote/directory ~/remote-server/

Как только это будет сделано, удаленный каталог станет частью вашей файловой системы, и вы сможете использовать все свои обычные инструменты, включая cp :

    $ cp ~/Downloads/your-files ~/remote-server

Если вы еще не sshfsустановили, вы сможете установить его на свой компьютер, используя менеджер пакетов (ищите пакеты с именами sshfsилиfuse-sshfs ). Для получения дополнительной информации вы можете прочитать учебник онлайн .

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

Бенджамин Стэтон
источник
А затем проверьте, какие параметры sshfs помогут вам лучше всего выполнить свою работу. Например, начиная с сопоставления идентификатора пользователя / группы -o idmap={none,user,file},gid=<remote_user_group_ID>,allow_otherи -Cдля сжатия, если плохая пропускная способность. Как только все заработает, я лично добавлю псевдонимы для команд, чтобы быстро смонтировать удаленные файловые системы через ssh. @Benjamin_Staton Я бы не использовал здесь sudo или root, по крайней мере без надлежащего отображения пользователей / групп.
tuk0z
9

Во-первых, нет реальной разницы между scp(копировать ssh) иrsync .

Последующие запуски выиграют, если rsync не будет копировать файлы, которые уже существуют.

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a для всех файлов
  • -v для многословия
  • -H для "просто выяснить символические ссылки и делать правильные вещи"
  • затем пути источника и назначения. Вы можете использовать подстановочные знаки в источнике или просто синхронизировать весь каталог.

Другие полезные флаги включают в себя:

  • --delete удалить файлы в месте назначения, которые больше не существуют в источнике.
  • --dry-run для тестирования - очень удобно в сочетании с --delete.

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

В конце прогона rsyncрасскажет вам, во сколько раз это было быстрее, если снова сделать простую копию.

Criggie
источник
1
-Hна самом деле для жестких ссылок, он останавливает отправку одного и того же контента дважды или более, когда он связан более чем в одном месте в структуре исходного каталога (но может сделать процесс менее эффективным для больших структур каталогов). это не влияет на символические ссылки, но некоторые опции, включенные -a/ --archiveдействительно, влияют на то, как обрабатываются символические ссылки .
Дэвид Спиллет
4

Добавить к ответам выше. Иногда я не совсем уверен насчет удаленного пути. В этих случаях я использую, sftpчтобы сначала перейти к требуемому местоположению, затем использовать get или put, чтобы фактически загрузить или загрузить файл.

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

aragaer
источник
-1

Я делаю что-то очень похожее с ssh. Я создал специальный инструмент сборки для Visual Studio, и в основном VS запускает команду ssh, которая копирует мой код на целевой компьютер, а затем компилирует его на этом целевом компьютере.

ssh userB @ hostB 'cp /network/path/of/source/file.ext /path/of/final/file.ext; ./runCustomCommand»

Обратите внимание на использование одинарной кавычки и точки с запятой. Первый инкапсулирует ваши команды для hostB через ssh, а второй позволяет вам запускать несколько системных команд hostB в одной команде ssh из hostA.

Чтобы это работало, вам нужно настроить ssh-ключи на вашем стартовом компьютере, чтобы вы могли быть userA @ hostA и войти в систему hostB как userB. Процесс создания открытого ключа ssh для userA @ hostA хорошо документирован. Если вы не создадите открытый ключ на hostA для userA и скопируете этот ключ на hostB как userB, то вам придется каждый раз вводить пароль - что разрушает радость автоматизации.

Андрей
источник
Может ли кто-либо, кто проголосовал против, оставить комментарий о том, почему они проголосовали? Падение голосов бессмысленно без информативной обратной связи. Спасибо. Я обратился к конкретному вопросу ОП с ответом, который имеет прямое отношение. Я не представляю новые технологии и не предлагаю альтернативные маршруты. Почему? возможно, OP не хочет использовать альтернативные маршруты.
Андрей