Как изменить используемый по умолчанию номер экрана общего доступа / порта VNC в Mac OS X?


Ответы:


16

На самом деле вы можете переключить порт по умолчанию для VNC-сервера Apple в Mac OS 10.7 Lion и 10.8 Mountain Lion. Чтобы изменить порт, вам нужно отредактировать файл plist сервера /System/Library/LaunchDaemons/com.apple.screensharing.plist(этот файл не существует в системах до 10.7 Lion).

Редактирование файла требует прав root (sudo). В терминале, если вы знакомы с vi или vim , вы можете ввести:

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

или, если нет, лучше использовать nano :

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

Теперь все, что вам нужно сделать, это изменить строку 34 (ту, которая читает <string>vnc-server</string>) на <string>nnnn</string>где nnnn - номер порта, который вы хотите использовать. Я знаю, что странно менять имя типа "vnc-server" на число, но это то, как вы должны это сделать. Я включил пример ниже на случай, если что-то не понятно.

Чтобы изменить порт по умолчанию на 54321, вы должны отредактировать файл plist следующим образом:

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

После сохранения файла, чтобы изменения вступили в силу, выключите и снова включите общий доступ к экрану на панели настроек общего доступа или, альтернативно, выгрузите и повторно загрузите службу, используя следующие команды:

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

Если вы все еще здесь - после того, как вы это сделали, есть ли аналогичный способ заставить встроенное приложение для обмена экранами Mac подключиться к этому порту, или вы застряли в сторонних приложениях vnc, которые позволяют вам указать порт?
Джим Миллер

2
Ответ на этот вопрос: в «Подключиться к серверу ...» укажите vnc: //yourserver.com: 54321 (следуя более раннему примеру с номером порта)
Джим Миллер

Если это сработает (я не могу проверить до сегодняшнего вечера), вы заслуживаете гораздо больше голосов.
PaulSkinner

1
Чтобы подтвердить, да, вам нужно будет делать это после каждого обновления ОС (включая инкрементные обновления).
PaulSkinner

1
Чтобы добавить еще одну заметку к этому, новая функция «без рута» в OS X 10.11 El Capitan означает, что больше невозможно сохранить этот конкретный файл без отключения функции без рута, что не рекомендуется. Кто-нибудь знает обходной путь без отключения root?
PaulSkinner

5

После нахождения этой /etc/servicesтемы через Google я могу подтвердить, что редактирование портов "rfb" изменит порты прослушивания включенного VNC-сервера.

Я отредактировал файл и перезагрузил компьютер (обычно я пытался перезапустить службы или выгрузить файл запуска, но у меня были и другие проблемы, и я не беспокоился). iTeleport на моем iPad не смог подключиться к 5900 и преуспел на высоком непривилегированном порту, который я выбрал.


Этот ответ теперь может быть решением для использования с El Capitan 10.11.
PaulSkinner

Чтобы подтвердить, сейчас это, вероятно, лучшее решение для El Capitan 10.11 без отключения root.
PaulSkinner

Это сработало и для обмена файлами (smb)! Я изменил порт для «Microsoft-DS»
Wowfunhappy

@PaulSkinner Не защищает ли root-файлы все в / etc? (У меня отключено, поэтому я не знаю)
Wowfunhappy

@ Ничего удивительного, нет.
PaulSkinner

3

Это обсуждалось на различных форумах на apple.com и macosxhints.com . Короткий ответ: «Вы не можете это изменить».

Более длинные ответы предлагают способы обойти это - три возможности:

  • Используйте альтернативное программное обеспечение VNC-сервера
  • Используйте туннель ssh для перенаправления трафика с вашего пользовательского порта на 5900
  • Сконфигурируйте сопоставление портов в вашем маршрутизаторе, чтобы принимать входящий трафик через другой порт для перехода к порту 5900 на вашем Mac.

Просто ради полноты: некоторые предполагают, что смена портов /etc/Servicesможет помочь. Я попробовал это (я даже перезагрузил свой Mac после его изменения) безрезультатно. И если подумать, может быть плохой идеей связываться с этим файлом, так как другие приложения могут также использовать его для получения известного номера порта, если они хотят подключиться к какой-либо третьей стороне по определенному протоколу. (Например, изменение порта SSH в этом файле может показаться работоспособным, но это плохая идея .)
Arjan

1
Обратите внимание на ответ Грега Канти - его можно изменить в выпусках OS X после Snow Leopard. Этот ответ был изначально написан до выхода OS X Lion.
Даг Харрис

1

Основываясь на информации, предоставленной Грегом в этой теме, я написал скрипт bash, который автоматизирует процесс изменения порта прослушивания VNC в вашей системе. Хорошо работает в моих тестах. Дайте мне знать, если у кого-то есть какие-либо проблемы с этим.

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

Когда я попытался получить доступ к ссылке - я получил ошибку. Этот сервер не смог доказать, что это getsome.homeftp.net; его сертификат безопасности не является доверенным для операционной системы вашего компьютера. Это может быть вызвано неверной конфигурацией или злоумышленником, перехватывающим ваше соединение.
Прасанна

Извините за это Мурейник. Код размещен вместо ссылки.
Будет

0

Чтобы изменить порт по умолчанию и / или адрес привязки без отключения защиты целостности системы , необходимо создать новый LaunchDaemon в /Library.

К сожалению, агент совместного использования экрана не будет работать должным образом при назначении другой метки. Это означает, что демон должен «скрывать» оригинал под тем же именем. Это вызывает свои собственные проблемы, потому что при перезагрузке система загрузит оригинал /Systemи проигнорирует измененную версию в /Library.

Решение состоит в том, чтобы отключить LaunchDaemon и использовать демон "launcher", который принудительно загрузит модифицированный LaunchDaemon. Однако следует позаботиться о том, чтобы по-прежнему активировать общий доступ к экрану через настройки, иначе он будет работать только в режиме наблюдения .

Шаг за шагом

  1. Активировать общий доступ к экрану в системных настройках
  2. казнить

    sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.screensharing.plist
    
  3. казнить

    sudo cp /System/Library/LaunchDaemons/com.apple.screensharing.plist /Library/LaunchDaemons/com.apple.screensharing.plist
    
  4. В /Library/LaunchDaemons/com.apple.screensharing.plistразделе редактирования сокетов, чтобы посмотреть, как вы хотите. Например, прослушивание 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. Создайте /Library/LaunchDaemons/com.apple.screensharing.launcher.plistсо следующим содержанием:

    <?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. казнить

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

После этого права на общий доступ к экрану будут предоставлены должным образом, демон по умолчанию не будет загружаться автоматически, и наш модуль запуска принудительно запустит наш настроенный демон.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.