Как выбрать незанятый remote port для «ssh -R»
================================================

 Нужно сделать remote port forwarding, т.е. открыть свободный remote port с пробросом его на local port. Но при этом какой-то определенный remote port выбирать нельзя, ибо он может быть уже занят. В идеале было бы сказать ssh открыть свободный remote port, пробросить его на свободный local port, сказать мне какие порты были выбраны, чтобы я смог поднять слушающий local port и сообщить всем о поднятом remote port. Таким образом установилось бы remote port forwarding соединение с динамически выбранными портами. 

 Думается мне, что без костылей это не решается…  

Так что вариант у меня только один — писать скрипт:  

1 — генерим случайное число  

2 — по ssh лезем и netstat (sockstat в случае FreeBSD) проверяем свободен ли порт  

3 — анализируем результат, если порт свободен, то запоминаем  

4 — проводим аналогичную процедуру (п. 1-3) для локального порта  

5 — выполняем ssh подключение с port forwarding  

6 — сообщаем какие порты были задействованы 

 если не ошибаюсь когда указываешь порт «0» sshd сам выбирает случайный порт и сообщает клиенту. 

 ssh -R 0 помогает, но как выяснилось, не все SSH-сервера разрешают подключаться к remote port из вне, поэтому FTP сервер не может соединиться к remote port (и FTP сервер не поддерживает пассивный режим). Вывод: общую задачу по работе с FTP через SSH не решить. В частном можно. В моем случае оказалось достаточно команды STAT, которая показывает список файлов в папке без создания канала передачи данных, в отличии от команды LIST, которая делает тоже самое, но пытается создать канал передачи данных. 

 Вот тут я описал сценарий, где за каждым клиентским устройством резервируется TCP порт:   

[txlab.wordpress.com/2012/03/14/improved-call-home-ssh-scripts/](http://txlab.wordpress.com/2012/03/14/improved-call-home-ssh-scripts/)