Инструмент порта4me :
Находит бесплатный порт TCP в [1024,65535], который пользователь может открыть
разработан для работы в многопользовательских средах
дает разные пользователи, разные порты
дает пользователю тот же порт с течением времени с высокой вероятностью
дает разные порты для различных программных инструментов
Не требует конфигурации
может быть идеально воспроизведено на всех операционных системах и во всех общих языках программирования
Доступно для Bash, Python и R
Есть много инструментов для определения бесплатного порта TCP, где большинство из них возвращают случайный порт. Хотя это работает технически, это может добавить немало трения, если пользователь должен вводить новый случайный номер порта каждый раз, когда им необходимо использовать определенный инструмент.
Напротив, Port4me пытается, с высокой вероятностью, каждый раз предоставлять пользователю один и тот же порт, даже когда они используются в разные дни. Это достигает этого путем сканирования той же детерминированной, псевдолудочной последовательности портов и возврата первого обнаруженного свободного порта. Каждый пользователь получает свою собственную последовательность случайных портов, снижая риск для любого двух пользователей, чтобы запросить один и тот же порт. Случайность инициируется случайным семенем, которое является функцией имени пользователя ( USER ), и, необязательно, имени программного обеспечения, где мы используем порт.
Алгоритм порта4me может быть реализован на наиболее известных языках программирования, создавая совершенно воспроизводимое секвенирование независимо от языка реализации.
Предполагая, что мы вошли в систему как пользователь alice в оболочке Bash, вызов port4me без аргументов дает нам бесплатный порт:
{alice}$ port4me
30845Как мы увидим позже, каждый пользователь в системе, вероятно, получит свой собственный уникальный порт. Из -за этого его можно использовать для указания порта, который должен использовать какой -то программный инструмент, например,
{alice}$ jupyter notebook --port " $( port4me ) " Пока этот порт доступен, alice всегда будет получать один и тот же порт в сеансах оболочки и со временем. Например, если они вернутся на следующей неделе и повторите, вполне вероятно, что они все еще получают:
{alice}$ port4me
30845
{alice}$ port4me
30845Однако, если порт 30845 уже занят, рассматривается следующий порт в последовательности псевдолудочного
{alice}$ port4me
19654Чтобы увидеть первые пять отсканированных портов, запустите:
{alice}$ port4me --list=5
30845
19654
32310
63992
15273 Эта случайная последовательность инициируется случайным семенем, которое может быть установлено через хешкод строки семян. По умолчанию он основан на имени текущего пользователя (например, переменная среды $USER ). Например, когда пользователь bob использует инструмент port4me , они видят еще один набор сканируемых портов:
{bob}$ port4me --list=5
54242
4930
42139
14723
55707 Для тестирования и демонстрации можно подражать другому пользователю, указав опцию --user , например,
{alice}$ port4me
30845
{alice}$ port4me --user=bob
54242
{alice}$ port4me --user=carol
34307 Иногда пользователь хотел бы использовать два или более портов одновременно, например, один порт для сервера RStudio и другой для ноутбука Jupyter. В таком случае они могут указать опцию --tool , которая приводит к последовательности портов, которая является уникальной как для пользователя, так и для инструмента. Например,
{alice}$ port4me
30845
{alice}$ port4me --tool=rstudio
22486
{alice}$ port4me --tool=jupyter-notebook
29525 Для удобства, если первый вариант не назван, то предполагается, что он определяет опцию --tool . Это означает, что мы можем использовать следующую форму сортировки:
{alice}$ port4me jupyter-notebook
47467Это позволяет нам получать разные порты для разных программных инструментов, например,
{alice}$ rserver --www-port " $( port4me rstudio ) "и
{alice}$ jupyter notebook --port " $( port4me jupyter-notebook ) " Поскольку имеется ограниченный набор портов (1024-65535), всегда существует риск, что другой процесс занимает любой данный порт. Чем больше пользователей там есть на одной машине, тем выше риск для этого. Если пользователю не повезло, он может испытывать это часто. Например, alice может обнаружить, что первый порт (30845) работает только один 10 раз, второй порт (19654) работает 99 раз в 100 раз, а третий (32310) работает редко. Если это так, они могут выбрать исключение портов, которые, скорее всего, будут заняты, указав их как разделенные запятые значения с помощью опции --exclude , например,
{alice}$ port4me --exclude=30845,32310
19654 Альтернативой указать их через параметр командной строки, состоит в том, чтобы указать их через переменную среду PORT4ME_EXCLUDE , например,
{alice}$ PORT4ME_EXCLUDE=30845,32310 port4me
19654Чтобы установить это навсегда, добавьте:
# # port4me customization
# # https://github.com/HenrikBengtsson/port4me
PORT4ME_EXCLUDE=30845,32310
export PORT4ME_EXCLUDE к сценарию запуска оболочки, например ~/.bashrc .
Это увеличивает шансы для пользователя в конечном итоге с тем же портом с течением времени, что удобно, потому что тогда он может повторно использовать тот же вызов, который доступен в истории командной строки, каждый раз без необходимости менять параметр порта.
Переменная среда PORT4ME_EXCLUDE предназначена для использования отдельным пользователем. Чтобы указать набор портов, которые должны быть исключены независимо от пользователя, установите PORT4ME_EXCLUDE_SITE . Например, системный администратор, может выбрать дополнительный набор портов, добавив следующее в файл /etc/profile.d/port4me.sh :
# # port4me: always exclude commonly used ports
# # https://github.com/HenrikBengtsson/port4me
PORT4ME_EXCLUDE_SITE=
# # MySQL
PORT4ME_EXCLUDE_SITE= $PORT4ME_EXCLUDE_SITE ,3306
# # ZeroMQ
PORT4ME_EXCLUDE_SITE= $PORT4ME_EXCLUDE_SITE ,5670
# # Redis
PORT4ME_EXCLUDE_SITE= $PORT4ME_EXCLUDE_SITE ,6379
# # Jupyter
PORT4ME_EXCLUDE_SITE= $PORT4ME_EXCLUDE_SITE ,8888
export PORT4ME_EXCLUDE_SITE В дополнение к портам, исключенным по вышеуказанным механизмам, Port4me исключает порты, которые считаются небезопасными веб -браузерами Chrome и Firefox. Это поведение можно контролировать с помощью среды переменной PORT4ME_EXCLUDE_UNSAFE , который по умолчанию {chrome},{firefox} . Токен {chrome} расширяется до значения PORT4ME_EXCLUDE_UNSAFE_CHROME , который по умолчанию на набор портов, которые блокируют хромирование, и {firefox} расширяется до значения PORT4ME_EXCLUDE_UNSAFE_FIREFOX , которые блокируют порты, которые блокируют Firefox.
Аналогично, исключая набор портов, можно ограничить набор портов, которые будут отсканированы путем указания параметра командной строки --include , например,
{alice}$ port4me --include=2000-2123,4321,10000-10999
10451 где по умолчанию соответствует --include=1024-65535 . Аналогично --exclude , --include может быть указан через переменные среды PORT4ME_INCLUDE и PORT4ME_INCLUDE_SITE .
В дополнение к сканированию специфической для пользователя последовательность порта псевдолудочного порта для свободного порта можно также рассмотреть предопределенный набор портов до случайных, указав опцию командной строки --prepend , например,
{alice}$ port4me --prepend=4321,11001 --list=5
4321
11001
30845
19654
32310 Альтернативой указать их через параметр командной строки, состоит в том, чтобы указать их через переменную среду PORT4ME_PREPEND , например,
{alice}$ PORT4ME_PREPEND=4321,11001 port4me --list=5
4321
11001
30845
19654
32310 Переменная среда PORT4ME_PREPEND предназначена для использования отдельным пользователем. Чтобы указать набор портов, которые должны быть приготовлены независимо от пользователя, установите PORT4ME_PREPEND_SITE .
Все реализации Port4me выводят идентифицированный порт в стандартный выход (stdout). Это облегчает захват стандартными методами оболочки, например port="$(port4me)" . Если вы хотите увидеть, какой номер порта был сгенерирован, используйте tee для отправки порта также в стандартную ошибку (STDERR), которая можно увидеть в терминале. Например,
{alice}$ jupyter notebook --port " $( port4me --tool=jupyter-notebook | tee /dev/stderr ) "
29525Чтобы установить версию Bash Portme , Do:
VERSION=0.7.1
curl -L -O https://github.com/HenrikBengtsson/port4me/archive/refs/tags/ " ${VERSION} .tar.gz "
tar -x -f " ${VERSION} .tar.gz "
export PREFIX=/path/to/port4me/ # # must be an absolute path to a folder
(cd " port4me- ${VERSION} /bash " ; make install)Затем запустите его как:
$ export PATH=/path/to/port4me/bin: $PATH
$ port4me --version
0.7.1Чтобы установить пакет R Portme , который доступен на CRAN, вызовите следующее из R:
install.packages( " port4me " )Чтобы попробовать это, позвоните:
> port4me :: port4me( " jupyter-notebook " )
[ 1 ] 47467или
$ Rscript -e port4me::port4me jupyter-notebook
29525Python Package Part4me доступен PYPI. Чтобы установить пакет Python Portme в вашу личную библиотеку пакетов Python, вызовите следующее из командной строки:
$ pip install --user port4me Чтобы установить его в виртуальную среду Python, опция Drop --user .
Чтобы попробовать это, позвоните:
>>> from port4me import port4me
>>> port4me( " jupyter-notebook " )
29525или
$ python -m port4me --tool=jupyter-notebook
29525 Должно быть возможно реализовать алгоритм с использованием 32-разрядной целочисленной арифметики без знака . Нельзя предполагать, что самое большое представленное целое число может превышать
Последовательность порта псевдорадомизированной
Как минимум, должно быть возможно реализовать алгоритм в ванильном SH*, CSH, Bash, C, C ++, Fortran, Lua, Python, R и Ruby, без необходимости в дополнительных пакетах, помимо того, что доступно из их основного распределения. (*) Оболочки, которые не поддерживают целочисленную арифметику, могут использовать такие инструменты, как expr , dc , bc и awk для этих расчетов.
Все языки программирования должны создавать одни и те же самые псевдолупильные последовательности портов, учитывая одно и то же случайное семя.
Реализации должны быть написаны таким образом, чтобы они также работали при получении или копировали в исходный код в другом месте, например, в сценариях R и Python.
Идентифицированный, свободный порт должен быть выведен в стандартный выход (stdout) только в качестве цифр, без каких -либо символов префикса или суффикса.
Пользователь должен быть в состоянии исключить предварительно определенный набор портов, указав переменную среды PORT4ME_EXCLUDE , например, PORT4ME_EXCLUDE=8080,4321 .
Системный администратор должен быть в состоянии указать предварительно определенный набор портов, который должен быть исключен, указав переменную среды PORT4ME_EXCLUDE_SITE , например, PORT4ME_EXCLUDE_SITE=8080,4321 . Это работает в дополнение к PORT4ME_EXCLUDE .
Пользователь должен иметь возможность пропустить определенное количество случайных портов по их желанию, указав переменную среду PORT4ME_SKIP , например, PORT4ME_SKIP=5 . По умолчанию не пропустить, что соответствует PORT4ME_SKIP=0 . Пропуск должен применяться после того, как порты исключаются с помощью PORT4ME_EXCLUDE и PORT4ME_EXCLUDE_SITE .
Новые реализации должны прекрасно воспроизводить последовательности портов, созданные уже существующими реализациями.
Линейный генератор конгресса (LCG) будет использоваться для генерации последовательности порта псевдолудочного порта
Следующее семя,
Алгоритм LCG не должен предполагать, что текущее семя LCG находится внутри
Алгоритм LCG может производить то же выходное семя, что и входное семя, что может произойти, когда семена
Параметры LCG должны быть
Для этого требуется только 32-битная целочисленная арифметика, потому что
Если начальное семя
32-битный целочисленный строковый хэшкод будет использоваться для генерации целого числа в
Строка хешкода используется в качестве начального семена LCG:
Семя LCG должно быть в
данный хэшкод