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

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

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

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

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

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


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

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

88
задан 15 October 2018 в 13:57

12 ответов

Предполагая, что вы используете 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 . Введите fg Введите .

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

0
ответ дан 15 October 2018 в 13:57

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

0
ответ дан 15 October 2018 в 13:57
1115 Я придумал способ сделать это с помощью стандартного 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 [ 1119]

    \#!/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.

0
ответ дан 15 October 2018 в 13:57

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

enter image description here

0
ответ дан 15 October 2018 в 13:57

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

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

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

0
ответ дан 15 October 2018 в 13:57

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

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

0
ответ дан 15 October 2018 в 13:57

Если ваш клиентский компьютер (компьютер, на котором вы находитесь) называется machineA, а компьютер, на котором вы в настоящее время используете SSH, называется машиной B. MachineA, на вашем локальном компьютере должен быть запущен SSHD и открыт порт 22. Затем:

scp myfile machineA:

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

scp myfile machineA:/newdir/newname

Копирует myfile один MachineB в /newdir/newname на машине A. Предполагается, что 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, которые используют одинаковое соглашение о конце строки.

0
ответ дан 15 October 2018 в 13:57

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

0
ответ дан 15 October 2018 в 13:57

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

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

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

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

get the full path from first terminal, and then paste in the second terminal

0
ответ дан 15 October 2018 в 13:57

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

0
ответ дан 15 October 2018 в 13:57

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

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

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

0
ответ дан 15 October 2018 в 13:57

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

0
ответ дан 15 October 2018 в 13:57

Другие вопросы по тегам:

Похожие вопросы: