Получить локальный порт при использовании перенаправления ssh с динамическим (0) портом

Я перенаправляю локальный порт через ssh на удаленный сервер. Поскольку я не хочу отслеживать, какие порты доступны, я указываю 0 для удаленного локального порта:

ssh -R0:127.0.0.1:9100 example.com

Теперь я хочу определить порт, выделенный sshd из удаленной системы. Это возможно при наличии таких привилегий root:

$ ssh -R0:127.0.0.1:9100 root@example.com
# ss -4lntp|grep pid=$(ps -o ppid= -p $$),|awk '{print $4}'
127.0.0.1:39152

К сожалению, это не так ' t работать как непривилегированный пользователь, потому что переадресация порта выполняется sshd, который работает от имени пользователя root.

Есть ли другой способ определить выделенный порт? Даже если это невозможно с bash, возможно ли это вообще с учетом протокола ssh?

1
задан 16 June 2017 в 20:10
1 ответ

К сожалению, я не верю, что это возможно для непривилегированного пользователя. Я сам довольно много это искал.

Для моих целей я разрешил своему "туннельному" пользователю sudo доступ к команде lsof. Я туннелирую службу в одной сети через своего клиента на сервер, чтобы к ней мог получить доступ любой пользователь сети серверов. Я не разрешаю этому пользователю делать что-либо еще (отсюда и «бесконечность сна», и у меня есть другие правила для отключения TTY и т.п.)

/ etc / sudoers

tunnel ALL=NOPASSWD:/usr/bin/lsof *

Использование этого скрипта сообщает о подключенном порте в окно клиента

#!/bin/bash

#ip and port used by client to connect to server
ip=`echo $SSH_CLIENT | awk '{ print $1 }'`
sport=`echo $SSH_CLIENT | awk '{ print $2 }'`
search="$ip:$sport"
echo "Connected through $search"

#returns the PID of the SSH Session
spid=`sudo lsof -i 4 -n -P | grep "$search" | grep "tunnel" | awk '{ print $2 }'`

#uses the pid of SSH session to find the tunneled port
port=`sudo lsof -i 4 -n -P | grep "$spid" | grep "*:" | awk '{ print $9}' | sed 's/[^0-9]*//g'`
if [ -z "$port" ]
then
    #port returned empty
    echo "Unable to open tunnel. Please try again."
    echo "   session closing in $i seconds"
    sleep 10
else
    echo "You've been assigned port $port"
    sleep infinity
fi

Затем я принудительно запускаю эту рекомендацию при входе в систему из файла / etc / sshd_config

Match User tunnel
    ForceCommand /home/tunnel/tunnel.sh

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

0
ответ дан 4 December 2019 в 04:50

Теги

Похожие вопросы