Я перенаправляю локальный порт через 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
К сожалению, это не работает как непривилегированный пользователь, потому что перенаправление портов выполняется sshd, который запускается от имени пользователя root.
Есть ли другой способ определить выделенный порт? Даже если это невозможно с bash, возможно ли это вообще с учетом протокола ssh?
К сожалению, как непривилегированный пользователь я не верю, что это возможно. Я сам довольно много это искал.
Для моих целей я разрешил своему «туннельному» пользователю sudo доступ к команде lsof. Я туннелирую службу в одной сети через своего клиента на сервер, чтобы к ней мог получить доступ любой пользователь сети серверов. Я не разрешаю этому пользователю делать что-либо еще (отсюда и "бесконечность сна", и у меня есть другие правила для отключения телетайпа и т. Д.)
/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
В настоящее время я собираюсь искать только один порт. Чтобы проверить более одного, потребуется модификация. Я удалил некоторые потенциально избыточные проверки ошибок, которые были в моем исходном скрипте. Если вы хотите, чтобы ваш пользователь имел доступ к телетайпу, могут потребоваться дополнительные изменения.