Come modificare il numero di porta VNC / condivisione schermo predefinito su Mac OS X?


Risposte:


16

In realtà è possibile cambiare la porta predefinita per il server VNC di Apple su Mac OS 10.7 Lion e 10.8 Mountain Lion. Per cambiare la porta, è necessario modificare il file plist del server /System/Library/LaunchDaemons/com.apple.screensharing.plist(questo file non esiste nei sistemi precedenti alla 10.7 Lion).

La modifica del file richiede i privilegi di root (sudo). Nel terminale, se hai familiarità con vi o vim , puoi digitare:

sudo vim /System/Library/LaunchDaemons/com.apple.screensharing.plist

o in caso contrario, è meglio usare nano :

sudo nano /System/Library/LaunchDaemons/com.apple.screensharing.plist

Ora, tutto ciò che devi fare è cambiare la riga 34 (quella che legge <string>vnc-server</string>) in <string>nnnn</string>cui nnnn è il numero di porta che desideri utilizzare. So che sembra strano cambiare un nome come "vnc-server" in un numero, ma è così che devi farlo. Ho incluso un esempio di seguito nel caso in cui qualcosa non sia chiaro.

Per modificare la porta predefinita su 54321, modificare il file plist in questo modo:

...
<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>

Dopo aver salvato il file, per rendere effettive le modifiche, disattivare la condivisione dello schermo e riaccenderla nel riquadro delle preferenze di condivisione oppure, in alternativa, scaricare e ricaricare il servizio utilizzando questi comandi:

sudo launchctl unload /System/Library/LaunchDaemons/com.apple.screensharing.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.screensharing.plist

Se sei ancora in giro - una volta fatto questo, c'è un modo comparabile per far sì che l'app di condivisione dello schermo Mac integrata si colleghi a quella porta o sei bloccato usando app di vnc di terze parti che ti consentono di specificare il porta?
Jim Miller,

2
Risposta a sopra: in "Connetti al server ...", specifica vnc: //yourserver.com: 54321 (seguendo il precedente numero di riferimento dell'esempio)
Jim Miller,

Se funziona (non posso controllare fino a stasera), meriti molti più voti.
PaulSkinner,

1
Per confermare, sì, è necessario farlo dopo ogni aggiornamento del sistema operativo (inclusi gli aggiornamenti incrementali).
PaulSkinner,

1
Per aggiungere un'altra nota a questo, la nuova funzionalità 'rootless' di OS X 10.11 El Capitan significa che non è più possibile salvare questo particolare file senza disabilitare la funzione rootless, che non è consigliata. Qualcuno conosce una soluzione alternativa senza disabilitare il rootless?
Paulkinkin

5

Posso confermare dopo aver trovato questo thread tramite Google che la modifica /etc/servicesper le porte "rfb" cambierà le porte di ascolto del server VNC incluso.

Ho modificato il file e riavviato (di solito provavo a riavviare i servizi o a scaricare il launchdeamon ma avevo anche altri problemi e non mi preoccupavo). iTeleport sul mio iPad quindi non è riuscito a connettersi su 5900 e ha avuto successo sull'alta porta senza privilegi che ho scelto.


Questa risposta potrebbe ora essere la soluzione da utilizzare con El Capitan 10.11.
PaulSkinner,

Per confermare, questa è probabilmente la migliore soluzione per El Capitan 10.11 senza disabilitare il rootless.
PaulSkinner,

Questo ha funzionato anche per la condivisione di file (smb)! Ho cambiato la porta per "Microsoft-DS"
Wowfunhappy,

@PaulSkinner Il rootless non protegge tutto in / etc? (L'ho disabilitato, quindi non lo saprei)
Wowfunhappy,

@Wowfunhappy incredibilmente, no.
PaulSkinner,

3

Questo è stato discusso in vari forum su apple.com e su macosxhints.com . La risposta breve è "non puoi cambiarla".

Le risposte più lunghe suggeriscono modi per aggirarlo: tre possibilità:

  • Utilizzare un software server VNC alternativo
  • Utilizzare un tunnel ssh per reindirizzare il traffico dalla porta personalizzata a 5900
  • Configura la mappatura delle porte nel tuo router per ricevere il traffico in entrata su una porta diversa per passare alla porta 5900 sul tuo mac.

Solo per completezza: alcuni suggeriscono che cambiare le porte /etc/Servicespotrebbe fare il trucco. L'ho provato (ho anche riavviato il mio Mac dopo averlo modificato) senza alcun risultato. E pensandoci ancora un po ', potrebbe anche essere una cattiva idea fare confusione con quel file, poiché anche altre applicazioni potrebbero usarlo per ottenere il numero di porta noto se vogliono connettersi ad alcune terze parti utilizzando un protocollo specifico. (Tipo: cambiare la porta SSH in quel file potrebbe sembrare funzionare ma è una cattiva idea .)
Arjan

1
Nota la risposta di Greg Canty: può essere modificato nelle versioni di OS X dopo Snow Leopard. Questa risposta è stata originariamente scritta prima del rilascio di OS X Lion.
Doug Harris,

1

Sulla base delle informazioni fornite da Greg in questo thread, ho scritto uno script bash che automatizzerà il processo di modifica della porta di ascolto VNC del sistema. Funziona bene nei miei test. Fammi sapere se qualcuno ha qualche problema con esso.

#!/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

Quando ho provato ad accedere al collegamento, ho riscontrato
Prasanna,

Mi dispiace per quel Mureinik. Codice pubblicato anziché un collegamento.
Sarà il

0

Per modificare la porta predefinita e / o l'indirizzo di associazione senza disabilitare la protezione dell'integrità del sistema , è necessario creare un nuovo LaunchDaemon in /Library.

Sfortunatamente l'agente di condivisione dello schermo non funzionerà correttamente se assegnato un'etichetta diversa. Ciò significa che il demone deve "oscurare" l'originale usando lo stesso nome. Ciò causa i propri problemi perché al riavvio, il sistema caricherà l'originale /Systeme ignorerà la versione modificata /Library.

La soluzione è disabilitare LaunchDaemon e utilizzare un demone "launcher" che caricherà forzatamente LaunchDaemon modificato. Tuttavia, è necessario prestare attenzione ad attivare la Condivisione schermo tramite le preferenze, altrimenti si verificherà in modalità solo osservazione .

Passo dopo passo

  1. Attiva Condivisione schermo nelle Preferenze di Sistema
  2. Eseguire

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

    sudo cp /System/Library/LaunchDaemons/com.apple.screensharing.plist /Library/LaunchDaemons/com.apple.screensharing.plist
    
  4. In /Library/LaunchDaemons/com.apple.screensharing.plist, modifica la sezione Socket per guardare come vuoi. Ad esempio ascoltando 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. Crea /Library/LaunchDaemons/com.apple.screensharing.launcher.plistcon il seguente contenuto:

    <?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. Eseguire

    sudo launchctl load -w /Library/LaunchDaemons/com.apple.screensharing.launcher.plist
    

Successivamente, i diritti di condivisione dello schermo verranno forniti correttamente, il demone predefinito non verrà caricato automaticamente e il nostro launcher avvierà forzatamente il nostro demone personalizzato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.