Alat Port4Me :
menemukan port TCP gratis di [1024.65535] bahwa pengguna dapat membuka
dirancang untuk bekerja di lingkungan multi-pengguna
memberi pengguna yang berbeda, port yang berbeda
memberi pengguna port yang sama dari waktu ke waktu dengan probabilitas tinggi
memberikan port yang berbeda untuk alat perangkat lunak yang berbeda
tidak memerlukan konfigurasi
dapat direproduksi dengan sempurna pada semua sistem operasi dan dalam semua bahasa pemrograman umum
Tersedia untuk Bash, Python, dan R
Ada banyak alat untuk mengidentifikasi port TCP gratis, di mana sebagian besar dari mereka mengembalikan port acak. Meskipun berfungsi secara teknis, itu mungkin menambahkan sedikit gesekan yang adil jika nomor port acak baru harus dimasukkan oleh pengguna setiap kali mereka perlu menggunakan alat tertentu.
Sebaliknya, upaya Port4Me , dengan probabilitas tinggi, untuk memberi pengguna port yang sama setiap kali, bahkan ketika digunakan pada hari yang berbeda. Ini mencapai ini dengan memindai urutan port pseudo-acak yang sama dan mengembalikan port bebas pertama yang terdeteksi. Setiap pengguna mendapatkan urutan port acak mereka sendiri, menurunkan risiko bagi dua pengguna untuk meminta port yang sama. Keacakan dimulai dengan benih acak yang merupakan fungsi dari nama pengguna ( USER ), dan, secara opsional, nama perangkat lunak tempat kami menggunakan port.
Algoritma Port4ME dapat diimplementasikan dalam bahasa pemrograman yang paling dikenal, menghasilkan pengurutan yang dapat direproduksi dengan sempurna terlepas dari bahasa implementasi.
Dengan asumsi kami masuk sebagai pengguna alice dalam shell bash, memanggil port4me tanpa argumen memberi kami port gratis:
{alice}$ port4me
30845Seperti yang akan kita lihat nanti, setiap pengguna pada sistem cenderung mendapatkan port unik mereka sendiri. Karena itu, dapat digunakan untuk menentukan port yang harus digunakan oleh beberapa alat perangkat lunak, misalnya
{alice}$ jupyter notebook --port " $( port4me ) " Selama port ini tersedia, alice akan selalu mendapatkan port yang sama di seluruh sesi shell dan seiring waktu. Misalnya, jika mereka kembali minggu depan dan coba lagi, kemungkinan mereka masih mendapatkan:
{alice}$ port4me
30845
{alice}$ port4me
30845Namun, jika port 30845 sudah ditempati, port berikutnya dalam urutan pseudo-acak dipertimbangkan, misalnya
{alice}$ port4me
19654Untuk melihat lima port pertama yang dipindai, jalankan:
{alice}$ port4me --list=5
30845
19654
32310
63992
15273 Urutan acak ini diprakarsai oleh biji acak yang dapat diatur melalui kode hash dari string seed. Secara default, ini didasarkan pada nama pengguna saat ini (misalnya variabel lingkungan $USER ). Misalnya, ketika pengguna bob menggunakan alat port4me , mereka melihat set port lain yang dipindai:
{bob}$ port4me --list=5
54242
4930
42139
14723
55707 Untuk tujuan pengujian dan demonstrasi, seseorang dapat meniru pengguna lain dengan menentukan opsi --user , misalnya
{alice}$ port4me
30845
{alice}$ port4me --user=bob
54242
{alice}$ port4me --user=carol
34307 Kadang -kadang pengguna ingin menggunakan dua, atau lebih, port pada saat yang sama, misalnya satu port untuk server rStudio dan satu lagi untuk jupyter notebook. Dalam kasus seperti itu, mereka dapat menentukan opsi --tool , yang menghasilkan urutan port yang unik untuk pengguna dan alat. Misalnya,
{alice}$ port4me
30845
{alice}$ port4me --tool=rstudio
22486
{alice}$ port4me --tool=jupyter-notebook
29525 Untuk kenyamanan, jika opsi pertama tidak disebutkan namanya, maka diasumsikan itu menentukan opsi --tool . Ini berarti kita dapat menggunakan bentuk jenis berikut juga:
{alice}$ port4me jupyter-notebook
47467Ini memungkinkan kami untuk mendapatkan port yang berbeda untuk alat perangkat lunak yang berbeda, misalnya
{alice}$ rserver --www-port " $( port4me rstudio ) "Dan
{alice}$ jupyter notebook --port " $( port4me jupyter-notebook ) " Karena ada satu set port terbatas yang tersedia (1024-65535), selalu ada risiko bahwa proses lain menempati port yang diberikan. Semakin banyak pengguna di mesin yang sama, semakin tinggi risikonya untuk ini terjadi. Jika pengguna tidak beruntung, mereka mungkin sering mengalami hal ini. Sebagai contoh, alice mungkin menemukan bahwa port pertama (30845) hanya bekerja satu 10 kali, port kedua (19654) bekerja 99 keluar 100 kali, dan yang ketiga (32310) jarang bekerja. Jika demikian, mereka dapat memilih untuk mengecualikan port yang paling mungkin ditempati dengan menentukannya sebagai nilai yang dipisahkan koma melalui opsi --exclude , misalnya
{alice}$ port4me --exclude=30845,32310
19654 Alternatif untuk menentukannya melalui opsi baris perintah, adalah menentukannya melalui variabel lingkungan PORT4ME_EXCLUDE , misalnya
{alice}$ PORT4ME_EXCLUDE=30845,32310 port4me
19654Untuk mengatur ini secara permanen, tambahkan:
# # port4me customization
# # https://github.com/HenrikBengtsson/port4me
PORT4ME_EXCLUDE=30845,32310
export PORT4ME_EXCLUDE ke skrip startup shell, misalnya ~/.bashrc .
Ini meningkatkan peluang bagi pengguna untuk berakhir dengan port yang sama dari waktu ke waktu, yang nyaman, karena dengan begitu mereka dapat menggunakan kembali panggilan yang sama, yang tersedia dalam riwayat baris perintah, setiap kali tanpa harus mengubah parameter port.
Variabel lingkungan PORT4ME_EXCLUDE dimaksudkan untuk digunakan oleh masing -masing pengguna. Untuk menentukan satu set port yang akan dikecualikan terlepas dari pengguna, atur PORT4ME_EXCLUDE_SITE . Misalnya, administrator sistem, dapat memilih untuk mengecualikan satu set port tambahan dengan menambahkan yang berikut ke 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 Selain port yang dikecualikan melalui mekanisme di atas, Port4Me tidak termasuk port yang dianggap tidak aman oleh browser web Chrome dan Firefox. Perilaku ini dapat dikontrol oleh variabel lingkungan PORT4ME_EXCLUDE_UNSAFE , yang default ke {chrome},{firefox} . Token {chrome} memperluas ke nilai PORT4ME_EXCLUDE_UNSAFE_CHROME , yang default ke set port yang blok chrome, dan {firefox} memperluas ke nilai PORT4ME_EXCLUDE_UNSAFE_FIREFOX , yang default ke set port4me_exclude_unsafe.
Secara analog untuk mengecualikan satu set port, seseorang dapat membatasi set port yang akan dipindai dengan menentukan opsi baris perintah --include , misalnya
{alice}$ port4me --include=2000-2123,4321,10000-10999
10451 di mana default sesuai dengan --include=1024-65535 . Secara analog dengan --exclude , --include dapat ditentukan melalui variabel lingkungan PORT4ME_INCLUDE dan PORT4ME_INCLUDE_SITE .
Selain memindai urutan port pseudo-random khusus pengguna untuk port gratis, dimungkinkan untuk juga mempertimbangkan set port yang telah ditentukan sebelum yang acak dengan menentukan opsi baris perintah --prepend , misalnya
{alice}$ port4me --prepend=4321,11001 --list=5
4321
11001
30845
19654
32310 Alternatif untuk menentukannya melalui opsi baris perintah, adalah menentukannya melalui variabel lingkungan PORT4ME_PREPEND , misalnya
{alice}$ PORT4ME_PREPEND=4321,11001 port4me --list=5
4321
11001
30845
19654
32310 Variabel lingkungan PORT4ME_PREPEND dimaksudkan untuk digunakan oleh masing -masing pengguna. Untuk menentukan satu set port yang akan dipersiapkan terlepas dari pengguna, atur PORT4ME_PREPEND_SITE .
Semua implementasi Port4ME output port yang diidentifikasi ke output standar (STDOUT). Ini membuatnya mudah ditangkap dengan metode shell standar, misalnya port="$(port4me)" . Jika Anda ingin melihat nomor port mana yang dihasilkan, gunakan tee untuk mengirim port juga ke kesalahan standar (stderr), yang dapat dilihat di terminal. Misalnya,
{alice}$ jupyter notebook --port " $( port4me --tool=jupyter-notebook | tee /dev/stderr ) "
29525Untuk menginstal versi Bash dari PortMe , lakukan:
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)Kemudian jalankan sebagai:
$ export PATH=/path/to/port4me/bin: $PATH
$ port4me --version
0.7.1Untuk menginstal paket R PortMe , yang tersedia di cran, hubungi yang berikut dari dalam R:
install.packages( " port4me " )Untuk mencobanya, hubungi:
> port4me :: port4me( " jupyter-notebook " )
[ 1 ] 47467atau
$ Rscript -e port4me::port4me jupyter-notebook
29525Paket Python Port4Me tersedia PYPI. Untuk menginstal paket Python PortMe ke Perpustakaan Paket Python pribadi Anda, hubungi yang berikut dari baris perintah:
$ pip install --user port4me Untuk menginstalnya ke lingkungan virtual Python, lepas opsi --user .
Untuk mencobanya, hubungi:
>>> from port4me import port4me
>>> port4me( " jupyter-notebook " )
29525atau
$ python -m port4me --tool=jupyter-notebook
29525 Harus dimungkinkan untuk mengimplementasikan algoritma menggunakan aritmatika integer unsigned 32-bit. Seseorang tidak boleh berasumsi bahwa bilangan bulat yang terwakili terbesar dapat melebihi
Urutan port-acak pseudo harus mencicipi port secara seragam
Paling tidak, harus dimungkinkan untuk mengimplementasikan algoritma dalam vanilla sh*, csh, bash, c, c ++, fortran, lua, python, r, dan ruby, tanpa perlu paket tambahan di luar apa yang tersedia dari distribusi inti mereka. (*) Kerang yang tidak mendukung aritmatika integer dapat menggunakan alat seperti expr , dc , bc , dan awk untuk perhitungan ini.
Semua bahasa pemrograman harus menghasilkan urutan port pseudo-acak yang sama persis dengan benih acak yang sama.
Implementasi harus ditulis sedemikian rupa sehingga mereka bekerja juga ketika bersumber, atau disalin.
Port yang diidentifikasi dan bebas harus dikeluarkan ke output standar (STDOUT) hanya sebagai digit, tanpa simbol awalan atau akhiran.
Pengguna harus dapat mengecualikan set port yang telah ditentukan dengan menentukan variabel lingkungan PORT4ME_EXCLUDE , misalnya PORT4ME_EXCLUDE=8080,4321 .
Administrator sistem harus dapat menentukan set port yang telah ditentukan sebelumnya untuk dikecualikan dengan menentukan variabel lingkungan PORT4ME_EXCLUDE_SITE , misalnya PORT4ME_EXCLUDE_SITE=8080,4321 . Ini berfungsi komplementer untuk PORT4ME_EXCLUDE .
Pengguna harus dapat melewatkan sejumlah port acak tertentu sesuai keinginan mereka dengan menentukan variabel lingkungan PORT4ME_SKIP , misalnya PORT4ME_SKIP=5 . Standarnya adalah untuk tidak melewatkan, yang sesuai dengan PORT4ME_SKIP=0 . Melewati harus berlaku setelah port tidak termasuk oleh PORT4ME_EXCLUDE dan PORT4ME_EXCLUDE_SITE .
Implementasi baru harus mereproduksi urutan port yang dihasilkan oleh implementasi yang sudah ada.
Generator Kongruensi Linear (LCG) akan digunakan untuk menghasilkan urutan port pseudo-acak
unggulan berikutnya,
Algoritma LCG tidak boleh berasumsi bahwa benih LCG saat ini ada di dalam
Algoritma LCG dapat menghasilkan benih output yang sama seperti biji input, yang mungkin terjadi saat benih itu
Parameter LCG seharusnya
Ini hanya membutuhkan aritmatika integer 32-bit, karena
Jika benih awal
HashCode string integer 32-bit akan digunakan untuk menghasilkan integer di
HashCode string digunakan sebagai biji LCG awal:
Benih LCG harus masuk
Diberikan kode hash