أداة port4me :
يجد منفذ TCP مجاني في [1024،65535] يمكن للمستخدم فتحه
تم تصميمه للعمل في بيئات متعددة المستخدمين
يعطي مستخدمين مختلفين ومنافذ مختلفة
يمنح المستخدم نفس المنفذ بمرور الوقت مع احتمال كبير
يعطي منافذ مختلفة لأدوات البرمجيات المختلفة
لا يتطلب أي تكوين
يمكن استنساخه تمامًا على جميع أنظمة التشغيل وفي جميع لغات البرمجة الشائعة
متاح للباش ، بيثون ، و r
هناك العديد من الأدوات لتحديد منفذ TCP مجاني ، حيث يعيد معظمهم منفذًا عشوائيًا. على الرغم من أنه يعمل تقنيًا ، إلا أنه قد يضيف القليل من الاحتكاك إذا كان يجب إدخال رقم منفذ عشوائي جديد من قبل المستخدم في كل مرة يحتاجون فيها إلى استخدام أداة معينة.
في المقابل ، يحاول Port4me ، مع احتمال كبير ، تزويد المستخدم بنفس المنفذ في كل مرة ، حتى عند استخدامه في أيام مختلفة. إنه يحقق ذلك عن طريق مسح نفس التسلسل الحتمي ، العشوائي الزائفة للمنافذ وإرجاع أول منفذ مجاني تم اكتشافه. يحصل كل مستخدم على تسلسل المنفذ العشوائي الخاص به ، مما يقلل من مخاطر أي مستخدمين لطلب نفس المنفذ. يتم بدء العشوائية مع بذرة عشوائية هي وظيفة لاسم المستخدم ( USER ) ، واختياريا اسم البرنامج الذي نستخدم فيه المنفذ.
يمكن تنفيذ خوارزمية Port4ME في لغات البرمجة الأكثر شهرة ، مما ينتج عنه تسلسل قابل للاستنساخ بشكل مثالي بغض النظر عن لغة التنفيذ.
على افتراض أننا قمنا بتسجيل الدخول كمستخدم alice في قذيفة باش ، فإن الاتصال بالوراء port4me بدون وسيط يعطينا منفذًا مجانيًا:
{alice}$ port4me
30845كما سنرى لاحقًا ، من المحتمل أن يحصل كل مستخدم على النظام على منفذه الفريد. لهذا السبب ، يمكن استخدامه لتحديد منفذ يجب أن تستخدمه بعض أداة البرمجيات ، على سبيل المثال
{alice}$ jupyter notebook --port " $( port4me ) " طالما كان هذا المنفذ متاحًا ، ستحصل alice دائمًا على نفس المنفذ عبر جلسات Shell ومع مرور الوقت. على سبيل المثال ، إذا عادوا الأسبوع المقبل وأعادوا ذلك ، فمن المحتمل أن يحصلوا على:
{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. يمكن التحكم في هذا السلوك بواسطة PORT4ME_EXCLUDE_UNSAFE المتغير للبيئة ، والذي يتخلف عن {chrome},{firefox} . يمتد 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). هذا يجعل من السهل التقاطها بواسطة أساليب Shell القياسية ، على سبيل المثال port="$(port4me)" . إذا كنت ترغب في معرفة رقم المنفذ الذي تم إنشاؤه ، فاستخدم tee لإرسال المنفذ أيضًا إلى الخطأ القياسي (STDERR) ، والذي يمكن رؤيته في المحطة. على سبيل المثال،
{alice}$ jupyter notebook --port " $( port4me --tool=jupyter-notebook | tee /dev/stderr ) "
29525لتثبيت إصدار Bash من Portme ، افعل:
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
29525يتوفر Python Package Port4me 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 بت غير موقعة . يجب ألا يفترض المرء أن أكبر عدد صحيح ممثل يمكن أن يتجاوز
يجب أن ينتهي تسلسل المنفذ العشوائي الزائف بشكل موحد
على الأقل ، يجب أن يكون من الممكن تنفيذ الخوارزمية في Vanilla SH*، CSH ، Bash ، C ، C ++ ، Fortran ، Lua ، Python ، R ، و Ruby ، دون الحاجة إلى حزم إضافية تتجاوز ما هو متاح من توزيعها الأساسي. (*) قد تستخدم الأصداف التي لا تدعم حساب عدد صحيح أدوات مثل expr و dc و bc و awk لهذه الحسابات.
يجب أن تنتج جميع لغات البرمجة نفس تسلسلات المنفذ العشوائية الزائفة التي تعطى نفس البذور العشوائية.
يجب كتابة التطبيقات بحيث تعمل أيضًا عند الحصول عليها ، أو نسخها في رمز المصدر في مكان آخر ، على سبيل المثال في البرامج النصية R و Python.
يجب إخراج المنفذ المجاني المحدد إلى الإخراج القياسي (STDOUT) كأرقام فقط ، دون أي بادئة أو رموز لاحقة.
يجب أن يكون المستخدم قادرًا على استبعاد مجموعة من المنافذ المحددة مسبقًا عن طريق تحديد PORT4ME_EXCLUDE ، EG PORT4ME_EXCLUDE=8080,4321 .
يجب أن يكون مسؤول النظام قادرًا على تحديد مجموعة محددة مسبقًا من المنافذ المراد استبعادها من خلال تحديد PORT4ME_EXCLUDE_SITE ، EG PORT4ME_EXCLUDE_SITE=8080,4321 . هذا يعمل مكملاً لـ PORT4ME_EXCLUDE .
يجب أن يكون المستخدم قادرًا على تخطي عدد معين من المنافذ العشوائية في إرادته عن طريق تحديد PORT4ME_SKIP ، EG PORT4ME_SKIP=5 . الافتراضي هو عدم تخطي ، والذي يتوافق مع PORT4ME_SKIP=0 . يجب أن ينطبق التخطي بعد أن يتم استبعاد المنافذ بواسطة PORT4ME_EXCLUDE و PORT4ME_EXCLUDE_SITE .
يجب أن تقوم التطبيقات الجديدة بإعادة إنتاج تسلسل الموانئ التي تنتجها التطبيقات الموجودة بالفعل.
سيتم استخدام مولد متطابق خطي (LCG) لإنشاء تسلسل منفذ العشوائي الزائفة
البذرة التالية ،
يجب ألا تفترض خوارزمية LCG أن بذرة LCG الحالية في الداخل
قد تنتج خوارزمية LCG نفس بذرة الإخراج مثل بذور الإدخال ، والتي قد تحدث عندما تكون البذور
يجب أن تكون معلمات LCG
هذا يتطلب فقط حساب عدد صحيح 32 بت ، لأن
إذا كانت البذرة الأولية
سيتم استخدام Hashcode سلسلة عدد صحيح 32 بت لإنشاء عدد صحيح في
يتم استخدام رمز Hashcode السلسلة كبذور LCG الأولية:
يجب أن تكون بذرة LCG في
إعطاء hashcode