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

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

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

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

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

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


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

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

84
задан 15.10.2018, 23:57

11 ответов

Если ваш клиентский компьютер (компьютер, на котором вы находитесь) называется 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
ответ дан 24.04.2019, 20:41
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
ответ дан 24.04.2019, 20:41
  • 1
    Интересно, не могли бы вы объяснить, как это работает? Вы можете расширить это, чтобы поддержать & quot; ставить & quot; файлы, а также захват их? – Will Sheppard 22.06.2014, 14:55

Предполагая, что вы используете 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
ответ дан 24.04.2019, 20:41
  • 1
    Использование 2-х уровней шифрования & amp; сжатие немного излишне, поэтому я предложил использовать rsh или ftp для «обратной ссылки». – Phil C 16.11.2010, 12:30
  • 2
    @JanC: это требует дополнительной настройки: вам нужно установить rsh или ftp сервер и убедиться, что его конфигурация безопасна. Затраты на шифрование минимальны даже на нетбуках. – Pablo Bianchi 16.11.2010, 12:42
  • 3
    Ssh-сервер также не установлен по умолчанию. ;) – menteith 16.11.2010, 12:50
  • 4
    @JanC: еще одно преимущество ssh в том, что если вы включили переадресацию агента, вам не нужно будет вводить пароль для копирования. Эффективность рабочего процесса над вычислительной микроэффективностью. – Jan 16.11.2010, 20:23
  • 5
    Конечно, вы можете сделать что-то подобное и с (некоторыми) другими службами. В любом случае, существует множество похожих решений, которые включают в себя настройку туннельного соединения и дополнительного демона ...;) – Peter Mortensen 16.11.2010, 20:56

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

enter image description here

0
ответ дан 24.04.2019, 20:41
  • 1
    Это принесло бы пользу более подробно, в том числе о том, как подключиться к SSH-серверу с помощью FileZilla (это не очевидно). Снимки экрана также могут помочь, в дополнение к пояснительному тексту . – Community 08.09.2012, 20:49

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

Если ваш файл достаточно мал, вы можете кодировать его с помощью 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
ответ дан 24.04.2019, 20:41
  • 1
    Какое это имеет отношение к чему-либо? Вам не нужно кодировать файлы в txfr с помощью scp и т. Д. – ceejayoz 28.09.2018, 19:05

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

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

0
ответ дан 24.04.2019, 20:41

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

0
ответ дан 24.04.2019, 20:41
  • 1
    Я не понимаю этого – wadim 15.10.2018, 16:54
  • 2
    Я не думаю, что вы понимаете мой вариант использования. Я нахожусь в активном сеансе командной строки SSH и хочу отправить файл обратно на мой локальный компьютер из [потенциально привилегированного, то есть недоступного через SFTP] местоположения. Это может даже не быть файл в его происхождении, это может быть вывод команды. Я ищу способ вернуть его обратно без создания промежуточных файлов и запуска новых сеансов SFTP / SCP / etc. – Mowgli 15.10.2018, 23:39

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

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

  • с первого терминала, с которого запущен сеанс 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
ответ дан 24.04.2019, 20:41
  • 1
    Не помогает & quot; попытка получить корневой файл и прямой вход в систему root запрещен & quot; проблема, поставленная в вопросе. – Tony Wall 20.01.2018, 22:04

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

0
ответ дан 24.04.2019, 20:41

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

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

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

0
ответ дан 24.04.2019, 20:41