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


86

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

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

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

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

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


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

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


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

1
Я действительно удивлен, что даже после 8 ответов, на самом деле нет никакого способа сделать это
эндолит

Ответы:


34

Вы можете проверить 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


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.

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


1
Использование двух уровней шифрования и сжатия немного излишне, поэтому я предложил использовать rsh или ftp для «обратной ссылки».
Янв

2
@JanC: это требует дополнительной настройки: вам нужно установить rsh или ftp сервер и убедиться, что его конфигурация безопасна. Затраты на шифрование минимальны даже на нетбуках.
Жиль

Ssh-сервер также не установлен по умолчанию. ;)
JanC

@JanC: еще одно преимущество ssh в том, что если вы включили переадресацию агента, вам не нужно будет вводить пароль для копирования. Эффективность рабочего процесса над вычислительной микроэффективностью.
Жиль

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

10

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

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

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

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

  2. Создайте однострочный скрипт на удаленной машине с именем ~/.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. Это предполагает, что ID пользователя / пароль совпадают.

scp myfile machineA:/newdir/newname

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

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

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

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

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

scp user@MachineA:/path/to/my/otherfile . положить файлы

ЗАМЕЧАНИЯ о SCP:

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

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


2

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

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


2
Это принесло бы пользу более подробно, в том числе о том, как подключиться к SSH-серверу с помощью FileZilla (это не очевидно). Снимки экрана также могут помочь, в дополнение к пояснительному тексту .
Элия ​​Каган

2

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

remote.example.net $ base64 <myfile
 (скопируйте вывод)
local.example.net $ base64 -d> myfile
 (скопировать вывод)
Ctrl +D

Оригинальный ответ, где я получил это (и проверил) от: https://unix.stackexchange.com/a/2869/194134


Какое это имеет отношение к чему-либо? Вам не нужно кодировать файлы, чтобы передать их с помощью scp и т. Д.
HörmannHH

1

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


4
Я знаю о scp, но это очень разрозненный рабочий процесс. Если я работаю в заданном удаленном каталоге, мне нужно получить удаленный путь, отключить (или создать другую оболочку), выполнить поиск, записать пути и затем повторно подключиться. Я ищу что-то похожее на письмо, get fileи оно волшебным образом появляется на моей локальной машине. Если это нужно сделать через какой-то сервис, туннелированный через SSH, пусть будет так. Но оно должно быть привязано к сеансу.
Оли

Плюс это было заменено sftp (см. Мой ответ)
Оливье Лалонд

@Oli - Поскольку оба конца транзакции являются * nix-блоками, они, вероятно, оба sshdработают, и, следовательно, вы должны иметь возможность использовать scpв командной строке сервера для отправки файлов обратно клиенту. Вокруг столько магии; иногда нам все еще нужно нажимать кнопки. Решение FileZilla также удобно.
zerobandwidth

1

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


Или может просто scp / rsync ...
HörmannHH

1

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

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


0

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

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

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

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

получить полный путь от первого терминала, а затем вставить во второй терминал


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

0

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

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

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


-2

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


Я не понимаю
Pierre.Vriens

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