2008-09-08 3 views
14

При подключении к удаленным узлам через ssh я часто хочу принести файл в этой системе в локальную систему для просмотра или обработки. Есть ли способ скопировать файл без (a) открытия нового терминала/приостановки сеанса ssh (b) повторной аутентификации на локальном или удаленном хостах, который работает (c), даже если один или оба узла находятся за NAT-маршрутизатор?Каков наилучший способ принести файл с удаленного хоста на локальный хост через сеанс SSH?

Цель состоит в том, чтобы использовать как можно больше текущего состояния: существует соединение между двумя машинами, на котором я аутентифицирован на обоих, что я в рабочем каталоге файла, - Мне не нужно открывать другой терминал, копировать и вставлять удаленный хост и путь, что я и делаю сейчас. Лучшее решение также не требовало бы какой-либо настройки до начала сеанса, но если установка была разовой или автоматизированной, то это вполне приемлемо.

+0

Возможно, я что-то не понял, но почему вы не можете просто использовать scp напрямую? С сохраненными ключами вам также не нужно вводить какие-либо пароли. – 2008-09-08 15:46:05

+2

Проблема с использованием scp заключается в том, что вам нужно ввести имя/ipaddr локального хоста, аутентифицировать и т. Д. – Nick 2008-09-16 17:36:51

ответ

0

Это мое предпочтительное решение этой проблемы. Настройте обратный туннель ssh при создании сеанса ssh. Это упрощается с помощью двух функций bash: grabfrom() должен быть определен на локальном хосте, а grab() должен быть определен на удаленном хосте. Вы можете добавить любые другие переменные ssh, которые вы используете (например, -X или -Y), как вы сочтете нужным.

function grabfrom() { ssh -R 2202:127.0.0.1:22 ${@}; }; 
function grab() { scp -P 2202 [email protected] [email protected]:~; }; 

Использование:

localhost% grabfrom [email protected] 
password: <remote password goes here> 
remotehost% grab somefile1 somefile2 *.txt 
password: <local password goes here> 

Положительных:

  • Он работает без специального программного обеспечения на любом хосте за OpenSSH
  • Он работает, когда локальный хост находится за NAT маршрутизатор
  • Он может быть реализован как пара двух однострочных функций bash

Отрицательные:

  • Он использует фиксированный номер порта так:
    • не будет работать с несколькими подключениями к удаленному хосту
    • может вступать в противоречие с процессом с использованием порта на удаленный хост
  • Необходимо, чтобы у вас было предложение на торгах на localhost ssh
  • Это требует специальной команды о начале сеанса
  • Он не неявно обрабатывать аутентификацию на локальный хост
  • Это не позволяет указать целевой каталог на локальном хосте
  • Если вы захватите из нескольких localhosts в тот же удаленный хост, ssh не понравится смена клавиш

Будущая работа: Это по-прежнему довольно kludgy. Очевидно, что можно было бы решить проблему аутентификации, настроив соответствующие ключи ssh, и еще проще разрешить спецификацию удаленного каталога, добавив параметр для grab()

Сложнее решать другие негативы. Было бы неплохо выбрать динамический порт, но насколько я могу судить, нет элегантного способа передать этот порт оболочке на удаленном хосте; Насколько я могу судить, OpenSSH не позволяет вам устанавливать произвольные переменные среды на удаленном хосте, а bash не может принимать переменные окружения из аргумента командной строки. Даже если вы можете выбрать динамический порт, нет способа гарантировать, что он не будет использоваться на удаленном хосте без первого подключения.

-1

Вы должны иметь возможность устанавливать общедоступные & секретные ключи, чтобы не требовалось auth.

В какой форме вы это выполняете, это зависит от требований безопасности и т. Д. (Имейте в виду, что есть черви linux/unix ssh, которые будут искать ключи, чтобы найти другие хосты, которые они могут атаковать).

Я делаю это все время из-за ссылок Linksys и dlink. Я думаю, вам, возможно, придется изменить несколько настроек, но это не очень важно.

0

Для этого у меня есть мой домашний маршрутизатор, настроенный для переадресации порта 22 обратно на мой домашний компьютер (который подключен к брандмауэру, чтобы принимать только ssh-соединения с моей рабочей машины), и у меня также есть учетная запись, настроенная с DynDNS предоставить динамический DNS, который автоматически разрешит мой домашний IP-адрес.

Затем, когда я схожу на свой рабочий компьютер, первое, что я делаю, это запустить скрипт, запускающий ssh-agent (если ваш сервер не делает это автоматически). Сценарий я бегу это:

#!/bin/bash 

ssh-agent sh -c 'ssh-add < /dev/null && bash' 

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

Для остальной части сессии, отправка файлов обратно в свою машину так просто, как

scp file_to_send.txt your.domain.name:~/ 
+0

Было бы неплохо, если бы SCP/SFTP можно было использовать через уже открытое соединение SSH. Жаль, что для этого потребуется изменение протокола. – Powerlord 2008-09-24 18:20:01

+0

Но с аутентификацией с открытым ключом, нет никакого большого недостатка в открытии нового SSH-соединения. – 2008-09-25 18:24:52

+0

Этот комментарий на самом деле не затрагивает ни один из вопросов, которые задает этот человек, который должен повторно использовать существующее состояние без какой-либо дополнительной настройки раньше времени. Также SCP/SFTP может повторно использовать уже открытое SSH-соединение с помощью ControlMaster (-M), как указывали другие люди. И есть недостаток в открытии нового SSH-соединения без ControlMaster, для чего требуется время для переговоров по каждому новому соединению; на соединениях с высокой задержкой, которые могут быть весьма заметными. – aculich 2011-12-07 12:59:56

0

Вот hack called ssh-xfer, который обращается к точной задаче, но требует исправления OpenSSH, который является неудачником, насколько как я.

4

В ящике linux я использую ssh-agent и sshfs. Вам нужно настроить sshd для приема соединений с парами ключей. Затем вы используете ssh-add, чтобы добавить ключ к ssh-агенту, чтобы вы не вводили свой пароль каждый раз. Обязательно используйте -t секунд, чтобы ключ не оставался навсегда.
SSH-добавить -t 3600 /home/user/.ssh/ssh_dsa

После этого
SSHFS имя хоста:// PathToMountTo/
монтирует файловую систему сервера на вашем компьютере, так что вы имеете доступ к Это.

Лично я написал небольшой скрипт bash, который добавляет мой ключ и монтирует серверы, которые я использую больше всего, поэтому, когда я начинаю работать, мне просто нужно запустить скрипт и ввести мою кодовую фразу.

8

zssh (a ZMODEM обертка поверх openssh) делает именно то, что вы хотите.

  • Установить zssh и использовать его вместо OpenSSH (который я предполагаю, что вы обычно используете)

  • Вы должны иметь lrzsz пакет, установленный на обеих системах.

Затем, чтобы передать файл zyxel.png с удаленного на локальный хост:

[email protected]:~$ zssh remote 
Press ^@ (C-Space) to enter file transfer mode, then ? for help 
... 
[email protected]:~$ sz zyxel.png 
**B00000000000000 
^@ 
zssh > rz 
Receiving: zyxel.png 
Bytes received: 104036/ 104036 BPS:16059729 

Transfer complete 
[email protected]:~$ 

Выгрузка идет аналогично, за исключением того, что вы просто включите rz(1) и sz(1).

Putty пользователи могут попробовать Le Putty, который имеет схожие функции.

-1

Use the -M switch.

«Размещает SSH клиент в режиме„мастер“для подключения ШАР-ков. Несколько вариантов -М помещает SSH в режим` `мастер„“с подтверждением требуется до ведомые соединения принимаются Подробнее см. Описание ControlMaster в ssh_config (5) ».

Я не совсем понимаю, как это отвечает на вопрос OP еще - вы можете расширить это немного, Дэвид?

1

Использование ControlMaster (переключатель -M) - лучшее решение, проще и проще, чем остальные ответы здесь. Это позволяет вам обмениваться одним соединением между несколькими сеансами. Похоже, он делает то, что хочет плакат. Однако вам все равно придется вводить командную строку scp или sftp. Попробуй. Я использую его для всех своих sshing.

2

Используя некоторые малоизвестные и редко используемые функции реализации openssh , вы можете выполнить именно то, что хотите!

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

Вы должны набирать только то, что есть у каждого из local>, remote> и ssh> в примерах ниже.

local> ssh [email protected] 
remote> ~C 
ssh> -L6666:localhost:6666 
remote> nc -l 6666 < /etc/passwd 
remote> ~^Z 
[suspend ssh] 
[1]+ Stopped     ssh [email protected] 
local> (sleep 1; nc localhost 6666 > /tmp/file) & fg 
[2] 17357 
ssh [email protected] 
remote> exit 
[2]- Done     (sleep 1; nc localhost 6666 > /tmp/file) 
local> cat /tmp/file 
root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin:/sbin/nologin 
daemon:x:2:2:daemon:/sbin:/sbin/nologin 
... 

Или чаще вы хотите пойти в другом направлении, например, если вы хотите сделать что-то вроде передачи файла ~/.ssh/id_rsa.pub из ваших локальной машины в ~/.ssh/authorized_keys файл удаленного машины.

local> ssh [email protected] 
remote> ~C 
ssh> -R5555:localhost:5555 
remote> ~^Z 
[suspend ssh] 
[1]+ Stopped     ssh us[email protected] 
local> nc -l 5555 < ~/.ssh/id_rsa.pub & 
[2] 26607 
local> fg 
ssh [email protected] 
remote> nc localhost 5555 >> ~/.ssh/authorized_keys 
remote> cat ~/.ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2ZQQQQBIwAAAQEAsgaVp8mnWVvpGKhfgwHTuOObyfYSe8iFvksH6BGWfMgy8poM2+5sTL6FHI7k0MXmfd7p4rzOL2R4q9yjG+Hl2PShjkjAVb32Ss5ZZ3BxHpk30+0HackAHVqPEJERvZvqC3W2s4aKU7ae4WaG1OqZHI1dGiJPJ1IgFF5bWbQl8CP9kZNAHg0NJZUCnJ73udZRYEWm5MEdTIz0+Q5tClzxvXtV4lZBo36Jo4vijKVEJ06MZu+e2WnCOqsfdayY7laiT0t/UsulLNJ1wT+Euejl+3Vft7N1/nWptJn3c4y83c4oHIrsLDTIiVvPjAj5JTkyH1EA2pIOxsKOjmg2Maz7Pw== [email protected] 

Немного пояснений на порядок.

Первым шагом является открытие LocalForward; если вы уже не имеете один установлены, то вы можете использовать символ ~C выхода, чтобы открыть командную строку SSH, который даст вам следующие команды:

remote> ~C 
ssh> help 
Commands: 
     -L[bind_address:]port:host:hostport Request local forward 
     -R[bind_address:]port:host:hostport Request remote forward 
     -D[bind_address:]port     Request dynamic forward 
     -KR[bind_address:]port     Cancel remote forward 

В этом примере я устанавливаю LocalForward на порт 6666 localhost как для клиента, так и для сервера; номер порта может быть любым произвольным открытым портом .

nc команда из пакета netcat; он описывается как «Точный армейский нож TCP/IP»; это простая, но очень гибкая и полезная программа . Сделайте его стандартной частью вашего инструментального инструмента unix.

На данный момент nc прослушивает порт 6666 и ждет другой программы для подключения к этому порту, чтобы он мог отправить содержимое /etc/passwd.

Далее мы используем другого экранирующего символа ~^Z, который tilde с последующим control-Z. Это временно приостанавливает процесс ssh, а возвращает нас обратно в нашу оболочку.

Один обратно на локальной системе, вы можете использовать nc для подключения к пересылаемой порту 6666. Обратите внимание на отсутствие -l в данном случае, потому что опция говорит nc слушать на порту, как если бы это был сервер, который Не то, что мы хотим; вместо этого мы хотим просто использовать nc в качестве клиента к подключиться к уже прослушивающему nc на удаленной стороне.

Остальная часть магии вокруг команды nc требуется, потому что если вы помните, выше я сказал, что процесс ssh был временно приостановлено, так что & поставит весь (sleep + nc) выражение в фоновом режиме и sleep дает вам достаточно времени для ssh до вернуться на передний план с fg.

Во втором примере идея является в основном то же самое, за исключением мы создали туннель идти в другом направлении, используя -R вместо -L так что мы устанавливаем RemoteForward. А затем на локальной стороне находится , вы хотите использовать аргумент -l для nc.

характер побега по умолчанию является ~ но вы можете изменить это с:

-e escape_char 
     Sets the escape character for sessions with a pty (default: ‘~’). The escape character is only recognized at the beginning of a line. The escape character followed by a dot 
     (‘.’) closes the connection; followed by control-Z suspends the connection; and followed by itself sends the escape character once. Setting the character to “none” disables any 
     escapes and makes the session fully transparent. 

Полное объяснение доступных команд с символами эвакуационных доступно в ssh manpage

ESCAPE CHARACTERS 
    When a pseudo-terminal has been requested, ssh supports a number of functions through the use of an escape character. 

    A single tilde character can be sent as ~~ or by following the tilde by a character other than those described below. The escape character must always follow a newline to be interpreted 
    as special. The escape character can be changed in configuration files using the EscapeChar configuration directive or on the command line by the -e option. 

    The supported escapes (assuming the default ‘~’) are: 

    ~.  Disconnect. 

    ~^Z  Background ssh. 

    ~#  List forwarded connections. 

    ~&  Background ssh at logout when waiting for forwarded connection/X11 sessions to terminate. 

    ~?  Display a list of escape characters. 

    ~B  Send a BREAK to the remote system (only useful for SSH protocol version 2 and if the peer supports it). 

    ~C  Open command line. Currently this allows the addition of port forwardings using the -L, -R and -D options (see above). It also allows the cancellation of existing remote port- 
      forwardings using -KR[bind_address:]port. !command allows the user to execute a local command if the PermitLocalCommand option is enabled in ssh_config(5). Basic help is avail‐ 
      able, using the -h option. 

    ~R  Request rekeying of the connection (only useful for SSH protocol version 2 and if the peer supports it). 
Смежные вопросы