Скопіюйте файл назад у локальну систему за допомогою ssh


257

Якщо я ввійшов у систему через SSH, чи є спосіб скопіювати файл назад до моєї локальної системи, не запускаючи інший термінал або сеанс екрана і виконуючи scp або щось подібне, або не роблячи SSH з віддаленої системи назад до системи локальна система?


4
Якщо у вас є клієнт-сервер, ви завжди можете спробувати scp file.foo user@myclient.com:file.foo: P
rahmu

4
Напевно, але я не хочу дозволити доступ до свого комп’ютера з сервера, який належить компанії, в якій я працюю :) У мене так чи інакше є лише автентифікація на основі ключів, і це було б не надто безпечно, щоб ставити мій приватний ключ на сервері!
Naftuli Kay

2
Я не розумію вашої проблеми. Створіть нову пару ключів, скопіюйте загальнодоступну частину на ваші комп'ютери авторизовані ключі та після передачі видаліть цю лінію ще раз.
Нілс

8
Я роблю це багато, тому було б неефективно робити це кожного разу, коли мені хочеться скопіювати файл посеред сеансу SSH. Я просто шукаю спосіб, під час сеансу SSH-терміналу, підключитися до мого локального комп'ютера і змусити його відправити файл на віддалений сервер, не виходячи з поточного сеансу SSH.
Naftuli Kay

2
Проблема полягає в тому, що початковий вхід в ssh може бути болем (2fa або інші виклики, виходячи з ключа або пароля); у нас може не бути приватних осіб, щоб змінити конфігурацію ssh-сервера. Немає причини багато разів проводити переговори ключів, і що коли ми маємо сеанс, було б непогано використовувати цей сеанс для кількох речей.
дуанев

Відповіді:


139

Основне з'єднання

Найпростіше, якщо ви плануєте заздалегідь.

Відкрийте головне з'єднання вперше. Для наступних з'єднань маршрутизуйте ведені з'єднання через існуюче головне з'єднання. У вашому ~/.ssh/configналаштуванні спільний доступ до з'єднання відбувається автоматично:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Якщо запустити ssh-сеанс до того ж (користувача, порту, машини), що і існуюче з'єднання, другий сеанс буде тунельований над першим. Встановлення другого з'єднання не вимагає нової автентифікації і дуже швидко.

Тож, поки у вас є активний зв’язок, ви можете швидко:

Пересилання

За наявного з'єднання можна встановити зворотний ssh-тунель. У командному рядку ssh створіть віддалене переадресацію, проходячи, -R 22042:localhost:22де 22042 - це випадково вибране число, яке відрізняється від будь-якого іншого номера порту на віддаленій машині. Потім ssh -p 22042 localhostна віддаленій машині підключаєте вас назад до вихідної машини; ви можете використовувати scp -P 22042 foo localhost:для копіювання файлів.

Ви можете автоматизувати це далі за допомогою RemoteForward 22042 localhost:22. Проблема з цим полягає в тому, що якщо ви підключитесь до одного і того ж комп'ютера з кількома екземплярами ssh або якщо хтось інший використовує порт, ви не отримаєте переадресацію.

Якщо ви не ввімкнули дистанційне переадресацію з самого початку, ви можете це зробити на існуючому сеансі ssh. Тип Enter ~C Enter -R 22042:localhost:22 Enter. Докладнішу інформацію див. У посібнику "Утечі символів".

У цій темі помилок сервера також є якась цікава інформація .

Копіювати Вставити

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

remote.example.net $ base64 <мій файл
 (скопіюйте вихід)
local.example.net $ base64 -d> мій файл
 (вставте вміст буфера обміну)
Ctrl +D

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

remote.example.net$ tar -czf - myfile | xsel

local.example.net$ xsel | tar -xzf -

Якщо ми можемо переносити файли за допомогою SSH, навіщо людям все ще потрібно / використовувати SFTP?
Печер'є

3
@Pacerier Тому що SFTP - це спосіб передачі файлів за допомогою SSH.
Жиль

Навіщо людям навіть потрібен SFTP, якщо вони можуть передавати файли за допомогою SSH-без SFTP?
Пейсьєр

Метод копіювання-вставки особливо зручний при ланцюгових з'єднаннях (тобто стрибання через декілька хостів, щоб дійти до остаточного)
golimar

1
@Pacerier SFTP має кілька додаткових команд, таких як файли списку або видалення віддаленого файлу тощо.
rahmu

67

Ще одним простим способом (IMO) буде:

# to remote host
cat localfile.conf | ssh user@hostname 'cat -> /tmp/remotefile.conf'

# from remote host
ssh user@hostname 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

Або якщо ви віддаєте перевагу щось подібне до GUI, спробуйте Midnight Commander . Вони називають функцію Shell-Link . Більшість дистрибутивів мають їх у своїх пакетних системах як mc.


8
Чесно кажучи, я не розумію, чому це не схвалено. ОП попросили рішення без scp. Іноді, особливо як у моєму випадку, коли я перетворююсь на дуже каліченного маршрутизатора, наданого провайдером, у мене немає sftp, у мене немає scp, і навіть ftp сильно зламаний. Я знав, що можу це зробити, просто прийшов сюди, щоб переконатися, що мій синтаксис правильний.
Auspex

1
Блискуче! mcє найшвидшим у використанні.
Імек

2
Власне, це рішення не працює в моєму випадку. З тунелем, створеним з Windows до Linux, ви запускаєте шпаклівку, а не термінал. Цей метод - саме те, що я хотів, але не можу ним скористатися. Роздратований.
Бенджамін

1
Причина, через яку я не заявляю про це, полягає в тому, що вона не працюватиме, якщо клієнтська машина стоїть за спільним маршрутизатором (як корпоративна мережа). Припустимо, я на робочому комп’ютері, і я ввійшов у свій домашній сервер. Як скопіювати файл на робочий комп'ютер, пройшовши болі cd'ing через складні каталоги з пробілами та спеціальними символами?
Шрідхар Сарнобат

1
Це добре працює з двійковими даними. Я роблю це з tgzфайлами весь час :)
Флоріан Фіда

53

SSH підтримує декілька команд через символ втечі ( ~за замовчуванням):

$ ~?
Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

$ ~C
ssh> help
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KR[bind_address:]port                 Cancel remote forward
      !args                                  Execute local command

!args, Здається, ближче всього до того , що ви хочете. Зауважте, що вам потрібно буде PermitLocalCommandвключити у своєму /etc/ssh_configфайлі, щоб ~Cкоманди працювали (див. man ssh_config).

Ви можете повторно використовувати той же сеанс ssh, якщо ви налаштували ControlMasterв ssh_config. Якщо ви це зробите:

$ ~C
ssh> !scp file user@myserver:

ви технічно ніколи не виходили з сеансу ssh і не потребуєте повторної автентифікації. Напевно, складніше, ніж вам хотілося, але я не можу придумати інший простий спосіб.


Це все ще працює? Я не зміг знайти !argsв довідці повідомлення.
xuhdev

@xuhdev він все ще там на OpenSSH_7.2p2, argsне в першому повідомленні довідки ( ~?), але в другому (коли один входить в ssh>рядок з ~C, можна ввести helpв ssh>запрошенні)
sdaau

Це виглядає як хороше рішення (хоча я його ще не пробував), я не розумів, що ви можете отримати батьківський буфер командного рядка, стиль vim. На практиці можна просто віддати перевагу відкрити нову вкладку терміналу, щоб вони не забували, як повернутися до сеансу (наприклад, коли я ніколи не пам'ятаю, як вийти з emacs).
Шрідхар Сарнобат

37

Це все дуже складні методи.
Ви можете встановити віддалену файлову систему на локальній машині за допомогою sshfs:

mkdir -p /mnt/sshfs

root@IS1300:~# sshfs 192.168.1.2:/ /mnt/sshfs
root@IS1300:~# umount /mnt/sshfs

Потім ви можете скопіювати вставити файл з nautilus, gnome, konqueror, delfin, bash або будь-яким іншим.


4
Підключення з файлом ключів:sshfs -oIdentityFile=~/.ssh/keyfile.pem user@192.168.1.2:/ /mnt/sshfs/
sshow

15
  • Використовуйте ssh-xfer , модифікований ssh-агент, який ефективно перевантажує існуючий бічний канал ssh для використання передачі файлів.
  • Використовуйте zssh , який ефективно zmodem над ssh. Якщо ви коли-небудь використовували rzsz, це здасться вам дуже знайомим.
  • Зворотні ( -R, для віддалених до локальних) або передніх ( -L, для локальних до віддалених) портів для запуску передач файлів, припускаючи, що ви маєте прослуховування демонів, що передають файли, на іншому кінці.

Але нічого з цього насправді не потрібно, ІМО. Протокол SSH підтримує кілька каналів на одному з'єднанні, а клієнт OpenSSH підтримує мультиплексування. Якщо припустити, що у вас є ControlMasterі ControlPath налаштувати ( ControlPersistтеж корисно),

  # перше з'єднання
$ ssh пульт

  # буде мультиплексуватися через одне і те ж з'єднання, який відкрив початковий ssh
$ sftp віддалений

5
zmodem нагадує мені про завантаження останнього умовно-безкоштовного програмного забезпечення з місцевого BBS .. :-)
Stuart Woodward

Шлях xfer - це саме те, що я шукав, але чи знаєте ви, чому патч ssh-xfer не включений у OpenSSH вище? Якесь полум'я?
Ферран Басора

Дякуємо за підказку zssh! Я використовую tmux в Konsole, і через tmux мій "sz" з сервера більше не працює. Zssh вирішує мої проблеми!
0xAF

9

Ще простіший підхід: відкрийте Filezilla (або улюблений браузер ftp), відкрийте ssh-з'єднання до того самого сайту, знайдіть файл та перетягніть його до локальної файлової структури. Якщо ви не новачок у Filezilla, використовуйте функцію "менеджер сайтів", щоб наступного разу швидко підключитися.

Так, я знаю, що це очевидно для більшості з вас (і не саме по суті), але деякі (як я), які знайшли цю нитку в пошуку термінального рішення, можливо, не помітили очевидного.



Я вважаю, що сервер FileZilla - це лише Windows. Клієнт є кросплатформенним
Freedom_Ben

Можна навіть використовувати Caja, просто відкрити ssh://SERVER.
основні6

8

Що я вважаю найкращим та найефективнішим рішенням - це використання xclip-copyfileта використання xclip-pastefile.

На сервері ви використовуєте xclip-copyfileдля копіювання одного або декількох файлів. Потім ці файли доступні на вашому локальному сервері. Там можна використовувати xclip-pastefile.

Це обходить необхідність використання scpабо локального ssh-сервера. Наприклад, я використовую це з cygwin. Єдина проблема полягає в тому, що для цього потрібна установка, xclipякщо у вас її ще немає. О, і це працює і з бінарними файлами.


Нічого, це може бути кращим рішенням, ніж моє зворотне переадресація порту плюс netcat.
Шрідхар Сарнобат

3

Однією з багатьох причин, якими ми користуємось SecureCRT - незважаючи на те, що віддаємо перевагу програмному забезпеченню з відкритим кодом, де це практично - це простота передачі файлів. У світі F / OSS просто немає прямої заміни.

SecureCRT стартував як чиста програма Windows в середині 1990-х, але був перенесений на Mac OS X та Linux пару років тому .

SecureCRT має три основні функції для передачі файлів у та з системи, в яку ви знаходитесь SSH'd:

  • ZModem , YModem , XModem , Kermit та ASCII - SecureCRT - це старий шкільний емулятор терміналу, що підтримує декілька протоколів передачі файлів в діапазоні.

    Найпростіший у використанні - ZModem. Коли ви вводите щось на зразок sz file-to-downloadу віддаленому командному рядку, віддалена szпрограма виписує послідовність евакуації, яка повідомляє SecureCRT негайно почати завантаження file-to-downloadв каталог завантаження за замовчуванням.

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

    ( szце програма "відправити ZModem", частина lrzszпакету. Вона упакована для більшості систем Unixy. Якщо з певних причин у віддаленій системі її вже не встановлено, і ви не можете легко встановити двійковий пакет, вихідний пакет невеликий і дуже портативний. Не раз мені доводилося надсилати lrzsz "шархічний" або uuencode"d тарбол" у віддалену віддалену систему, щоб я міг ZModem файли до неї.)

  • SFTP - SecureCRT має чітко інтегровану базову реалізацію SFTP.

    Під «тісно інтегрованою» я маю на увазі, що коли ви віддаєте команду меню SFTP або комбінацію клавіш, вона відкриває нову вкладку, підключену до віддаленого сайту через те саме з'єднання SSH. Таким чином, вам не потрібно входити назад, і з'єднання встановлюється трохи швидше, ніж якщо б ви відкрили окреме SFTP-з'єднання з тим же сервером.

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

    Функція SFTP SecureCRT дозволяє вам налаштувати віддалені та локальні каталоги за замовчуванням, які є окремими від конфігурації ZModem.

    Ця функція SFTP має базовий інтерфейс для командного рядка, що імітує sftpпрограму OpenSSH , за винятком того, що вона має такі можливості, як Tabвиконання команди. Таким чином, отримати віддалений файл, який називається, somefile.tar.gzможе бути так само просто get soTabEnter.

  • Перетягування - якщо ви перетягуєте файл у вікно терміналу, він автоматично вводиться rzдля вас і починає надсилати файл.

    Ви також можете відкрити вкладку SFTP і перенести файл на цю вкладку, щоб надіслати її через SFTP. Таким чином, надіслати файл у віддалену систему може бути таким же простим, як Alt-P, перетягування , опускання .

    Ми виявляємо, що передачі відбуваються набагато швидше через SFTP, ймовірно, тому, що це протокол на основі TCP, тому він виграє від великих розсувних вікон сучасних стеків TCP / IP . ZModem був розроблений у дні, коли розмір блоку на 64 кіБ вважався "великим". Таким чином, велика кількість потенційної швидкості в ланцюзі просочена ZModem, в той час як кожен кінець чекає підтвердження блокової передачі.

    Одним із приємних моментів роботи режиму перетягування є те, що він використовує один із напруг у використанні ZModem. Коли ви набираєте rzвіддалену систему, SecureCRT автоматично вискакує інструмент вибору файлів. Потім у вас є близько хвилини, щоб знайти і вибрати файл до вичерпання віддаленого боку. Це створює гонку проти цілодобової вібрації, що не приємно. Перетягування дозволяє знайти файл у вільний час, а потім розпочати передачу одним швидким рухом миші.

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


1

Використовуйте "!" конвертувати файл у ASCII-представлення вашого файлу (наприклад, ! uuencode myfile.bin >uuencode.dat). Потім використовуйте ! cat uuencode.dat >target.dat. Після цього використовуйте uudecode на цільовій стороні:! uudecode target.dat >myfile.bin

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.