port4meツール:
ユーザーが開くことができる[1024,65535]で無料のTCPポートを見つけます
マルチユーザー環境で動作するように設計されています
さまざまなユーザー、異なるポートを提供します
確率が高いと、ユーザーに時間の経過とともに同じポートを与えます
さまざまなソフトウェアツールにさまざまなポートを提供します
構成は不要です
すべてのオペレーティングシステムとすべての一般的なプログラミング言語で完全に複製できます
Bash、Python、およびrが利用できます
無料のTCPポートを特定するための多くのツールがあり、そのほとんどがランダムポートを返します。技術的には機能しますが、特定のツールを使用する必要があるたびに、ユーザーが新しいランダムポート番号を入力する必要がある場合、かなりの摩擦を追加する可能性があります。
対照的に、 PORT4MEは、異なる日に使用された場合でも、毎回同じポートをユーザーに提供しようとする確率が高いと試みます。これは、ポートの同じ決定論的な擬似ランダムシーケンスをスキャンし、検出された最初のフリーポートを返すことでこれを達成します。各ユーザーは独自のランダムポートシーケンスを取得し、2人のユーザーが同じポートを要求するリスクを下げます。ランダム性は、ユーザー名( USER )の関数であるランダムシード、およびオプションでポートを使用するソフトウェアの名前で開始されます。
PORT4MEアルゴリズムは、ほとんどの既知のプログラミング言語で実装でき、実装言語に関係なく完全に再現可能なシーケンスを作成できます。
私たちがバッシュシェルのユーザーaliceとしてログインしていると仮定すると、引数なしでport4meを呼び出すと、無料のポートが得られます。
{alice}$ port4me
30845後で見るように、システム上の各ユーザーは独自のユニークなポートを取得する可能性があります。このため、ソフトウェアツールが使用するポートを指定するために使用できます。
{alice}$ jupyter notebook --port " $( port4me ) "このポートが利用可能である限り、 alice常にシェルセッション全体と時間の経過とともに同じポートを取得します。たとえば、彼らが来週戻って再試行した場合、彼らはまだ得られる可能性があります:
{alice}$ port4me
30845
{alice}$ port4me
30845ただし、ポート30845がすでに占有されている場合、擬似ランダムシーケンスの次のポートが考慮されます。
{alice}$ port4me
19654最初の5つのポートがスキャンされているのを見るには、実行してください。
{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ユーザーは、2つ以上のポートを同時に使用したい場合があります。たとえば、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回しか動作しないことに気付くかもしれません。2番目のポート(19654)は100回、3番目のポート(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シェルスタートアップスクリプトに、eg〜 ~/.bashrc 。
これにより、ユーザーが時間の経過とともに同じポートで終わる可能性が高くなります。これは便利です。これは、ポートパラメーターを変更することなく、コマンドライン履歴で利用可能な同じコールを再利用できるためです。
環境変数PORT4ME_EXCLUDE 、個々のユーザーが使用することを目的としています。ユーザーに関係なく除外する一連のポートを指定するには、 PORT4ME_EXCLUDE_SITEを設定します。たとえば、Systems Administratorは、file /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ブラウザーによって安全でないと見なされるポートを除外します。この動作{chrome},{firefox} 、環境変数PORT4ME_EXCLUDE_UNSAFEによって制御できます。 Token {chrome} 、 PORT4ME_EXCLUDE_UNSAFE_CHROMEの値に拡張されます。これは、クロムがブロックするポートのセットにデフォルトであり、 {firefox}がPORT4ME_EXCLUDE_UNSAFE_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 ) "
29525Portmeの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.1CRANで使用できるR Portmeパッケージをインストールするには、R内から以下を電話してください。
install.packages( " port4me " )試してみるには、お電話ください。
> port4me :: port4me( " jupyter-notebook " )
[ 1 ] 47467または
$ Rscript -e port4me::port4me jupyter-notebook
29525PythonパッケージPORT4MEはPYPIを利用できます。 Python PortmeパッケージをPersonal Pythonパッケージライブラリにインストールするには、コマンドラインから次のように電話してください。
$ pip install --user port4me Python仮想環境にインストールするには、ドロップオプション--user 。
試してみるには、お電話ください。
>>> from port4me import port4me
>>> port4me( " jupyter-notebook " )
29525または
$ python -m port4me --tool=jupyter-notebook
2952532ビットの符号なし整数算術を使用してアルゴリズムを実装できるはずです。最大の表現された整数が超えることができると仮定してはなりません
擬似ランダム化ポートシーケンスは、ポートを均一にサンプリングする必要があります
少なくとも、バニラsh*、csh、bash、c、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シードは入っている必要があります
ハッシュコードが与えられます