Завантажте файл через активний сеанс SSH


86

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

Якщо ви намагаєтесь зрозуміти, що я маю на увазі, уявіть, що ви хочете щось завантажити з /root/або /var/log/auth.log. Кореневий вхід вимкнено (тому що ми не ідіоти). Як отримати цей файл? Скопіюйте його десь менш захищеним, а потім перемістіть? Це незграбно. Існують також сценарії, коли віддалений шлях є складним або тимчасовим, або це навіть не шлях, тому що я хочу, щоб вихід віддаленої команди зберігався локально. Зберігати віддалено, потім копіювати? Кланку!

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

$oli@remote: cp /root/cheesecake /local/

І він просто з’являється в моєму місцевому cwd. І двосторонній доступ не буде поганою справою.


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

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


1
Цікаве запитання! Це дійсно показує, як уявлення людей про те, що розумно робити, формуються інструментами, якими вони користуються. zsshймовірно, найближчий до zmodem-подібного робочого процесу, який ви можете пам’ятати.
poolie

1
Я дуже здивований, що навіть після 8 відповідей, насправді немає жодного способу зробити це
ендоліт

Відповіді:


34

Ви можете перевірити zssh , який доступний у Всесвіті і тому доступний у

sudo apt-get install zssh

Вам це потрібно на сервері ubuntu та на клієнті, але в основному, коли ви входите в систему за допомогою zssh, ви просто натискаєте "ctrl- @", і він відкриває "режим передачі файлів", який дозволяє вам надсилати файли назад по трубі на ваш клієнтської машини або завантажуйте їх з клієнта на сервер.

Однак вам не доведеться повторно писати авторизацію чи відкривати нове вікно, щоб сканувати.

Якщо ви використовуєте ключі ssh та ssh агент, ви можете легко:

[enter]~[ctrl]-Z

Який буде фоном ssh, а потім просто scp $!:/whatever/whatever .'

Після передачі файлу, fgщоб отримати ssh назад.

Якщо ви не використовуєте ключі ssh, ви все одно можете використовувати параметри "ControlMaster" та "ControlPath", додані до останніх версій OpenSSh, але це стає складним, перевірте man ssh_config


24

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

  • Введіть, Enter ~C Enter -R 22042:localhost:22 Enterщоб створити зворотну переадресацію порту зі свого сервера на робочий стіл (22042 може бути будь-яким номером порту між 1024 та 65534, який не використовується).
  • Потім scp -P 22042 foo localhost:скопіюйте файл fooу поточному каталозі на сервері до вашого будинку на робочому столі.
  • Тепер перемістіть файл у поточний каталог на робочому столі, ввівши Enter ~ Ctrl+ Z mv ~/foo . Enter fg Enter.

Ssh послідовності втечі починаються з ~; тильда розпізнається лише після нового рядка. ~ Ctrl+Zставить ssh на другий план. ~Cвводить командний рядок, де можна створити або видалити переадресацію.


1
Використання 2-х шарів шифрування та стиснення є трохи надмірним, тому я запропонував використовувати rsh або ftp для "зворотного посилання".
січня

2
@JanC: Для цього потрібні додаткові настройки: вам потрібно встановити rsh або ftp-сервер і переконатися, що його конфігурація захищена. Накладні витрати на шифрування мінімальні навіть у нетбуках.
Жиль

Не встановлено також ssh-сервер за замовчуванням. ;)
JanC

@JanC: Ще одна перевага ssh полягає в тому, що якщо ви ввімкнули переадресацію агента, вам не доведеться вводити пароль, щоб зробити копію. Ефективність робочого процесу над обчислювальною мікроефективністю.
Жиль

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

10

Я придумав спосіб це зробити за допомогою стандартного ssh. Це сценарій, який дублює поточне з'єднання ssh, знаходить свою робочу директорію на віддаленій машині та копіює назад файл, який ви вказали, на локальну машину. Потрібно 2 дуже маленьких сценаріїв (1 віддалений, 1 локальний) та 2 рядки у вашій конфігурації ssh. Кроки такі:

  1. Додайте ці 2 рядки до своїх ~/.ssh/config:

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p
    

    Тепер якщо у вас відкрито ssh-з'єднання з machineX, вам не потрібні паролі, щоб відкрити ще один.

  2. Зробіть 1-рядковий скрипт на віддаленій машині під назвою ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. Складіть сценарій на локальній машині під назвою ~ / .grab.sh

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. і зробіть псевдонім для grab.sh в ( ~/.bashrcабо в будь-якому місці):

    alias grab=~/.grab.sh
    

Ось і все, зроблено. Тепер, якщо ви ввійшли в систему machineX:/some/directory, просто запустіть новий термінал і введіть

grab machineX filename

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

Примітка: Очевидно, що обидва сценарії повинні бути "виконуваними", тобто chmod u+x filename.


Цікаво, ви могли б пояснити, як це працює? Чи можете ви розширити це на підтримку "розміщення" файлів, а також захоплення їх?
Пітер Гібсон

5

Якщо ваша клієнтська машина (машина, за якою ви сидите) називається machineA, а машина, на якій ви зараз перебуваєте в SSH, називається машина B. MachineA, ваша локальна машина повинна мати SSHD і відкритий порт 22. Тоді:

scp myfile machineA:

Копіює myfileна MachineB в домашній каталог MachineA на machineA. Це передбачає, що userid / пароль однакові.

scp myfile machineA:/newdir/newname

Копії myfileодин MachineB до /newdir/newnameна machineâ. Це передбачає, що userid / пароль однакові.

scp MachineA:/path/to/my/otherfile . 

Отримує копію otherfileз мого каталогу MachineA на MachineA і розміщує її в моєму поточному робочому каталозі на машині MachineB (позначається стандартним способом UNIX символом "крапка" (.)). Це передбачає, що userid / пароль однакові.

Якщо userid / пароль не однакові, використовуйте:

scp myfile user@MachineA: отримати файл.

scp user@MachineA:/path/to/my/otherfile . ставити файли

ПРИМІТКИ про SCP:

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

scpстворює повністю прозорий зашифрований канал даних між двома машинами, тому двійкові дані (наприклад, зображення чи виконувану програму) зберігаються правильно. Це також означає, що scpнеможливо виконати автоматичне перетворення терміналу в кінці рядка між різними типами операційних систем, як це можна зробити за допомогою ftp в режимі "ascii". Це не буде проблемою при копіюванні між системами Unix, які використовують одну і ту ж конвенцію.


2

якщо ви отримуєте доступ до сервера через ssh, ви також отримуєте можливість підключення через sftp. Тримайте підручник filezilla client (GUI) під рукою та вставте шлях, який ви зараз перебуваєте

введіть тут опис зображення


2
Цьому піде на користь більш детальна інформація, включаючи підключення до SSH-сервера з FileZilla (це не очевидно). Скріншоти також можуть допомогти, крім пояснювального тексту .
Елія Каган

2

Якщо ваш файл досить малий, ви можете кодувати його з base64, а потім декодувати його локально:

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

Оригінальна відповідь, де я це отримав (і перевірив) з: https://unix.stackexchange.com/a/2869/194134


Що це стосується будь-чого? Вам не потрібно кодувати файли, щоб їх txfr за допомогою scp тощо.
HörmannHH,

1

Це не через активне з’єднання SSH, але scp копіює файли, використовуючи ті самі механізми та дозволи, що й ssh.


4
Я знаю про scp, але це дуже непересічний робочий процес. Якщо я працюю у певному віддаленому каталозі, мені потрібно отримати віддалений шлях, відключити (або породити ще одну оболонку), виконати скрепінг, виписавши шляхи, а потім знову підключитися. Я шукаю щось, що схоже на написання, get fileі це чарівно з'являється на моїй локальній машині. Якщо це потрібно зробити через якусь службу, тунельовану через SSH, так і бути. Але це має бути обмежено сеансом.
Олі

Плюс його витіснив sftp (див. Мою відповідь)
Олів'є Лалонде

@Oli - Оскільки обидва кінці транзакції є * nix полями, вони, ймовірно, обидва sshdзапущені, і тому ви повинні мати можливість використовувати scpв командному рядку сервера для повернення файлів до клієнта. Є лише стільки магії, щоб обійтись; іноді нам все одно доводиться натискати кнопки. Рішення FileZilla також зручно.
нульова пропускна здатність

1

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


Або може просто scp / rsync ...
HörmannHH

1

konsole має таку можливість через меню "Правка-> Завантаження ZModem", коли ви перебуваєте на віддаленому сеансі (або Ctrl-Alt-U).

Зверніть увагу: пакунок lrzszповинен бути встановлений спочатку. Для мене це виглядає як працює лише для завантаження файлів ASCII.


0

Оскільки ви підключаєтесь з робочого столу, я думаю, ви можете відкрити другий термінал.

Ось як це я часто роблю:

  • з першого терміналу, того, де працює сеанс ssh, я отримую повний шлях до файлу, який мені потрібно отримати, використовуючи один realpath myfileабо readlink -f myfile(старіші випуски Ubuntu не попередньо встановлюють realpath) та копіюють його.
  • з другого терміналу я використовую scpабо sftpотримую файл, вставляючи повний шлях, який я раніше отримав. Наприклад:scp user@host:/etc/some/file ./

Це досить просто, але його також легко запам'ятати і не потрібен додатковий пакет для роботи.

отримати повний шлях від першого терміналу, а потім вставити у другий термінал


Не допомагає проблема "спроба отримати кореневий файл і вхід безпосередньо через root заборонений", поставлена ​​у питанні.
Олі

0

Дивно, але я не бачу тут жодної згадки про старого доброго північного командира . На мій погляд, це, мабуть, самий універсальний і корисний файловий менеджер для оболонки з потужними можливостями, один із інструментів "must have" для цього випадку, який також дозволяє вам підключатись через SSH, FTP, SFTP, перебуваючи на на другій панелі ви можете відкрити будь-яку іншу (вашу локальну) файлову систему і так вільно працювати з файлами.

Все, що вам потрібно, це: apt-get install mc (з всесвіту)

Після цього запустіть mc, відкрийте меню для лівої чи правої панелі, виберіть з'єднання оболонки, введіть ім'я користувача @ remote-ip, пароль - власне, це .. копіюйте (тут: завантажте) файли / папки з однієї машини на іншу за допомогою F5, рухайтеся за допомогою F6 і так далі, відповідно до кнопок нижче. Для старих користувачів MS: так само, як у NC для DOS


-2

ШЛЯХ передумуючи це, люди. Я шукав і всі глибокі, темні, складні відповіді. Виявляється, це можна зробити прямо з Дельфіна прямо з банки. fish: // ім'я користувача @ сервер: порт


Я не розумію
Pierre.Vriens

Я не думаю, що ти розумієш моє використання. Я перебуваю на активному сеансі командного рядка SSH і хочу відправити файл на свій локальний комп'ютер з [потенційно привілейованого, тобто недоступного через SFTP] місця. Це може бути навіть не файл у своєму генезі, це може бути командний вихід. Я шукаю спосіб повернути його назад, не створюючи посередницьких файлів і не запускаючи нові сесії SFTP / SCP / тощо.
Олі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.