Jawaban:
Anda sebenarnya dapat mengganti port default untuk server VNC Apple pada Mac OS 10.7 Lion dan 10.8 Mountain Lion. Untuk mengubah port, Anda perlu mengedit file plist server /System/Library/LaunchDaemons/com.apple.screensharing.plist
(file ini tidak ada di sistem sebelum 10.7 Lion).
Mengedit file memerlukan hak akses root (sudo). Di terminal, jika Anda terbiasa dengan vi atau vim , Anda dapat mengetik:
sudo vim /System/Library/LaunchDaemons/com.apple.screensharing.plist
atau jika tidak, Anda sebaiknya menggunakan nano :
sudo nano /System/Library/LaunchDaemons/com.apple.screensharing.plist
Sekarang, yang harus Anda lakukan adalah mengubah baris 34 (yang berbunyi <string>vnc-server</string>
) ke <string>nnnn</string>
tempat nnnn adalah nomor port yang ingin Anda gunakan. Saya tahu rasanya aneh mengubah nama seperti "vnc-server" ke nomor, tetapi itulah cara Anda harus melakukannya. Saya telah memasukkan contoh di bawah ini jika ada sesuatu yang tidak jelas.
Untuk mengubah port default ke 54321, Anda akan mengedit file plist agar terlihat seperti ini:
...
<key>Sockets</key>
<dict>
<key>Listener</key>
<dict>
<key>Bonjour</key>
<string>rfb</string>
<key>SockServiceName</key>
<string>54321</string> <!-- Change this line! -->
</dict>
</dict>
<key>UserName</key>
<string>root</string>
<key>SHAuthorizationRight</key>
<string>system.preferences</string>
</dict>
</plist>
Setelah menyimpan file, untuk membuat perubahan berlaku, matikan Berbagi Layar dan nyalakan lagi di panel preferensi Berbagi, atau alternatifkan bongkar dan muat ulang layanan menggunakan perintah ini:
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.screensharing.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.screensharing.plist
Saya dapat mengonfirmasi setelah menemukan utas ini melalui Google bahwa pengeditan /etc/services
untuk port "rfb" akan mengubah port mendengarkan server VNC yang disertakan.
Saya mengedit file dan reboot (biasanya saya akan mencoba me-restart layanan atau membongkar launchdeamon tetapi saya mengalami beberapa masalah lain juga dan tidak mengganggu). iTeleport di iPad saya kemudian gagal terhubung pada 5900 dan berhasil pada port unprivileged tinggi yang saya pilih.
Ini telah dibahas di berbagai forum di apple.com dan di macosxhints.com . Jawaban singkatnya adalah "Anda tidak dapat mengubahnya".
Jawaban yang lebih panjang menyarankan cara mengatasinya - tiga kemungkinan:
/etc/Services
mungkin berguna. Saya mencobanya (saya bahkan reboot Mac saya setelah mengubahnya) tidak berhasil. Dan memikirkannya lagi, bahkan mungkin ide buruk untuk mengacaukan file itu, karena aplikasi lain mungkin juga menggunakannya untuk mendapatkan nomor port yang terkenal jika mereka ingin terhubung ke beberapa pihak ketiga menggunakan protokol tertentu. (Seperti: mengubah port SSH dalam file itu mungkin tampak berfungsi tetapi merupakan ide yang buruk .)
Berdasarkan info yang diberikan oleh Greg di utas ini saya menulis skrip bash yang akan mengotomatiskan proses mengubah port mendengarkan VNC sistem Anda. Bekerja dengan baik dalam pengujian saya. Beritahu saya jika ada yang punya masalah dengannya.
#!/bin/sh
#Created by Will D. on 04/10/2015
#If you find it useful (or have suggestions, feedback, etc.), shoot me an email at throwapenny@me.com.
#Requires Mac OS 10.7.x or later (tested up to and including 10.10.3)
#02/02/2016 - Updated Script to alert for SIP status
#Setting Static Variables
sourcepath="/System/Library/LaunchDaemons/"
filename="com.apple.screensharing.plist"
port=`less $sourcepath$filename | awk 'f{print $1;f=0} /SockServiceName/ {f=1}' | awk -F "<|>" '{print $3}'`
os_version=`sw_vers -productVersion`
os_version_aug=`sw_vers -productVersion | awk -F "." '{print $1$2}'`
sip_status=`csrutil status | awk '{print $5}'`
#Colors
nc='\033[0m'
light_red='\033[1;31m' #Light Red
yellow='\033[1;33m' #Yellow
clear
#Check the script is being run by root
if [ "$EUID" -ne 0 ];then
printf "${light_red}This Script Must Run As Root${nc}\n"
exit 0
fi
clear
printf ${yellow};echo "---------------------------------------------------------------"
echo "--- ---"
echo "--- This Script Will Change Your Systems VNC Listening Port ---"
echo "--- Hit Ctrl + c to exit at anytime ---"
echo "--- ---"
echo "---------------------------------------------------------------";printf "${nc}\n"
#Check System Version
sleep 1
if [ "${os_version_aug}" -lt "107" ]; then
echo ""
echo "System OS Must Be Greater Than 10.7.x. Aborting Script."
exit 0
else
echo ""
echo "System OS Version is" $os_version
echo "OS Requirement Met √"
echo "--------"
fi
if [ "${os_version_aug}" == "1011" ]; then
if [ "${sip_status}" == "enabled." ]; then
echo ""
printf "${light_red}••• System Integrity Protection is Enabled •••${nc}\n"
echo ""
echo "This script modifies /System/Library/LaunchDaemons/com.apple.screensharing.plist"
echo "Please Disable System Integrity Protection Before Running"
echo ""
exit 0
fi
fi
#Give Feedback on Current Port
sleep 1
if [ "${port}" == "vnc-server" ]; then
echo ""
echo "The System's VNC Port is Currently"
echo "Set to the System Default Port of 5900."
echo "--------"
elif [ "${port}" != "vnc-server" ]; then
echo ""
echo "The System's VNC Port is Currently"
echo "Set to a Non-default Port of" $port"."
echo "--------"
fi
#Updating Port
echo ""
printf "What Port Would You Like VNC to Listen On? "
read newport
echo ""
echo "The Following Action Requires an Admin Password."
echo "Note: Your Password Will Be Visible When You Type It"
echo ""
printf "Admin Password? "
read admin_pass
sleep 1
echo ""
echo "Created" $filename".bak."
sleep 1
echo ""
echo "Updating VNC Port to" $newport"..."
echo $admin_pass | sudo -S sed -i.bak -e "s|$port|$newport|g" $sourcepath$filename
sleep 1
echo "Done"
echo ""
sleep 1
#Restarting screensharing process
echo "Restarting Screen Sharing Service..."
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.screensharing.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.screensharing.plist
echo "Done"
sleep 1
echo ""
echo "Your System's VNC Port is Now Set to" $newport"."
echo ""
echo "Update Complete. All Done."
if [ "${os_version_aug}" == "1011" ]; then
echo ""
echo "Since you're running El Capitan"
echo "be sure to re-enable System Integrity Protection"
exit 0
fi
exit 0
Untuk mengubah port default dan / atau alamat yang mengikat tanpa menonaktifkan System Integrity Protection , Anda harus membuat LaunchDaemon baru di /Library
.
Sayangnya agen berbagi layar tidak akan berfungsi dengan baik ketika diberi label yang berbeda. Itu berarti daemon harus "membayangi" aslinya menggunakan nama yang sama. Itu menyebabkan masalah sendiri karena saat reboot, sistem akan memuat yang asli /System
dan mengabaikan versi yang dimodifikasi di /Library
.
Solusinya adalah dengan menonaktifkan LaunchDaemon dan menggunakan daemon "launcher" yang secara paksa akan memuat LaunchDaemon yang dimodifikasi. Namun harus berhati-hati untuk tetap mengaktifkan Berbagi Layar melalui preferensi atau membiarkannya akan berakhir dalam mode hanya mengamati .
Menjalankan
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.screensharing.plist
Menjalankan
sudo cp /System/Library/LaunchDaemons/com.apple.screensharing.plist /Library/LaunchDaemons/com.apple.screensharing.plist
Di /Library/LaunchDaemons/com.apple.screensharing.plist
, edit bagian Soket untuk melihat seperti yang Anda inginkan. Misalnya mendengarkan pada localhost:5901
:
<key>Sockets</key>
<dict>
<key>Listener</key>
<dict>
<key>SockNodeName</key>
<string>localhost</string>
<key>SockServiceName</key>
<string>5901</string>
</dict>
</dict>
Buat /Library/LaunchDaemons/com.apple.screensharing.launcher.plist
dengan konten berikut:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.apple.screensharing.launcher</string>
<key>LaunchOnlyOnce</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>load</string>
<string>-F</string>
<string>/Library/LaunchDaemons/com.apple.screensharing.plist</string>
</array>
</dict>
</plist>
Menjalankan
sudo launchctl load -w /Library/LaunchDaemons/com.apple.screensharing.launcher.plist
Setelah ini, hak Berbagi Layar akan disediakan dengan benar, daemon default tidak akan dimuat secara otomatis, dan peluncur kami akan secara paksa memulai daemon khusus kami.