¿Cómo cambiar el número de puerto de pantalla compartida / VNC predeterminado en Mac OS X?

Respuestas:

16

En realidad, puede cambiar el puerto predeterminado para el servidor VNC de Apple en Mac OS 10.7 Lion y 10.8 Mountain Lion. Para cambiar el puerto, debe editar el archivo plist del servidor /System/Library/LaunchDaemons/com.apple.screensharing.plist(este archivo no existe en los sistemas anteriores a 10.7 Lion).

La edición del archivo requiere privilegios de root (sudo). En la terminal, si está familiarizado con vi o vim , puede escribir:

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

o si no lo eres, será mejor que uses nano :

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

Ahora, todo lo que tiene que hacer es cambiar la línea 34 (la que se lee <string>vnc-server</string>) a <string>nnnn</string>donde nnnn es el número de puerto que desea usar. Sé que parece extraño cambiar un nombre como "vnc-server" a un número, pero esa es la forma en que debes hacerlo. He incluido un ejemplo a continuación en caso de que algo no esté claro.

Para cambiar el puerto predeterminado a 54321, editaría el archivo plist para que se vea así:

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

Después de guardar el archivo, para que el cambio surta efecto, apague Compartir pantalla y vuelva a encenderlo en el panel de preferencias Compartir, o alternativamente descargue y vuelva a cargar el servicio con estos comandos:

sudo launchctl unload /System/Library/LaunchDaemons/com.apple.screensharing.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.screensharing.plist
Greg Canty
fuente
Si todavía está cerca, una vez que haya hecho esto, ¿hay una manera comparable de hacer que la aplicación de pantalla compartida de Mac incorporada se conecte a ese puerto, o está atascado usando aplicaciones de vnc de terceros que le permiten especificar el ¿Puerto?
Jim Miller
2
Respuesta a lo anterior: En "Conectarse al servidor ...", especifique vnc: //yourserver.com: 54321 (siguiendo el número de puerto de ejemplo anterior)
Jim Miller
Si esto funciona (no puedo verificar hasta esta noche), te mereces muchos más votos a favor.
PaulSkinner
1
Para confirmar, sí, deberá hacer esto después de cada actualización del sistema operativo (incluidas las actualizaciones incrementales).
PaulSkinner
1
Para agregar una nota más a esto, la nueva característica 'sin raíz' de OS X 10.11 El Capitan significa que ya no es posible guardar este archivo en particular sin deshabilitar la característica sin raíz, lo que no se recomienda. ¿Alguien sabe una solución sin deshabilitar rootless?
PaulSkinner
5

Después de encontrar este hilo a través de Google, puedo confirmar que la edición /etc/servicesde los puertos "rfb" cambiará los puertos de escucha del servidor VNC incluido.

Edité el archivo y reinicié (por lo general, intentaba reiniciar los servicios o descargar el launchdeamon, pero también tenía otros problemas y no me molesté). iTeleport en mi iPad no pudo conectarse en 5900 y tuvo éxito en el puerto sin privilegios que elegí.

MichaelM
fuente
Esta respuesta ahora puede ser la solución para usar con El Capitan 10.11.
PaulSkinner
Para confirmar, esta es probablemente la mejor solución para El Capitan 10.11 sin deshabilitar rootless.
PaulSkinner
¡Esto funcionó para File Sharing (smb) también! Cambié el puerto para "Microsoft-DS"
Wowfunhappy
@PaulSkinner ¿No rootless protege todo en / etc? (Lo tengo desactivado, así que no lo sabría)
Wowfunhappy
@Wowfunhappy sorprendentemente, no.
PaulSkinner
3

Esto se ha discutido en varios foros en apple.com y en macosxhints.com . La respuesta corta es "no se puede cambiar".

Las respuestas más largas sugieren formas de evitarlo: tres posibilidades:

  • Utilice un software de servidor VNC alternativo
  • Use un túnel ssh para redirigir el tráfico desde su puerto personalizado a 5900
  • Configure la asignación de puertos en su enrutador para tomar el tráfico entrante en un puerto diferente para ir al puerto 5900 en su mac.
Doug Harris
fuente
Solo en aras de la exhaustividad: algunos sugieren que cambiar los puertos /etc/Servicespodría ser el truco. Lo intenté (incluso reinicié mi Mac después de cambiarlo) fue en vano. Y reflexionando un poco más, incluso podría ser una mala idea meterse con ese archivo, ya que otras aplicaciones también podrían usarlo para obtener el número de puerto conocido si quieren conectarse a un tercero utilizando un protocolo específico. (Como: cambiar el puerto SSH en ese archivo puede parecer que funciona, pero es una mala idea .)
Arjan
1
Tenga en cuenta la respuesta de Greg Canty: se puede cambiar en las versiones de OS X después de Snow Leopard. Esta respuesta se escribió originalmente antes de que se lanzara OS X Lion.
Doug Harris
1

Basado en la información provista por Greg en este hilo, escribí un script bash que automatizará el proceso de cambiar el puerto de escucha VNC de su sistema. Funciona bien en mis pruebas. Avíseme si alguien tiene algún problema con eso.

#!/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
Será
fuente
Cuando intenté acceder al enlace, recibí el error Este servidor no pudo probar que es getsome.homeftp.net; el sistema operativo de su computadora no confía en su certificado de seguridad. Esto puede ser causado por una configuración incorrecta o un atacante que intercepta su conexión.
Prasanna
Perdón por eso Mureinik. Código publicado en lugar de un enlace.
Se
0

Para cambiar el puerto predeterminado y / o la dirección de enlace sin deshabilitar la Protección de integridad del sistema , debe crear un nuevo LaunchDaemon en /Library.

Lamentablemente, el agente para compartir pantalla no funcionará correctamente cuando se le asigne una etiqueta diferente. Eso significa que el demonio tiene que estar "sombreando" el original usando el mismo nombre. Eso causa sus propios problemas porque al reiniciar, el sistema cargará el original /Systeme ignorará la versión modificada /Library.

La solución es deshabilitar el LaunchDaemon y usar un demonio "launcher" que cargará a la fuerza el LaunchDaemon modificado. Sin embargo, se debe tener cuidado para seguir activando Compartir pantalla a través de las preferencias o, de lo contrario, terminará en modo de observación solamente .

Paso a paso

  1. Activar Compartir pantalla en las Preferencias del sistema
  2. Ejecutar

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

    sudo cp /System/Library/LaunchDaemons/com.apple.screensharing.plist /Library/LaunchDaemons/com.apple.screensharing.plist
    
  4. En /Library/LaunchDaemons/com.apple.screensharing.plist, edite la sección Sockets para ver cómo lo desea. Por ejemplo escuchando en 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 el siguiente contenido:

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

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

Después de esto, los derechos de Compartir pantalla se aprovisionarán correctamente, el demonio predeterminado no se cargará automáticamente y nuestro lanzador iniciará por la fuerza nuestro demonio personalizado.

Mathieu H.
fuente