Jak zmienić domyślny numer portu udostępniania ekranu / VNC w systemie Mac OS X?

Odpowiedzi:

16

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
Greg Canty
źródło
Jeśli nadal jesteś w pobliżu - gdy to zrobisz, istnieje porównywalny sposób, aby uzyskać wbudowaną aplikację do udostępniania ekranu dla komputerów Mac, aby połączyć się z tym portem lub utkniesz przy użyciu aplikacji vnc innych firm, które pozwalają określić Port?
Jim Miller,
2
Odpowiedź na powyższe: w polu „Połącz z serwerem ...” podaj vnc: //yourserver.com: 54321 (zgodnie z poprzednim numerem portu powrotnego)
Jim Miller,
Jeśli to zadziała (nie mogę sprawdzić do wieczora), zasługujesz na dużo więcej pozytywnych opinii.
PaulSkinner,
1
Aby potwierdzić, tak, należy to zrobić po każdej aktualizacji systemu operacyjnego (w tym aktualizacji przyrostowych).
PaulSkinner
1
Aby dodać jeszcze jedną uwagę, nowa funkcja „rootless” w systemie OS X 10.11 El Capitan oznacza, że ​​nie można już zapisać tego konkretnego pliku bez wyłączenia funkcji rootowania, co nie jest zalecane. Czy ktoś zna obejście bez wyłączania rootowania?
PaulSkinner,
5

Mogę potwierdzić po znalezieniu tego wątku za pośrednictwem Google, że edycja /etc/servicesportó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.

MichaelM
źródło
Ta odpowiedź może być teraz rozwiązaniem do użycia z El Capitan 10.11.
PaulSkinner,
Aby to potwierdzić, jest to prawdopodobnie najlepsze rozwiązanie dla El Capitan 10.11 bez wyłączania rootowania.
PaulSkinner,
Działa to również w przypadku udostępniania plików (smb)! Zmieniłem port dla „Microsoft-DS”
Wowfunhappy
@PaulSkinner Czy rootless nie chroni wszystkiego w / etc? (Mam wyłączone, żeby nie wiedzieć)
Wowfunhappy,
@ Wowfunhappy zadziwiająco, nie.
PaulSkinner
3

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:

  • Użyj alternatywnego oprogramowania serwera VNC
  • Użyj tunelu ssh, aby przekierować ruch z niestandardowego portu na 5900
  • Skonfiguruj mapowanie portów w routerze, aby przejmować ruch przychodzący na innym porcie, aby przejść do portu 5900 na komputerze Mac.
Doug Harris
źródło
Ze względu na kompletność: niektórzy sugerują, że zmiana portów /etc/Servicesmoż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 .)
Arjan
1
Zwróć uwagę na odpowiedź Grega Canty'ego - można ją zmienić w wydaniach OS X po Snow Leopard. Ta odpowiedź została napisana przed wydaniem OS X Lion.
Doug Harris
1

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 [email protected].
#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
Będzie
źródło
Kiedy próbowałem uzyskać dostęp do linku - dostałem błąd Ten serwer nie mógł udowodnić, że jest getome.homeftp.net; jego certyfikat bezpieczeństwa nie jest zaufany przez system operacyjny twojego komputera. Może to być spowodowane błędną konfiguracją lub atakiem przechwytującym twoje połączenie.
Prasanna,
Przepraszam za tego Mureinika. Kod opublikowany zamiast linku.
Czy
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ł /Systemi 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 .

Krok po kroku

  1. Aktywuj udostępnianie ekranu w Preferencjach systemowych
  2. Wykonać

    sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.screensharing.plist
    
  3. Wykonać

    sudo cp /System/Library/LaunchDaemons/com.apple.screensharing.plist /Library/LaunchDaemons/com.apple.screensharing.plist
    
  4. W /Library/LaunchDaemons/com.apple.screensharing.plistedytuj 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>
    
  5. Utwórz /Library/LaunchDaemons/com.apple.screensharing.launcher.plistz 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>
    
  6. 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.

Mathieu H.
źródło