Por lo general, esto se puede hacer con expect
. Puede hacer que recupere la contraseña del entorno, pásela a base64
y recupere la salida. Luego genere el ssh, espere el indicador $
del shell y envíele el comando sudo
. Cuando se vea la solicitud de contraseña de sudo, envíe la contraseña decodificada, luego continúe dentro de lo esperado de la manera habitual con interact
. Coloque lo siguiente en un archivo y hágalo ejecutable, luego llámelo con su nombre de host como argumento.
#!/usr/bin/expect -f
# https://unix.stackexchange.com/a/422651/119298
log_user 0
spawn base64 -d
send $env(mypword)\n\x04
expect -nobrace -re "\n(.+)$"
close
set output $expect_out(1,string)
spawn ssh -q -t [lindex $argv 0]
expect {$ }
send "sudo echo hi\n"
expect -nobrace -re {.sudo. password.*:}
send "$output\n"
expect "\n"
interact
Как только SSH-соединение будет установлено, вы увидите прослушивающий сокет на порту 9000 :
.$ ss -o state listening 'sport = 9000'
Netid Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp 0 128 127.0.0.1:9000 *:*
tcp 0 128 ::1:9000 :::*
Вы не увидите подключения к google.com
, пока не будет установлено подключение к порту 9000; бежать
$ nc localhost 9000
, затем в другом терминале вы увидите что-то вроде
$ ss -o state established 'dport = 80'
Netid Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp 0 0 10.10.10.2:34948 216.58.204.142:http
с одноранговым адресом, принадлежащим Google.
Есть много дополнительных способов сделать это:
Вы можете запустить свою команду ssh
с опцией -v
, и там будет информация о переадресации:
debug1: Local connections to LOCALHOST:9000 forwarded to remote address google.com:80
debug1: Local forwarding listening on ::1 port 9000.
debug1: channel 0: new [port listener]
debug1: Local forwarding listening on 127.0.0.1 port 9000.
debug1: channel 1: new [port listener]
Запустите netstat -tulpn
, и вы должны увидеть, есть ли запись с ssh
, работающая на порту 9000. Это показывает порты прослушивания. Он не показывает активно переадресованные соединения!
# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 15557/ssh
В текущем открытом сеансе, который перенаправляет порты, просто быстро нажмите ~#
, и вы должны увидеть, использует ли что-либо ваш туннель прямо сейчас (вы можете попробовать подключиться к вашему локальному хосту :9000 с помощью команды telnet
и посмотреть что происходит ).
The following connections are open:
#2 client-session (t4 r0 i0/0 o0/0 e[write]/4 fd 6/7/8 sock -1 cc -1)
#3 direct-tcpip: listening port 9000 for google.com port 80, connect from 127.0.0.1 port 57060 to 127.0.0.1 port 9000 (t4 r1 i0/0 o0/0 e[closed]/0 fd 9/9/-1 sock 9 cc -1)
Также netstat -tulpn
должен сообщить вам об открытых портах на этой машине, но нет гарантии, что эти открытые порты являются теми, которые вы сделали при подключении. Большую часть времени у вас не будет root-доступа к удаленному компьютеру, поэтому вы не сможете проверить PID сеанса SSH и PID в результатах netstat
.