port4me工具:
在[1024,65535]中找到一個免費的TCP端口,用戶可以打開
旨在在多用戶環境中工作
提供不同的用戶,不同的端口
隨著時間的流逝,用高概率為用戶提供同一端口
為不同的軟件工具提供不同的端口
不需要配置
可以在所有操作系統和所有通用編程語言上完美地複制
可用於Bash,Python和R
有許多工具可以識別一個免費的TCP端口,其中大多數端口返回隨機端口。儘管在技術上有效,但如果用戶每次需要使用特定的工具時,它們都必須由用戶輸入新的隨機端口號,但可能會增加一些摩擦。
相比之下,即使在不同的日子使用時, port4me嘗試每次都會為用戶提供相同的端口。它通過掃描端口的相同確定性,偽隨機序列並返回檢測到的第一個自由端口來實現這一目標。每個用戶都會獲得自己的隨機端口序列,從而降低了任何兩個用戶要求同一端口的風險。隨機性是用隨機種子啟動的,該種子是用戶名稱( USER )的函數,並且可以選擇地是我們使用端口的軟件的名稱。
port4me算法可以在最著名的編程語言中實現,無論實施語言如何,都可以產生完美的可重現測序。
假設我們在bash shell中以alice為愛麗絲的身份登錄,請致電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 Notebook。在這種情況下,他們可以指定選項--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到shell啟動腳本,例如~/.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 Web瀏覽器認為不安全的端口。可以通過環境變量PORT4ME_EXCLUDE_UNSAFE來控制此行為,該port4me_exclude_unsafe默認為{chrome},{firefox} 。 Token {chrome}擴展到PORT4ME_EXCLUDE_UNSAFE_CHROME的值,該值默認為Chrome阻止的端口集, {firefox}擴展為PORT4ME_EXCLUDE_UNSAFE_FIREFOX的port4me_exclude_unsafe_firefox,默認為firefox blocts firefox bloce firefox bloffer firefox blofs firefox blove firefox bloce firefox blove。
類似於排除一組端口,可以限制通過指定命令行選項掃描要掃描的端口--include
{alice}$ port4me --include=2000-2123,4321,10000-10999
10451默認值對應於--include=1024-65535 。 PORT4ME_INCLUDE_SITE --exclude ,可以通過環境變量--include和PORT4ME_INCLUDE指定。
除了掃描特定於用戶的pseudo-random端口序列,用於免費端口外,還可以通過指定命令行選項來考慮在隨機端口之前的預定義端口--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要安裝Portme的Bash版本,請執行:
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要安裝可在Cran上可用的R Portme軟件包,請從R:
install.packages( " port4me " )要嘗試一下,請致電:
> port4me :: port4me( " jupyter-notebook " )
[ 1 ] 47467或者
$ Rscript -e port4me::port4me jupyter-notebook
29525Python軟件包port4me可以使用PYPI。要將Python Portme軟件包安裝到您的個人Python軟件包庫中,請從命令行中撥打以下內容:
$ pip install --user port4me要將其安裝到Python虛擬環境中,請刪除選項--user 。
要嘗試一下,請致電:
>>> from port4me import port4me
>>> port4me( " jupyter-notebook " )
29525或者
$ python -m port4me --tool=jupyter-notebook
29525應該使用32位未簽名的整數算術實現算法。一定不能假設最大的代表整數可以超過
偽隨機端口序列應均勻地採樣
至少應該在Vanilla Sh*,CSH,CSH,C,C,C ++,Fortran,Lua,Python,R和Ruby中實現算法,而無需超越其核心分佈的附加包裝。 (*)不支持整數算術的外殼可以使用expr , dc , bc和awk等工具進行這些計算。
所有編程語言都應產生完全相同的偽隨機端口序列,給定相同的隨機種子。
該實現應編寫,以便它們在來源時也可以使用,或者將其複製到其他地方的源代碼中,例如R和Python腳本。
所識別的自由端口應僅作為數字輸出,而沒有任何前綴或後綴符號。
用戶應能夠通過指定環境變量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位整數字符串哈希碼在
字符串hashcode用作初始LCG種子:
LCG種子應該在
給定的hashcode