Odpowiedzi:
Rzeczywiście można przełączyć domyślny port dla serwera VNC na Apple Mac OS 10.7 Lion i 10.8 Mountain Lion. Aby zmienić port, musisz edytować plik plist serwera /System/Library/LaunchDaemons/com.apple.screensharing.plist
(ten plik nie istnieje w systemach wcześniejszych niż 10.7 Lion).
Edycja pliku wymaga uprawnień roota (sudo). W terminalu, jeśli znasz vi lub vim , możesz wpisać:
sudo vim /System/Library/LaunchDaemons/com.apple.screensharing.plist
lub jeśli nie, lepiej użyj nano :
sudo nano /System/Library/LaunchDaemons/com.apple.screensharing.plist
Teraz wszystko, co musisz zrobić, to zmienić wiersz 34 (ten, który czyta <string>vnc-server</string>
) na <string>nnnn</string>
gdzie nnnn to numer portu, którego chcesz użyć. Wiem, że dziwne wydaje się zmienianie nazwy typu „serwer vnc” na liczbę, ale właśnie tak trzeba to zrobić. Podałem przykład poniżej na wypadek, gdyby nic nie było jasne.
Aby zmienić domyślny port na 54321, zmodyfikuj plik plist, aby wyglądał następująco:
...
<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>
Po zapisaniu pliku, aby zmiana zaczęła obowiązywać, wyłącz opcję Udostępnianie ekranu, a następnie włącz ją ponownie w okienku preferencji Udostępnianie lub alternatywnie zwolnij i ponownie załaduj usługę za pomocą następujących poleceń:
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.screensharing.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.screensharing.plist
Mogę potwierdzić po znalezieniu tego wątku za pośrednictwem Google, że edycja /etc/services
portów „rfb” spowoduje zmianę portów nasłuchiwania dołączonego serwera VNC.
Zredagowałem plik i zrestartowałem (zwykle próbowałem ponownie uruchomić usługi lub zwolnić plik launchdeamon, ale miałem też inne problemy i nie przeszkadzałem). iTeleport na moim iPadzie nie udało się połączyć na 5900 i udało się na wysokim, nieuprzywilejowanym porcie, który wybrałem.
Zostało to omówione na różnych forach na apple.com i macosxhints.com . Krótka odpowiedź brzmi: „nie możesz tego zmienić”.
Dłuższe odpowiedzi sugerują sposoby obejścia tego problemu - trzy możliwości:
/etc/Services
może załatwić sprawę. Próbowałem tego (nawet zrestartowałem komputer Mac po zmianie) bezskutecznie. Zastanawiając się nad tym, może być nawet złym pomysłem na bałagan z tym plikiem, ponieważ inne aplikacje mogą go również użyć, aby uzyskać znany numer portu, jeśli chcą połączyć się z jakąś firmą zewnętrzną za pomocą określonego protokołu. (Na przykład: zmiana portu SSH w tym pliku może wydawać się działać, ale jest złym pomysłem .)
Na podstawie informacji dostarczonych przez Grega w tym wątku napisałem skrypt bash, który zautomatyzuje proces zmiany portu nasłuchiwania VNC twojego systemu. Działa dobrze w moich testach. Daj mi znać, jeśli ktoś ma z tym jakieś problemy.
#!/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
Aby zmienić domyślny port i / lub adres powiązania bez wyłączania Ochrony integralności systemu , musisz utworzyć nowego LaunchDaemon w /Library
.
Niestety agent udostępniania ekranu nie będzie działał poprawnie po przypisaniu innej etykiety. Oznacza to, że demon musi „zasłaniać” oryginał przy użyciu tej samej nazwy. Powoduje to własne problemy, ponieważ po ponownym uruchomieniu system załaduje oryginał /System
i zignoruje zmodyfikowaną wersję /Library
.
Rozwiązaniem jest wyłączenie LaunchDaemon i użycie demona „launchera”, który siłą załaduje zmodyfikowany LaunchDaemon. Jednak należy zachować ostrożność, aby nadal aktywować Udostępnianie ekranu poprzez preferencje lub zakończy się ono w trybie tylko obserwowania .
Wykonać
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.screensharing.plist
Wykonać
sudo cp /System/Library/LaunchDaemons/com.apple.screensharing.plist /Library/LaunchDaemons/com.apple.screensharing.plist
W /Library/LaunchDaemons/com.apple.screensharing.plist
edytuj sekcję Gniazda, aby wyglądać tak, jak chcesz. Na przykład słuchanie localhost:5901
:
<key>Sockets</key>
<dict>
<key>Listener</key>
<dict>
<key>SockNodeName</key>
<string>localhost</string>
<key>SockServiceName</key>
<string>5901</string>
</dict>
</dict>
Utwórz /Library/LaunchDaemons/com.apple.screensharing.launcher.plist
z następującą zawartością:
<?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>
Wykonać
sudo launchctl load -w /Library/LaunchDaemons/com.apple.screensharing.launcher.plist
Następnie prawa do udostępniania ekranu zostaną odpowiednio skonfigurowane, domyślny demon nie załaduje się automatycznie, a nasz program uruchamiający wymusi uruchomienie naszego dostosowanego demona.