Das Port4me -Tool:
Findet einen kostenlosen TCP -Port in [1024.65535], den der Benutzer öffnen kann
ist so konzipiert, dass sie in Umgebungen mit mehreren Benutzern arbeitet
gibt unterschiedlichen Benutzern, verschiedene Ports
gibt dem Benutzer den gleichen Port im Laufe der Zeit mit hoher Wahrscheinlichkeit
gibt unterschiedliche Ports für verschiedene Softwaretools
Benötigt keine Konfiguration
kann in allen Betriebssystemen und in allen gemeinsamen Programmiersprachen perfekt reproduziert werden
Verfügbar für Bash, Python und R.
Es gibt viele Tools, um einen kostenlosen TCP -Port zu identifizieren, bei dem die meisten einen zufälligen Port zurückgeben. Obwohl es technisch funktioniert, kann es ein bisschen Reibung hinzufügen, wenn eine neue zufällige Portnummer vom Benutzer bei jeder Verwendung eines bestimmten Tools vom Benutzer eingegeben werden muss.
Im Gegensatz dazu versucht Port4me mit hoher Wahrscheinlichkeit, dem Benutzer jedes Mal den gleichen Port zu bieten, selbst wenn es an verschiedenen Tagen verwendet wird. Dies erreicht dies, indem es die gleiche deterministische Pseudo-Random-Sequenz von Ports scannt und den ersten freien Anschluss zurückgibt. Jeder Benutzer erhält eine eigene Zufallsportsequenz und senkt das Risiko, dass zwei Benutzer denselben Port anfordern. Die Zufälligkeit wird mit einem zufälligen Saatgut initiiert, der eine Funktion des Namens des Benutzers ( USER ) und optional des Namens der Software, in der wir den Port verwenden, ist.
Der Port4me -Algorithmus kann in den meisten bekannten Programmiersprachen implementiert werden, wodurch eine perfekt reproduzierbare Sequenzierung unabhängig von der Implementierungssprache erzeugt wird.
Angenommen, wir sind als Benutzer alice in einer Bash -Shell angemeldet. Wenn wir port4me ohne Argumente aufrufen, erhalten Sie einen kostenlosen Port:
{alice}$ port4me
30845Wie wir später sehen werden, erhält jeder Benutzer im System wahrscheinlich seinen eigenen einzigartigen Port. Aus diesem Grund kann es verwendet werden, um einen Port anzugeben, den ein Software -Tool verwenden sollte, z. B.
{alice}$ jupyter notebook --port " $( port4me ) " Solange dieser Port verfügbar ist, erhält alice immer den gleichen Port über Shell -Sitzungen und im Laufe der Zeit. Wenn sie beispielsweise nächste Woche zurückkehren und wiederholt werden, bekommen sie wahrscheinlich immer noch:
{alice}$ port4me
30845
{alice}$ port4me
30845Wenn jedoch Port 30845 bereits besetzt ist, wird der nächste Port in der Pseudo-Random-Sequenz in Betracht gezogen, z. B., z. B.
{alice}$ port4me
19654Um die ersten fünf Ports gescannt zu sehen, laufen Sie:
{alice}$ port4me --list=5
30845
19654
32310
63992
15273 Diese zufällige Sequenz wird durch einen zufälligen Saatgut initiiert, der über den HashCode einer Samenzeichenfolge festgelegt werden kann. Standardmäßig basiert es auf dem Namen des aktuellen Benutzers (z. B. Variable $USER ). Wenn der Benutzer bob beispielsweise das port4me -Tool verwendet, wird ein weiterer Satz von Ports gescannt:
{bob}$ port4me --list=5
54242
4930
42139
14723
55707 Zu den Test- und Demonstrationszwecken kann man einen anderen Benutzer emulieren, indem man die Option angibt --user , z. B.
{alice}$ port4me
30845
{alice}$ port4me --user=bob
54242
{alice}$ port4me --user=carol
34307 Manchmal möchte ein Benutzer zwei oder mehr gleichzeitig Ports verwenden, z. B. einen Port für RSTUDIO -Server und ein anderes für Jupyter Notebook. In diesem Fall können sie die Option angeben --tool , die zu einer Portsequenz führt, die sowohl für den Benutzer als auch für das Tool einzigartig ist. Zum Beispiel,
{alice}$ port4me
30845
{alice}$ port4me --tool=rstudio
22486
{alice}$ port4me --tool=jupyter-notebook
29525 Wenn die erste Option unbenannt ist, wird angenommen, dass sie die Option --tool -Option angibt. Dies bedeutet, dass wir auch das folgende Sortierformular verwenden können:
{alice}$ port4me jupyter-notebook
47467Auf diese Weise können wir verschiedene Ports für verschiedene Softwaretools erhalten, z. B.
{alice}$ rserver --www-port " $( port4me rstudio ) "Und
{alice}$ jupyter notebook --port " $( port4me jupyter-notebook ) " Da eine begrenzte Reihe von Ports verfügbar sind (1024-65535), besteht immer ein Risiko, dass ein anderer Prozess einen bestimmten Port einnimmt. Je mehr Benutzer auf derselben Maschine sind, desto höher ist das Risiko, dass dies eintritt. Wenn ein Benutzer Pech hat, kann dies häufig auftreten. Zum Beispiel könnte alice feststellen, dass der erste Port (30845) nur ein zehn Mal auswirkt, der zweite Port (19654) funktioniert das 100 -mal 99 und der dritte (32310) selten. In diesem Fall können sie die Ports ausschließen, die am wahrscheinlichsten besetzt sind, indem sie sie als von Kommas getrennte Werte über Option angeben --exclude , z. B.
{alice}$ port4me --exclude=30845,32310
19654 Eine Alternative PORT4ME_EXCLUDE um sie über eine Befehlszeilenoption anzugeben
{alice}$ PORT4ME_EXCLUDE=30845,32310 port4me
19654Um dies dauerhaft festzulegen, wenden Sie sich an:
# # port4me customization
# # https://github.com/HenrikBengtsson/port4me
PORT4ME_EXCLUDE=30845,32310
export PORT4ME_EXCLUDE zum Shell Startup -Skript, z. ~/.bashrc .
Dies erhöht die Chancen, dass der Benutzer im Laufe der Zeit denselben Port enden, was bequem ist, da er dann den gleichen Anruf wiederverwenden kann, der im Befehlszeilenverlauf verfügbar ist, jedes Mal, ohne den Portparameter ändern zu müssen.
Die Umgebungsvariable PORT4ME_EXCLUDE soll vom einzelnen Benutzer verwendet werden. Um eine Reihe von Ports anzugeben, die unabhängig vom Benutzer ausgeschlossen werden sollen, setzen Sie PORT4ME_EXCLUDE_SITE fest. Beispielsweise kann der Systemadministrator einen zusätzlichen Satz von Ports ausschließen, indem der folgende zu File /etc/profile.d/port4me.sh hinzugefügt wird:
# # 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 Zusätzlich zu Ports, die über die oben genannten Mechanismen ausgeschlossen sind, schließt Port4me Ports aus, die von den Chrome- und Firefox -Webbrowsern als unsicher angesehen werden. Dieses Verhalten kann durch die Umgebungsvariable PORT4ME_EXCLUDE_UNSAFE gesteuert werden, die standardmäßig {chrome},{firefox} . Token {chrome} erweitert den Wert von PORT4ME_EXCLUDE_UNSAFE_CHROME , der standardmäßig an den Ports setzt, die sich verchrennen, und {firefox} erweitert sich auf den Wert von PORT4ME_EXCLUDE_UNSAFE_FIREFOX , der sich auf die Set von Ports befindet, die von Ports, die Ports, an die Ports, die sich von Ports befinden.
Analog zum Ausschluss einer Reihe von Ports kann man die zu scannte Ports einschränken, indem die Befehlszeilenoption angegeben wird --include , z. B.
{alice}$ port4me --include=2000-2123,4321,10000-10999
10451 wobei die Standardeinstellung --include=1024-65535 entspricht. Analog zu --exclude , --include kann über Umgebungsvariablen PORT4ME_INCLUDE und PORT4ME_INCLUDE_SITE angegeben werden.
Zusätzlich zum Scannen der benutzerspezifischen Pseudo-Random-Port-Sequenz für einen freien Port ist es möglich, einen vordefinierten Satz von Ports vor den zufälligen zu berücksichtigen, indem die Befehlszeilenoption angegeben wird --prepend , z. B.
{alice}$ port4me --prepend=4321,11001 --list=5
4321
11001
30845
19654
32310 Eine Alternative PORT4ME_PREPEND um sie über eine Befehlszeilenoption anzugeben
{alice}$ PORT4ME_PREPEND=4321,11001 port4me --list=5
4321
11001
30845
19654
32310 Die Umgebungsvariable PORT4ME_PREPEND soll vom einzelnen Benutzer verwendet werden. Setzen Sie PORT4ME_PREPEND_SITE , um eine Reihe von Ports festzulegen, die unabhängig vom Benutzer vorbereitet werden sollen.
Alle Port4me -Implementierungen geben den identifizierten Port zu Standardausgabe (STDOut) aus. Dies erleichtert das Erfassen von Standard -Shell -Methoden, z. B. port="$(port4me)" . Wenn Sie sehen möchten, welche Portnummer generiert wurde, senden tee den Port auch an den Standard -Fehler (STDERR), der im Terminal zu sehen ist. Zum Beispiel,
{alice}$ jupyter notebook --port " $( port4me --tool=jupyter-notebook | tee /dev/stderr ) "
29525Um die Bash -Version von Portme zu installieren, tun Sie:
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)Dann führen Sie es als:
$ export PATH=/path/to/port4me/bin: $PATH
$ port4me --version
0.7.1Um das R -Portme -Paket zu installieren, das auf Cran verfügbar ist, rufen Sie Folgendes aus R unter R an:
install.packages( " port4me " )Um es auszuprobieren, rufen Sie an:
> port4me :: port4me( " jupyter-notebook " )
[ 1 ] 47467oder
$ Rscript -e port4me::port4me jupyter-notebook
29525Das Python Package Port4me ist PYPI erhältlich. Um das Python Portme -Paket in Ihrer persönlichen Python -Paketbibliothek zu installieren, rufen Sie Folgendes aus der Befehlszeile an:
$ pip install --user port4me So installieren Sie es in einer virtuellen Python -Umgebung, Drop -Option --user .
Um es auszuprobieren, rufen Sie an:
>>> from port4me import port4me
>>> port4me( " jupyter-notebook " )
29525oder
$ python -m port4me --tool=jupyter-notebook
29525 Es sollte möglich sein, den Algorithmus unter Verwendung von 32-Bit -Unsigned Ganze-Arithmetik zu implementieren. Man darf nicht davon ausgehen, dass die größte vertretene Ganzzahl übertreffen kann
Die pseudo-randomisierte Portsequenz sollte einheitlich übertreiben
Zumindest sollte es möglich sein, den Algorithmus in Vanille-Sh*, CSH, Bash, C, C ++, Forran, Lua, Python, R und Ruby zu implementieren, ohne dass Add-On-Pakete über die von ihrer Kernverteilung verfügbaren Pakete hinausgingen. (*) Shells, die keine ganzzahlige Arithmetik unterstützen, können Tools wie expr , dc , bc und awk für diese Berechnungen verwenden.
Alle Programmiersprachen sollten genau dieselben Pseudo-Random-Port-Sequenzen erzeugen, die denselben zufälligen Saatgut haben.
Die Implementierungen sollten so geschrieben werden, dass sie auch funktionieren, wenn sie an anderer Stelle in R- und Python -Skripten in R- und Python -Skripten kopiert werden.
Der identifizierte, freie Port sollte nur als Ziffern an die Standardausgabe (STDOut) ohne Präfix- oder Suffix -Symbole ausgegeben werden.
Der Benutzer sollte in der Lage sein, einen vordefinierten Satz von Ports auszuschließen, indem die Umgebungsvariable PORT4ME_EXCLUDE , z. B. PORT4ME_EXCLUDE=8080,4321 angeben.
Der Systemadministrator sollte in der Lage sein, einen vordefinierten Satz von Ports anzugeben, die ausgeschlossen werden sollen, indem die Umgebungsvariable PORT4ME_EXCLUDE_SITE , z. B. PORT4ME_EXCLUDE_SITE=8080,4321 angegeben wird. Dies funktioniert komplementär zu PORT4ME_EXCLUDE .
Der Benutzer sollte in der Lage sein, eine bestimmte Anzahl zufälliger Ports nach Belieben zu überspringen, indem die Umgebungsvariable PORT4ME_SKIP , z. B. PORT4ME_SKIP=5 , angeben. Die Standardeinstellung besteht darin, nicht zu überspringen, was PORT4ME_SKIP=0 entspricht. Das Überspringen sollte dann gelten , nachdem die Ports von PORT4ME_EXCLUDE und PORT4ME_EXCLUDE_SITE ausgeschlossen sind.
Neue Implementierungen sollten die von bereits vorhandenen Implementierungen erstellten Portsequenzen perfekt reproduzieren.
Ein linearer Kongruentgenerator (LCG) wird verwendet, um die Pseudo-Random-Port-Sequenz zu erzeugen
der nächste Samen,
Der LCG -Algorithmus darf nicht davon ausgehen, dass der aktuelle LCG -Samen innerhalb ist
Der LCG
LCG -Parameter sollten sein
Dies erfordert nur 32-Bit-Ganzzahl-Arithmetik, weil
Wenn der anfängliche Samen ist
Ein 32-Bit-Ganzzahl-String-HashCode wird verwendet, um eine Ganzzahl in zu generieren
Der String -HashCode wird als anfänglicher LCG -Samen verwendet:
Der LCG -Samen sollte in sein
gegebener Hashcode