Вопрос или проблема
Есть ли способ изменить его с порта по умолчанию 5900
на другой порт?
На самом деле вы можете переключить порт по умолчанию для сервера 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> <!-- Измените эту строку! -->
</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
Я могу подтвердить, что редактирование /etc/services
для портов “rfb” изменит порты прослушивания включенного сервера VNC.
Я отредактировал файл и перезагрузил компьютер (обычно я бы попробовал перезапустить службы или выгрузить демона запуска, но у меня были некоторые другие проблемы, и я не стал забивать на это). iTeleport на моем iPad не смог подключиться на 5900, но успешно подключился на высоком непривилегированном порту, который я выбрал.
Эта тема обсуждалась на различных форумах на apple.com и на macosxhints.com. Краткий ответ: “вы не можете его изменить”.
Долгие ответы предлагают обходные пути — три варианта:
- Использовать альтернативное программное обеспечение VNC-сервера
- Использовать ssh-туннель для перенаправления трафика с вашего пользовательского порта на 5900
- Настроить переадресацию портов на вашем маршрутизаторе, чтобы входящий трафик на другом порту перенаправлялся на порт 5900 на вашем Mac.
Основываясь на информации, предоставленной Грегом в этой теме, я написал bash-скрипт, который автоматизирует процесс изменения порта прослушивания VNC в вашей системе. Он хорошо работает в моих тестах. Дайте знать, если у кого-то будут проблемы с ним.
#!/bin/sh
#Создан Уиллом Д. 04/10/2015
#Если вам это полезно (или есть предложения, отзывы и т.д.), напишите мне на [email protected].
#Требуется Mac OS 10.7.x или новее (тестировался до и включая 10.10.3)
#02/02/2016 - Обновленный скрипт для уведомления о статусе SIP
#Установка статических переменных
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}'`
#Цвета
nc="\033[0m"
light_red='\033[1;31m' #Светло-красный
yellow='\033[1;33m' #Желтый
clear
#Проверка, что скрипт выполняется от имени root
if [ "$EUID" -ne 0 ];then
printf "${light_red}Этот скрипт должен выполняться от имени root${nc}\n"
exit 0
fi
clear
printf ${yellow};echo "---------------------------------------------------------------"
echo "--- ---"
echo "--- Этот скрипт изменит порт прослушивания VNC вашей системы ---"
echo "--- Нажмите Ctrl + c, чтобы выйти в любой момент ---"
echo "--- ---"
echo "---------------------------------------------------------------";printf "${nc}\n"
#Проверка версии системы
sleep 1
if [ "${os_version_aug}" -lt "107" ]; then
echo ""
echo "Версия ОС должна быть больше 10.7.x. Прерывание скрипта."
exit 0
else
echo ""
echo "Версия ОС" $os_version
echo "Требования ОС выполнены √"
echo "--------"
fi
if [ "${os_version_aug}" == "1011" ]; then
if [ "${sip_status}" == "enabled." ]; then
echo ""
printf "${light_red}••• Защита целостности системы включена •••${nc}\n"
echo ""
echo "Этот скрипт изменяет /System/Library/LaunchDaemons/com.apple.screensharing.plist"
echo "Пожалуйста, отключите защиту целостности системы перед запуском"
echo ""
exit 0
fi
fi
#Обратная связь о текущем порте
sleep 1
if [ "${port}" == "vnc-server" ]; then
echo ""
echo "Порт VNC системы в настоящее время"
echo "Установлен на системный порт по умолчанию 5900."
echo "--------"
elif [ "${port}" != "vnc-server" ]; then
echo ""
echo "Порт VNC системы в настоящее время"
echo "Установлен на нестандартный порт" $port"."
echo "--------"
fi
#Обновление порта
echo ""
printf "На каком порту вы хотите, чтобы VNC слушал? "
read newport
echo ""
echo "Следующее действие требует пароль администратора."
echo "Примечание: ваш пароль будет виден, когда вы его введете"
echo ""
printf "Пароль администратора? "
read admin_pass
sleep 1
echo ""
echo "Создан" $filename".bak."
sleep 1
echo ""
echo "Обновление порта VNC на" $newport"..."
echo $admin_pass | sudo -S sed -i.bak -e "s|$port|$newport|g" $sourcepath$filename
sleep 1
echo "Готово"
echo ""
sleep 1
#Перезапуск процесса общего доступа к экрану
echo "Перезапуск службы общего доступа к экрану..."
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.screensharing.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.screensharing.plist
echo "Готово"
sleep 1
echo ""
echo "Порт VNC вашей системы теперь установлен на" $newport"."
echo ""
echo "Обновление завершено. Все сделано."
if [ "${os_version_aug}" == "1011" ]; then
echo ""
echo "Поскольку вы используете El Capitan"
echo "не забудьте снова включить защиту целостности системы"
exit 0
fi
exit 0
Чтобы изменить порт по умолчанию и/или адрес привязки, не отключая Защиту целостности системы, вам нужно создать новый демона запуска в /Library
.
К сожалению, агент общего доступа к экрану не будет работать правильно, если ему присвоено другое имя. Это означает, что демон должен “затенять” оригинал, используя то же имя. Это вызывает свои собственные проблемы, потому что при перезагрузке система загрузит оригинал в /System
и проигнорирует изменённую версию в /Library
.
Решение заключается в отключении демона запуска и использовании “демона-локатора”, который будет принудительно загружать изменённый демон запуска. Однако следует быть осторожным, чтобы всё равно активировать общий доступ к экрану через настройки, иначе он окажется в режиме наблюдения.
Пошаговая инструкция
- Активируйте общий доступ к экрану в системных настройках
-
Выполните
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.screensharing.plist
-
Выполните
sudo cp /System/Library/LaunchDaemons/com.apple.screensharing.plist /Library/LaunchDaemons/com.apple.screensharing.plist
-
В
/Library/LaunchDaemons/com.apple.screensharing.plist
отредактируйте раздел Sockets, чтобы он выглядел так, как вы хотите. Например, чтобы слушал наlocalhost:5901
:<key>Sockets</key> <dict> <key>Listener</key> <dict> <key>SockNodeName</key> <string>localhost</string> <key>SockServiceName</key> <string>5901</string> </dict> </dict>
-
Создайте
/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>
-
Выполните
sudo launchctl load -w /Library/LaunchDaemons/com.apple.screensharing.launcher.plist
После этого права общего доступа к экрану будут правильно настроены, стандартный демон не будет загружаться автоматически, а наш локатор принудительно запустит наш настроенный демон.
Обратите внимание, что решение, предложенное @MichaelM и отредактированное @shrmn, по-прежнему работает в Mac OS Sonoma. Оригинальное решение не работает из-за функции ‘rootless’, введенной с El Capitan.
Откройте терминал и выполните:
sudo vim /etc/services
или, если вам удобнее с nano:
sudo nano /etc/services
Привилегированные порты перечислены в порядке возрастания. Прокрутите вниз до следующих записей:
rfb 5900/tcp vnc-server # VNC Server
rfb 5900/udp vnc-server # VNC Server
Измените ‘5900’ на номер порта по вашему выбору. Обратите внимание, что оба номера порта должны совпадать.
Перезагрузите, и ваши новые порты должны вступить в силу. Тестировалось с Sonoma 14.4
Ответ или решение
Чтобы изменить порт по умолчанию для экрана обмена или VNC на Mac OS X, следует учесть несколько важных шагов и нюансов. По умолчанию VNC-сервер использует порт 5900, и при необходимости его можно изменить, но необходимо делать это с осторожностью. В этом руководстве мы рассмотрим, как выполнить изменение порта на системах начиная с Mac OS X 10.7 Lion.
Подробное руководство по изменению порта VNC
-
Проверка версии операционной системы
Для начала необходимо убедиться, что ваша версия операционной системы — 10.7 Lion или новее, так как возможность изменения порта доступна лишь с этих версий. -
Редактирование plist файла
Изменение предполагает редактирование файлаcom.apple.screensharing.plist
, который находится по следующему пути:/System/Library/LaunchDaemons/com.apple.screensharing.plist
Для доступа к этому файлу требуются права администратора. Откройте терминал и введите одну из следующих команд, в зависимости от вашего уровня знаний в редактировании текстовых файлов:
Для опытных пользователей:
sudo vim /System/Library/LaunchDaemons/com.apple.screensharing.plist
Для новичков:
sudo nano /System/Library/LaunchDaemons/com.apple.screensharing.plist
-
Изменение номера порта
В процессе редактирования найдите строку, содержащую:<string>vnc-server</string>
Измените её на строку с номером нового порта, например:
<string>54321</string>
Примечание: хотя это может показаться странным, вам нужно заменить "vnc-server" на ваше значение порта.
-
Перезагрузка сервиса
После внесения изменений сохраните файл и закройте редактор. Чтобы изменения вступили в силу, вы можете либо отключить и вновь включить службу экранного обмена в настройках «Общий доступ», либо выполнить следующие команды в терминале:sudo launchctl unload /System/Library/LaunchDaemons/com.apple.screensharing.plist sudo launchctl load /System/Library/LaunchDaemons/com.apple.screensharing.plist
-
Проверка и тестирование
После перезагрузки службы вы должны протестировать новое подключение с другого устройства, используя измененный порт.
Альтернативные решения
Если вы не хотите изменять системные файлы, есть несколько обходных путей:
- Используйте альтернативное программное обеспечение VNC, например, RealVNC или TigerVNC, где изменение порта может быть проще.
- Настройте SSH-туннелирование с перенаправлением трафика с выбранного вами порта на порт 5900.
- Настройте портовое перенаправление на маршрутизаторе, чтобы перенаправить трафик с пользовательского порта на вашу систему.
Заключение
Изменение порта экрана обмена VNC на Mac OS X — процесс вполне осуществимый, однако требует определенных знаний и внимательности при редактировании системных файлов. Обязательно создайте резервные копии важных данных перед внесением изменений. Следуя данному руководству, вы сможете адаптировать ваш VNC-сервер под свои нужды, обеспечив тем самым более безопасный и контролируемый доступ.