Чи можна використовувати команди Unix для копіювання файлу в моєму підкаталозі на віддалений комп'ютер через SSH?


17

У мене ~/Downloadsна моєму персональному комп’ютері серія програмних файлів завантажена в підкаталог . Я також використовую bash для віддаленого підключення до комп'ютера за допомогою ssh.

Чи можливо перенести цей файл через sshвіддалений комп'ютер?


Питання стосується сингулярного файлу ( this file) та декількох файлів ( a series of software files), найкраще рішення залежить від того, чи є у вас один файл чи кілька файлів.
користувач2768

Відповіді:


42

Ви можете використовувати scpдля цієї мети. Це безпечний засіб для передачі файлів за допомогою протоколу SSH.

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

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

Ви можете побачити більше прикладів тут .


5
Думаю, rsyncможе спрацювати і зараз, коли я замислююся над цим
ShanZhengYang

1
rsync далеко не складний лише для однієї руки чи повної файлів ...
Paebbels

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розповість, у скільки разів швидше це було зроблено простою копією знову.


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

4

Щоб додати до вищезазначених відповідей. Іноді я не зовсім впевнений у віддаленому шляху. У цих випадках я використовуюsftp спочатку переходжу до потрібного місця, а потім використовую get або put, щоб фактично завантажити або завантажити файл.

Якщо ви також хочете зберегти щось завжди синхронізоване і навіть хочете локально виконати якийсь файл, який знаходиться на віддаленій машині, sshfsчудово працює.


-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 на вашій стартовій машині, щоб ви могли бути користувачем @ @ hostA та увійти до hostB як userB. Процес створення відкритого ключа ssh для userA @ hostA добре задокументований. Якщо ви не створите відкритий ключ на хостіA для користувачаA і не скопіюєте цей ключ на hostB як userB, то ви будете змушені кожен раз вводити свій пароль - це знищує радість автоматизації.


Чи може хто-небудь, хто взяв участь у голосі, залишити коментар щодо того, чому він подав заяву? Голосування вниз є безглуздим без інформативного зворотного зв’язку. Дякую. Я вирішив конкретне питання ОП з відповіддю, що безпосередньо стосується. Я не впроваджую нові технології та не пропоную альтернативних маршрутів. Чому? можливо, ОП не хоче використовувати альтернативні маршрути.
Андрій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.