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

83

Я хочу загрузить файл из активного сеанса SSH. Во многих случаях я, возможно, мог использовать SFTP, scp , rsync et al, но бывают случаи, когда у меня есть повышенные разрешения на удаленном сервере, так что я не могу использовать эти методы. p>

Если вы пытаетесь понять, что я имею в виду, представьте, что вы хотели скачать что-то из /root/ или /var/log/auth.log . Корневой вход отключен (потому что мы не идиоты). Как вы получаете этот файл? Скопируйте его где-то менее защищенным, а затем переместите его? Это неуклюже. Существуют также сценарии, когда удаленный путь является сложным или временным, или даже не является путём, потому что я хочу, чтобы выходной файл удаленной команды хранился локально. Хранить удаленно, а затем скопировать? Clunk!

Есть несколько более неуклюжих способов достижения версий этих, но в идеальном мире, у меня будет что-то похожее на локальный доступ на запись с удаленного сервера, используя существующий сеанс SSH в качестве проводника. Что-то вроде (это просто впечатление художника):

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

И это просто появляется в моем локальном cwd . И двунаправленный доступ не будет плохой.

Прошло восемь долгих лет с тех пор, как я задал этот вопрос, и мы видели реальный диапазон clunk, но это остается проблемой, с которой я все еще иногда сталкиваюсь.

Я переформулировал вопрос во что-то гораздо более идеалистическое. Я полностью понимаю, что в настоящее время нет идеального ответа. Все прошлые и будущие усилия в отношении моего идеала оценены.

    
задан Oli 15.11.2010 в 14:59
источник

12 ответов

32

Вы можете проверить zssh , который доступен в юниверсе и, следовательно, доступен с помощью

sudo apt-get install zssh

Вам это нужно на вашем сервере ubuntu и на вашем клиенте, но в основном при входе в систему с zssh вы просто нажимаете «ctrl- @», и он вызывает «Режим передачи файлов», который позволяет отправлять файлы обратно вниз на клиентскую машину или загрузить их с клиента на сервер.

Однако вам не нужно повторно открывать или открывать новое окно для scp.

Если вы используете ssh-ключи и ssh-агент, вы можете легко сделать:

[enter]~[ctrl]-Z

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

Как только файл будет передан, fg , чтобы вернуть ssh.

Если вы не используете ssh-ключи, вы все равно можете использовать опции «ControlMaster» и «ControlPath», добавленные в последние версии OpenSSh, но это становится сложным, проверьте man ssh_config

    
ответ дан SpamapS 17.11.2010 в 00:46
источник
24

Предполагая, что вы запускаете ssh-сервер на своем рабочем столе (есть способы обойти это, но я думаю, что все они добавляют сложность и, возможно, проблемы с безопасностью), вы можете настроить обратный туннель ssh. См. SSH легко скопировать файл в локальную систему. на unix.SE .

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

последовательности экранов Ssh начинаются с ~ ; тильда распознается только после новой строки. ~ Ctrl+Z помещает ssh в фоновый режим. ~C входит в командную строку, где вы можете создать или удалить переадресацию.

    
ответ дан Gilles 15.11.2010 в 22:37
10

Я придумал способ сделать это со стандартным ssh. Это скрипт, который дублирует текущее соединение ssh, находит ваш рабочий каталог на удаленном компьютере и копирует обратно указанный вами файл на локальный компьютер. Для конфигурации ssh требуется 2 очень маленьких скрипта (1 удаленный, 1 локальный) и 2 строки. Эти шаги заключаются в следующем:

  1. Добавьте эти 2 строки в ваш ~/.ssh/config :

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

    Теперь, если у вас есть ssh-соединение с machineX open, вам не понадобится пароли, чтобы открыть другой.

  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 in ( ~/.bashrc или где угодно):

    alias grab=~/.grab.sh
    

Вот и все. Теперь, если вы вошли в machineX:/some/directory , просто запустите новый терминал и введите

grab machineX filename

Это помещает файл в ваш текущий рабочий каталог на локальный компьютер. Вы можете указать другое местоположение в качестве третьего аргумента для «захвата».

Примечание. Очевидно, что оба сценария должны быть «исполняемыми», то есть chmod u+x filename .

    
ответ дан user6702 30.11.2010 в 10:29
5

Если ваш клиентский компьютер (машина, на которой вы сидите), называется машиной А, а машина, на которой вы сейчас находитесь, называется машиной B. MachineA, ваша локальная машина должна иметь SSHD и открыть порт 22. Тогда:

scp myfile machineA:

Копирует myfile на MachineB в мой домашний каталог MachineA на machineA. Это предполагает, что идентификатор пользователя / пароль совпадают.

scp myfile machineA:/newdir/newname

Копирует myfile один MachineB в /newdir/newname на machineA. Это предполагает, что идентификатор пользователя / пароль совпадают.

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

Получает копию otherfile из моего каталога MachineA на MachineA и помещает ее в мой текущий рабочий каталог на MachineB (обозначенном стандартным способом UNIX символом «точка» (.)). Это предполагает, что идентификатор пользователя / пароль совпадают.

Если идентификатор пользователя / пароль не совпадают, используйте:

scp myfile user@MachineA: , чтобы получить файл.

scp user@MachineA:/path/to/my/otherfile . для размещения файлов

ПРИМЕЧАНИЯ о SCP:

Как и команда cp , scp имеет параметр -p для распространения настроек разрешения исходного файла на копию (в противном случае копия выполняется с нормальными настройками для новых файлов) и -r возможность копирования всего дерева каталогов с помощью одной команды.

scp создает полностью прозрачный зашифрованный канал данных между двумя машинами, поэтому двоичные данные (например, изображения или исполняемые программы) сохраняются правильно. Это также означает, что scp не может выполнить автоматическое окончательное окончание преобразования между различными типами операционных систем, что может быть сделано с ftp в режиме «ascii». Это не будет проблемой при копировании между Unix-системами, которые используют одно и то же соглашение конца строки.

    
ответ дан LukeInDC 07.12.2012 в 19:39
2

, если вы получаете доступ к серверу через ssh, вы получаете возможность подключаться через sftp. Храните файл filezilla client (GUI) удобным и вставьте путь, который вы сейчас используете.

    
ответ дан jet 16.11.2010 в 01:12
2

Если ваш файл достаточно мал, вы можете закодировать его с base64 и затем локализовать его локально:

remote.example.net$ base64 <myfile
(copy the output)
local.example.net$ base64 -d >myfile
(copy the output)
Ctrl+D

Оригинальный ответ, где я получил это (и протестировал): Ссылка

    
ответ дан wesalius 20.01.2017 в 19:17
1

Это не над активным соединением SSH, но scp копирует файлы, используя те же механизмы и разрешения, что и ssh.

    
ответ дан msw 15.11.2010 в 16:11
1

Это невозможно для сеанса ssh по умолчанию, но вы можете использовать скрипт вместо ssh, который запускает что-то вроде простого ftp или rsh-сервера в вашей локальной системе и запускает ssh с необходимыми параметрами для настройки туннеля назад на ваш рабочий стол для подключения к этому серверу.

    
ответ дан JanC 15.11.2010 в 17:45
1

konsole обладает этой способностью через меню «Редактировать > ZModem Upload», когда вы находитесь в удаленном сеансе (или Ctrl-Alt-U).

Обратите внимание: пакет lrzsz должен быть установлен первым. Для меня, похоже, работает только для загрузки файлов ASCII.

    
ответ дан jet 13.09.2015 в 20:58
0

Удивительно, но я не вижу упоминания о добром старом Midnight Commander . На мой взгляд, это, наверное, самый универсальный & amp; полезный файловый менеджер для оболочки с мощными возможностями, один из инструментов «должен иметь» для случая, который также позволяет вам подключаться через SSH, FTP, SFTP, а на второй панели вы можете открыть любой другой (ваш локальной) файловой системы и, следовательно, работать с файлами свободно.

Все, что вам нужно: apt-get install mc (из юниверса)

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

    
ответ дан Nex0 04.07.2018 в 13:10
0

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

Вот как я часто это делаю:

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

Это довольно просто, но его легко запомнить и не требует никакого дополнительного пакета для работы.

    
ответ дан gerlos 20.01.2018 в 09:59
-2

ПУТЬ overthinking это, люди. Я искал все глубокие, темные, сложные ответы. Оказывается, вы можете сделать это прямо из дельфина прямо из банки. рыба: // имя пользователя @ сервер: порт

    
ответ дан Victor 15.10.2018 в 01:19