เครื่องมือ port4me :
ค้นหาพอร์ต TCP ฟรีใน [1024,65535] ที่ผู้ใช้สามารถเปิดได้
ได้รับการออกแบบมาเพื่อทำงานในสภาพแวดล้อมที่มีผู้ใช้หลายคน
ให้ผู้ใช้ที่แตกต่างกันพอร์ตที่แตกต่างกัน
ให้พอร์ตเดียวกันกับผู้ใช้เมื่อเวลาผ่านไปด้วยความน่าจะเป็นสูง
ให้พอร์ตที่แตกต่างกันสำหรับเครื่องมือซอฟต์แวร์ที่แตกต่างกัน
ไม่ต้องมีการกำหนดค่า
สามารถทำซ้ำได้อย่างสมบูรณ์แบบในระบบปฏิบัติการทั้งหมดและในภาษาการเขียนโปรแกรมทั่วไปทั้งหมด
มีให้สำหรับ Bash, Python และ R
มีเครื่องมือมากมายในการระบุพอร์ต TCP ฟรีซึ่งส่วนใหญ่ของพวกเขากลับพอร์ตสุ่ม แม้ว่ามันจะใช้งานได้ในทางเทคนิค แต่อาจเพิ่มความเสียดทานที่ยุติธรรมหากผู้ใช้ต้องป้อนหมายเลขพอร์ตแบบสุ่มใหม่ทุกครั้งที่พวกเขาต้องการใช้เครื่องมือเฉพาะ
ในทางตรงกันข้ามความพยายาม ของพอร์ต 4ME ซึ่งมีความน่าจะเป็นสูงเพื่อให้ผู้ใช้มีพอร์ตเดียวกันในแต่ละครั้งแม้จะใช้ในวันที่แตกต่างกัน มันประสบความสำเร็จโดยการสแกนลำดับของพอร์ตแบบหลอกเทียมแบบเดียวกันและส่งคืนพอร์ตฟรีแรกที่ตรวจพบ ผู้ใช้แต่ละคนจะได้รับลำดับพอร์ตแบบสุ่มของตัวเองลดความเสี่ยงสำหรับผู้ใช้สองคนเพื่อขอพอร์ตเดียวกัน การสุ่มเริ่มต้นด้วยเมล็ดสุ่มที่เป็นฟังก์ชั่นของชื่อผู้ใช้ ( USER ) และเป็นทางเลือกชื่อซอฟต์แวร์ที่เราใช้พอร์ต
อัลกอริทึม PORT4ME สามารถนำไปใช้ในภาษาการเขียนโปรแกรมที่รู้จักกันมากที่สุดผลิตลำดับที่ทำซ้ำได้อย่างสมบูรณ์แบบโดยไม่คำนึงถึงภาษาการใช้งาน
สมมติว่าเราลงชื่อเข้าใช้เป็นผู้ใช้ alice ในเชลล์ทุบตีการเรียก port4me โดยไม่มีอาร์กิวเมนต์ให้เรามีพอร์ตฟรี:
{alice}$ port4me
30845อย่างที่เราจะเห็นในภายหลังผู้ใช้แต่ละคนในระบบมีแนวโน้มที่จะได้รับพอร์ตที่เป็นเอกลักษณ์ของตัวเอง ด้วยเหตุนี้จึงสามารถใช้เพื่อระบุพอร์ตที่เครื่องมือซอฟต์แวร์บางอย่างควรใช้เช่น
{alice}$ jupyter notebook --port " $( port4me ) " ตราบใดที่พอร์ตนี้พร้อมใช้งาน alice จะได้รับพอร์ตเดียวกันในเซสชันเชลล์และเมื่อเวลาผ่านไป ตัวอย่างเช่นหากพวกเขากลับมาในสัปดาห์หน้าและลองใหม่มีแนวโน้มว่าพวกเขาจะยังได้รับ:
{alice}$ port4me
30845
{alice}$ port4me
30845อย่างไรก็ตามหากพอร์ต 30845 ถูกครอบครองแล้วพอร์ตถัดไปในลำดับการสุ่มหลอกได้รับการพิจารณาเช่น
{alice}$ port4me
19654หากต้องการดูสแกนห้าพอร์ตแรก Run:
{alice}$ port4me --list=5
30845
19654
32310
63992
15273 ลำดับการสุ่มนี้เริ่มต้นโดยเมล็ดสุ่มที่สามารถตั้งค่าผ่าน hashcode ของสายเมล็ด โดยค่าเริ่มต้นจะขึ้นอยู่กับชื่อของผู้ใช้ปัจจุบัน (เช่นตัวแปรสภาพแวดล้อม $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 ในกรณีเช่นนี้พวกเขาสามารถระบุตัวเลือก --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 ไปยังสคริปต์เริ่มต้นของเชลล์เช่น ~/.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} โทเค็น {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 ) "
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ในการติดตั้งแพ็คเกจ R portme ซึ่งมีอยู่ใน CRAN โทรไปที่ภายใน R:
install.packages( " port4me " )เพื่อลองใช้โทร:
> port4me :: port4me( " jupyter-notebook " )
[ 1 ] 47467หรือ
$ Rscript -e port4me::port4me jupyter-notebook
29525Python 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 บิต เราต้องไม่สันนิษฐานว่าจำนวนเต็มที่ใหญ่ที่สุดอาจเกิน
ลำดับพอร์ตแบบสุ่มหลอกควรสุ่มตัวอย่างพอร์ตอย่างสม่ำเสมอ
อย่างน้อยที่สุดก็ควรจะใช้อัลกอริทึมในวานิลลา sh*, csh, bash, 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 บิตเพราะ
ถ้าเมล็ดเริ่มต้นคือ
HashCode สตริงจำนวนเต็ม 32 บิต จะถูกใช้เพื่อสร้างจำนวนเต็มใน
HashCode สตริงใช้เป็นเมล็ด LCG เริ่มต้น:
เมล็ด LCG ควรอยู่ใน
ได้รับ hashcode