Использование некоторых малоизвестных и редко используемых функций openssh
Реализация вы можете выполнить именно то, что вы хотите!
- использует текущее состояние
- можете использовать рабочий каталог, где вы находитесь
- не требует настройки туннелирования до начала сеанса
- не требует открытия отдельного терминала или соединения
- может использоваться как разовая сделка в интерактивном сеансе или как часть автоматизированного сеанса
Вы должны печатать только то, что на каждом из local>
, remote>
и
ssh>
подсказок в примерах ниже.
local> ssh username@remote
remote> ~C
ssh> -L6666:localhost:6666
remote> nc -l 6666 < /etc/passwd
remote> ~^Z
[suspend ssh]
[1]+ Stopped ssh username@remote
local> (sleep 1; nc localhost 6666 > /tmp/file) & fg
[2] 17357
ssh username@remote
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 username@remote
remote> ~C
ssh> -R5555:localhost:5555
remote> ~^Z
[suspend ssh]
[1]+ Stopped ssh username@remote
local> nc -l 5555 < ~/.ssh/id_rsa.pub &
[2] 26607
local> fg
ssh username@remote
remote> nc localhost 5555 >> ~/.ssh/authorized_keys
remote> cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2ZQQQQBIwAAAQEAsgaVp8mnWVvpGKhfgwHTuOObyfYSe8iFvksH6BGWfMgy8poM2+5sTL6FHI7k0MXmfd7p4rzOL2R4q9yjG+Hl2PShjkjAVb32Ss5ZZ3BxHpk30+0HackAHVqPEJERvZvqC3W2s4aKU7ae4WaG1OqZHI1dGiJPJ1IgFF5bWbQl8CP9kZNAHg0NJZUCnJ73udZRYEWm5MEdTIz0+Q5tClzxvXtV4lZBo36Jo4vijKVEJ06MZu+e2WnCOqsfdayY7laiT0t/UsulLNJ1wT+Euejl+3Vft7N1/nWptJn3c4y83c4oHIrsLDTIiVvPjAj5JTkyH1EA2pIOxsKOjmg2Maz7Pw== username@local
Немного пояснений.
Первый шаг - открыть LocalForward
; если у вас еще нет
один установлен, то вы можете использовать escape-символ ~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 локального хоста
как для клиента, так и для сервера; номер порта может быть любым
произвольный открытый порт.
Команда nc
из пакета netcat
; это описывается как
«TCP / IP швейцарский армейский нож»; это простой, но очень гибкий и
полезная программа. Сделайте это стандартной частью вашего unix toolbelt.
В этот момент nc
прослушивает порт 6666 и ждет другого
Программа для подключения к этому порту, чтобы он мог отправить содержимое
/etc/passwd
.
Затем мы используем другой escape-символ ~^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.
Полное объяснение команд, доступных с escape-символами, доступно на справочной странице ssh
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).