Làm cách nào để chạy lệnh launchd với quyền root


32

Tôi có lệnh launchctl sau đây dưới dạng tệp .plist. Nó được tải và thiết lập để chạy một lần một ngày, nhưng nó cần chạy dưới quyền root và tôi không biết làm thế nào để xác minh điều này.

Ngoài ra, công việc cron này về cơ bản là CD vào một thư mục và chạy một lệnh. Tôi chắc chắn launchd có cách tốt hơn để chỉ định thư mục nơi nó được yêu cầu chạy lệnh.

Làm thế nào để tôi biết nó chạy như root và có cách nào tốt hơn để viết cái này không?

<?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>dev.project.frontpage.feedparser</string>
    <key>ProgramArguments</key>
    <array>
        <string>cd</string>
        <string>/Users/eman/src/project/trunk/includes/;</string>
        <string>./feed-parser.php</string>
        <string>-c</string>
        <string>./feed-parser-config.xml</string>
    </array>
    <key>QueueDirectories</key>
    <array/>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>12</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>WatchPaths</key>
    <array/>
</dict>
</plist>

Câu trả lời:


46

Thư mục nào được .plistlưu trữ trong?

launchdchạy Daemons ( /Library/LaunchDaemonshoặc /System/Library/LaunchDaemons) với quyền root và sẽ chạy chúng bất kể người dùng có đăng nhập hay không. Đại lý khởi chạy ( /Library/LaunchAgents/hoặc ~/Library/LaunchAgents/) được chạy khi người dùng đăng nhập với tư cách người dùng đó. Bạn không thể sử dụng setuid để thay đổi người dùng đang chạy tập lệnh trên trình nền.

Bởi vì bạn sẽ muốn thêm nó vào /Library/LaunchDaemonsnên bạn sẽ muốn đảm bảo rằng bạn tải nó vào launchdvới quyền quản trị viên (ví dụ. sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist)

Kiểm tra man launchdđể biết thêm thông tin.


Cảm ơn bạn. Đây chính xác là những gì tôi đang tìm kiếm cho đến khi trả lời vấn đề gốc. Kịch bản nằm trong / Library / LaunchDaemons vì vậy nó đã chạy dưới quyền root.
Emmanuel Mwangi

Một câu hỏi cho người mới: đang chạy launchctlcần thiết để cài đặt một daemon? Ý tôi là, không đủ để sao chép tập tin plist vào đường dẫn tương ứng?
Claudix

@Claudix: Đúng vậy. Sao chép cấu hình launchd tại chỗ là không đủ - bạn vẫn phải "bật nó lên" (tải launchctl)
Chealion

4

Bạn đã thử sử dụng một trong các trình soạn thảo launchd chưa?

Để chắc chắn rằng nó được chạy dưới quyền root, tôi khá chắc chắn launchd sẽ chạy các chương trình với quyền root. Bạn đã bao giờ nghĩ đến việc trao quyền sở hữu tập lệnh cho root bằng chmod chưa? Bằng cách này, nó sẽ không chạy trừ khi chạy bằng root. Bạn cần phải xác minh rằng nó chạy.

sudo chown root:admin script_to_run_by_launchd

Tôi đã sử dụng Lingon để viết kịch bản này. Và tôi có thể khẳng định nó hoạt động tốt trong Leopard.
Emmanuel Mwangi

3

Danh sách tài sản trong LaunchAgents cũng hoạt động, nhưng bạn phải tải cả tác nhân và trình nền bằng sudo:

sudo chown root /Library/LaunchAgents/test.plist
sudo launchctl load /Library/LaunchAgents/test.plist

Nếu plist không có khóa bị vô hiệu hóa, nó sẽ được tải vào lần đăng nhập tiếp theo hoặc khởi động lại theo mặc định và -wkhông cần thiết.

Lưu ý kỹ thuật TN2083: Daemon và Đại lý :

Một daemon là một chương trình chạy trong nền như là một phần của hệ thống tổng thể (nghĩa là nó không bị ràng buộc với một người dùng cụ thể). Một daemon không thể hiển thị bất kỳ GUI nào; cụ thể hơn, nó không được phép kết nối với máy chủ cửa sổ.

[...]

Một tác nhân là một quá trình chạy trong nền thay mặt cho một người dùng cụ thể. Đại lý rất hữu ích vì họ có thể thực hiện những việc mà trình nền không thể, như truy cập đáng tin cậy vào thư mục chính của người dùng hoặc kết nối với máy chủ cửa sổ.


3

Đối với các nhân viên Google đang tìm cách chạy cụ thể một Tác nhân khởi động với các đặc quyền gốc của Launch Daemon , có thể được thực hiện bằng cách:

  • Tạo LaunchAgent của bạn trong ~/Library/LaunchAgents
  • Chạy ứng dụng của bạn sudothông qua ProgramArgumentstài sản trong danh sách của bạn
  • Đặt NOPASSWDtùy chọn cho ứng dụng của bạn trong/etc/resolvers.d

Để biết thêm chi tiết, xem điều này và câu trả lời này .


2

LaunchControl khiến tôi không đau đớn ở Yosemite. Nó có GUI kéo thả đẹp để giúp bạn tạo hoặc chỉnh sửa dịch vụ. Thật đáng ngạc nhiên khi thấy tất cả các dịch vụ đang chạy mà tôi không biết.

Các bước

  1. Bắt đầu LaunchControl
  2. Thay đổi trên cùng bên trái sang GlobalDeamons và nhập mật khẩu quản trị viên của bạn
  3. Tập tin-> Mới
  4. Dưới nhãn, đặt cho nó một tên duy nhất. Công ước là "com.company.appname"
  5. Trong Chương trình để chạy, hãy sử dụng tập lệnh Unix Shell hoặc bất kỳ lệnh nào bạn thích mà KHÔNG CÓ đối số
  6. Nếu ứng dụng của bạn yêu cầu đối số, hãy thay đổi trường thả xuống từ "Mặc định argv" thành "Đối số tùy chỉnh"
    1. bây giờ cung cấp đối số bạn sẽ bình thường vì bạn sẽ chạy nó từ dòng lệnh thực tế.
  7. Chạy ở Load là tùy chọn, bạn quyết định.
  8. Từ phía bên phải, kéo và thả StartInterval và đặt khoảng thời gian bạn muốn. Câu hỏi thường gặp trong menu Trợ giúp là rất tốt.

Bạn có thể vui lòng chỉnh sửa bài đăng của mình để bao gồm các bước mà người hỏi có thể thực hiện để giải quyết vấn đề của họ không?
Cfinley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.