Câu trả lời:
Bạn thực sự có thể chuyển đổi cổng mặc định cho máy chủ VNC của Apple trên Mac OS 10.7 Lion và 10.8 Mountain Lion. Để thay đổi cổng, bạn cần chỉnh sửa tệp plist của máy chủ /System/Library/LaunchDaemons/com.apple.screensharing.plist
(tệp này không tồn tại trong các hệ thống trước 10.7 Lion).
Chỉnh sửa tập tin yêu cầu quyền root (sudo). Trong thiết bị đầu cuối, nếu bạn quen thuộc với vi hoặc vim , bạn có thể nhập:
sudo vim /System/Library/LaunchDaemons/com.apple.screensharing.plist
hoặc nếu bạn không, bạn nên sử dụng nano :
sudo nano /System/Library/LaunchDaemons/com.apple.screensharing.plist
Bây giờ, tất cả những gì bạn phải làm là thay đổi dòng 34 (dòng được đọc <string>vnc-server</string>
) thành <string>nnnn</string>
nnnn là số cổng bạn muốn sử dụng. Tôi biết có vẻ kỳ lạ khi thay đổi một tên như "vnc-server" thành một số, nhưng đó là cách bạn phải làm điều đó. Tôi đã bao gồm một ví dụ dưới đây trong trường hợp bất cứ điều gì không rõ ràng.
Để thay đổi cổng mặc định thành 54321, bạn sẽ chỉnh sửa tệp plist thành như sau:
...
<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>
Sau khi lưu tệp, để thay đổi có hiệu lực, hãy tắt Chia sẻ màn hình và sau đó bật lại trong ngăn tùy chọn Chia sẻ hoặc thay thế tải và tải lại dịch vụ bằng các lệnh sau:
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.screensharing.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.screensharing.plist
Tôi có thể xác nhận sau khi tìm thấy chủ đề này thông qua Google rằng việc chỉnh sửa /etc/services
các cổng "rfb" sẽ thay đổi các cổng nghe của máy chủ VNC đi kèm.
Tôi đã chỉnh sửa tệp và khởi động lại (thông thường tôi sẽ thử khởi động lại dịch vụ hoặc dỡ bỏ launchdeamon nhưng tôi cũng gặp một số vấn đề khác và không bận tâm). iTeleport trên iPad của tôi sau đó không thể kết nối trên 5900 và đã thành công trên cổng không có đặc quyền cao mà tôi đã chọn.
Điều này đã được thảo luận trên các diễn đàn khác nhau tại apple.com và trên macosxhints.com . Câu trả lời ngắn gọn là "bạn không thể thay đổi nó".
Các câu trả lời dài hơn gợi ý những cách xung quanh nó - ba khả năng:
/etc/Services
có thể thực hiện thủ thuật. Tôi đã thử điều đó (tôi thậm chí đã khởi động lại máy Mac của mình sau khi thay đổi nó) nhưng không có kết quả. Và suy nghĩ thêm, nó thậm chí có thể là một ý tưởng tồi để làm hỏng tập tin đó, vì các ứng dụng khác cũng có thể sử dụng nó để lấy số cổng nổi tiếng nếu họ muốn kết nối với một bên thứ ba bằng một giao thức cụ thể. (Giống như: thay đổi cổng SSH trong tệp đó có vẻ hoạt động nhưng là một ý tưởng tồi .)
Dựa trên thông tin được cung cấp bởi Greg trong chuỗi này, tôi đã viết một tập lệnh bash sẽ tự động hóa quá trình thay đổi cổng nghe VNC của hệ thống của bạn. Hoạt động tốt trong các thử nghiệm của tôi. Hãy cho tôi biết nếu có ai có bất kỳ vấn đề với nó.
#!/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
Để thay đổi cổng mặc định và / hoặc địa chỉ liên kết mà không tắt Bảo vệ toàn vẹn hệ thống , bạn cần tạo LaunchDaemon mới trong /Library
.
Thật không may, tác nhân chia sẻ màn hình sẽ không hoạt động đúng khi được gán một nhãn khác. Điều đó có nghĩa là daemon phải "đánh bóng" bản gốc bằng cách sử dụng cùng tên. Điều đó gây ra sự cố riêng vì khi khởi động lại, hệ thống sẽ tải bản gốc vào /System
và bỏ qua phiên bản sửa đổi trong /Library
.
Giải pháp là vô hiệu hóa LaunchDaemon và sử dụng trình nền "launcher" sẽ tải cưỡng bức LaunchDaemon đã sửa đổi. Tuy nhiên, cần thận trọng để vẫn kích hoạt Chia sẻ màn hình thông qua các tùy chọn hoặc nó sẽ kết thúc ở chế độ chỉ quan sát .
Hành hình
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.screensharing.plist
Hành hình
sudo cp /System/Library/LaunchDaemons/com.apple.screensharing.plist /Library/LaunchDaemons/com.apple.screensharing.plist
Trong /Library/LaunchDaemons/com.apple.screensharing.plist
, chỉnh sửa phần Sockets để xem bạn muốn nó như thế nào. Ví dụ nghe trên localhost:5901
:
<key>Sockets</key>
<dict>
<key>Listener</key>
<dict>
<key>SockNodeName</key>
<string>localhost</string>
<key>SockServiceName</key>
<string>5901</string>
</dict>
</dict>
Tạo /Library/LaunchDaemons/com.apple.screensharing.launcher.plist
với nội dung sau:
<?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>
Hành hình
sudo launchctl load -w /Library/LaunchDaemons/com.apple.screensharing.launcher.plist
Sau này, quyền Chia sẻ màn hình sẽ được cung cấp đúng cách, trình nền mặc định sẽ không tự động tải và trình khởi chạy của chúng tôi sẽ bắt đầu trình nền tùy chỉnh của chúng tôi.