Используя некоторые малоизвестные и редко используемые функции реализации 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).
Возможно, я что-то не понял, но почему вы не можете просто использовать scp напрямую? С сохраненными ключами вам также не нужно вводить какие-либо пароли. – 2008-09-08 15:46:05
Проблема с использованием scp заключается в том, что вам нужно ввести имя/ipaddr локального хоста, аутентифицировать и т. Д. – Nick 2008-09-16 17:36:51