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