Ответы:
На самом деле вы можете переключить порт по умолчанию для 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
После нахождения этой /etc/services
темы через Google я могу подтвердить, что редактирование портов "rfb" изменит порты прослушивания включенного VNC-сервера.
Я отредактировал файл и перезагрузил компьютер (обычно я пытался перезапустить службы или выгрузить файл запуска, но у меня были и другие проблемы, и я не беспокоился). iTeleport на моем iPad не смог подключиться к 5900 и преуспел на высоком непривилегированном порту, который я выбрал.
Это обсуждалось на различных форумах на apple.com и macosxhints.com . Короткий ответ: «Вы не можете это изменить».
Более длинные ответы предлагают способы обойти это - три возможности:
/etc/Services
может помочь. Я попробовал это (я даже перезагрузил свой Mac после его изменения) безрезультатно. И если подумать, может быть плохой идеей связываться с этим файлом, так как другие приложения могут также использовать его для получения известного номера порта, если они хотят подключиться к какой-либо третьей стороне по определенному протоколу. (Например, изменение порта SSH в этом файле может показаться работоспособным, но это плохая идея .)
Основываясь на информации, предоставленной Грегом в этой теме, я написал скрипт 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
Чтобы изменить порт по умолчанию и / или адрес привязки без отключения защиты целостности системы , необходимо создать новый LaunchDaemon в /Library
.
К сожалению, агент совместного использования экрана не будет работать должным образом при назначении другой метки. Это означает, что демон должен «скрывать» оригинал под тем же именем. Это вызывает свои собственные проблемы, потому что при перезагрузке система загрузит оригинал /System
и проигнорирует измененную версию в /Library
.
Решение состоит в том, чтобы отключить LaunchDaemon и использовать демон "launcher", который принудительно загрузит модифицированный LaunchDaemon. Однако следует позаботиться о том, чтобы по-прежнему активировать общий доступ к экрану через настройки, иначе он будет работать только в режиме наблюдения .
казнить
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
разделе редактирования сокетов, чтобы посмотреть, как вы хотите. Например, прослушивание 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
После этого права на общий доступ к экрану будут предоставлены должным образом, демон по умолчанию не будет загружаться автоматически, и наш модуль запуска принудительно запустит наш настроенный демон.