Có vẻ như tôi không thể chỉnh sửa tệp plist từ LaunchAgents - ngay cả khi tôi sudo, tôi không bị xóa / thay đổi. Tôi có nhất thiết phải vô hiệu hóa SIP để làm điều này không?
Có vẻ như tôi không thể chỉnh sửa tệp plist từ LaunchAgents - ngay cả khi tôi sudo, tôi không bị xóa / thay đổi. Tôi có nhất thiết phải vô hiệu hóa SIP để làm điều này không?
Câu trả lời:
Vô hiệu hóa LaunchAgent (không phải LaunchDaemons) và khởi động lại máy của bạn ( không có sudo):
$ launchctl unload /System/Library/LaunchAgents/com.apple.gamed.plist
Trong trường hợp bạn muốn kích hoạt lại tại một thời điểm:
$ launchctl load /System/Library/LaunchAgents/com.apple.gamed.plist
sudo
launchctl list
không?
Một giải pháp là tạo một tập lệnh bash để dừng dịch vụ đã chơi sau khi bạn đăng nhập. Sử dụng Automator trong OS X để tạo tập lệnh bash sau đó thêm nó làm Mục đăng nhập vào tài khoản OS X của bạn. Lần sau khi đăng nhập, bạn sẽ nhận được lời nhắc thực thi tập lệnh. Thông thường tôi đợi cho đến khi tôi thấy một cảnh báo từ Little Snitch đã chơi trò chơi đang gọi điện về nhà, sau đó tôi nhấp vào 'Tiếp tục' để chạy tập lệnh. Điều này chưa được hoàn thiện và bạn có thể gặp phải sự cố nếu bạn chạy nó ngay lập tức sau khi bạn đăng nhập vào OS X. Tôi muốn tránh xa các giải pháp vô hiệu hóa dịch vụ vì những yêu cầu vô hiệu hóa / ghi đè SIP mà tôi khuyên.
Đây là kịch bản bash tôi sử dụng. Bất kỳ đề xuất về cải thiện nó đều được chào đón.
#!/bin/bash
chkService=gamed
chkCount=10
chkStatus=$(ps ax | grep "$chkService" | grep -v grep | grep " T " | wc -l)
while [ $chkStatus -ne 1 ]; do
chkProcess=$(ps ax | grep -v grep | grep "$chkService" | wc -l)
if [ $chkProcess -ne 0 ];
then
KILLALL -STOP "$chkService"
chkCount=0
chkStatus=$(ps ax | grep gamed | grep -v grep | grep " T " | wc -l)
else
SLEEP=1
chkCount=$((chkCount-1))
fi
done
Vấn đề là câu trả lời được chấp nhận ở trên:
launchctl unload /System/Library/LaunchAgents/com.apple.gamed.plist
công việc ngắn hạn. Tôi cũng đã nhìn thấy nó bằng cách sử dụng -w
cờ. Trong mọi trường hợp, trong các bản cập nhật gần đây, tôi nghĩ xung quanh El Capitan hoặc Yosemite, thay vào đó bạn nhận được một tin nhắn
Hoạt động không được phép trong khi Bảo vệ toàn vẹn hệ thống được tham gia
Bảo vệ tính toàn vẹn hệ thống cũng được biết đến bởi từ viết tắt SIP. Để vô hiệu hóa nó, bạn cần khởi động vào Recovery OS và chạy csrutil disable
.
Tôi đã thực hiện chuỗi này trong các bản phát hành trước và nó đã dẫn đến việc có thể vô hiệu hóa trò chơi thông qua launchctl
lệnh.
Tôi cho rằng sau khi chơi game bị vô hiệu hóa, người ta có thể kích hoạt lại SIP. Có lẽ đó sẽ là điều tốt nhất của cả hai thế giới, mặc dù đó là một quá trình tẻ nhạt.
những gì về sudo launchctl unload /System/Library/Launch\ Daemons/com.apple.gamed.plist
?
trên OS Sierra, đi tới Cài đặt hệ thống, Tài khoản Internet và xóa (trừ đi) Trung tâm trò chơi trong danh sách (bên trái).
Điều này làm cho ít hoặc không có sự khác biệt từ quan điểm bảo mật vì nó chỉ đơn giản là hoàn nguyên một hệ thống trở lại chính xác hoạt động trước SIP và chính xác là hầu như tất cả các hệ thống Unix vẫn hoạt động. Giá trị của SIP là tốt nhất có thể suy luận. Nó giải quyết câu hỏi bởi vì cách duy nhất để sử dụng lệnh Launchctl để giải nén tệp plist đã chơi là trước tiên phải vô hiệu hóa SIP, khởi động, hủy tải tệp plist, và sau đó, nếu muốn, SIP có thể kích hoạt được.
Một tùy chọn khác hoạt động trên 10.11.6 là một biến thể của phương thức được đề xuất bởi @ Le-Sci. Tạo tập lệnh shell vô hiệu hóa quy trình đã chơi:
#!/bin/bash
sleep 30 && kill -9 "$(pgrep gamed)"
Lệnh ngủ ở đây cho biết kịch bản đợi 30 giây trước khi bắt đầu quá trình thoát khỏi trò chơi, để cung cấp cho hệ thống đủ thời gian để tải trò chơi trước khi cố gắng chấm dứt nó; bạn có thể điều chỉnh lượng thời gian chờ đợi khi cần thiết. Lệnh "kill -9" buộc thoát khỏi quy trình bạn yêu cầu, nhưng nó chỉ chấp nhận số id của quy trình, không phải tên quy trình, vì vậy "pgrep" được sử dụng để tra cứu id quy trình. Ghi lại nơi bạn lưu tập lệnh (ví dụ này, tôi sẽ lưu tập lệnh đó dưới dạng "forceQuitGamed" trong / Users / myaccountname /).
Cho phép thực thi tập lệnh:
sudo chmod +x ~/forceQuitGamed
Tạo một tệp plist tác nhân khởi chạy sẽ chạy mỗi khi bạn đăng nhập vào tài khoản của mình. Nếu bạn chưa tạo tệp plist trước đây, một cách bạn có thể làm điều này là với TextEdit. Tệp tập lệnh phải được lưu trong văn bản thuần túy, vì vậy nếu các tùy chọn mặc định của bạn cho cuộc gọi TextEdit cho định dạng Rich Text, hãy thực hiện lệnh Format> Make Plain Text để chuyển đổi thành văn bản thuần túy trước khi thử sử dụng tệp plist tác nhân khởi chạy mới.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.myaccountname.loginscript</string>
<key>ProgramArguments</key>
<array>
<string>/Users/myaccountname/forceQuitGamed</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Chuỗi trong mảng trong "ProgramArgument" là tập lệnh path / to / your / shell. Lưu tệp vào ~ / Library / LaunchAgents /. Trong ví dụ này, tôi đặt tên tệp plist là com.myaccountname.forceQuitGamed.plist, vì vậy nó được tìm thấy tại
/Users/myaccountname/Library/LaunchAgents/com.myaccountname.forceQuitGamed.plist
Bây giờ, mỗi lần bạn đăng nhập vào tài khoản của mình, trò chơi sẽ bị hủy chỉ sau vài giây sau khi tải xong. (Nếu bạn cần chấm dứt càng sớm càng tốt sau khi được tải, hãy xem phương pháp @ Le-Sci's.) Cách tiếp cận này hoạt động mà không cần phải tắt Bảo vệ toàn vẹn hệ thống.
Trước tiên, bạn phải nhập csrutil disable
vào Terminal khi ở Chế độ khôi phục, sau đó khởi động lại thay đổi, khởi động lại trong Chế độ khôi phục và thực hiện csrutil enable
, khởi động lại.
Nhưng tôi không biết quy trình nào khi được sửa đổi sẽ thỏa hiệp khởi động trong El Capitan