আমি কিভাবে আমার LaunchAgent রুট হিসাবে চালানো পেতে পারি?


7

আমি ব্যবহারকারী লগইন এ রুট হিসাবে একটি প্রক্রিয়া চালাতে চান।

আমি তৈরি /System/Library/LaunchAgents/eXist.plist সঙ্গে rx—r—r— অনুমতি:

<?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>Disabled</key>
        <false/>
        <key>GroupName</key>
        <string>wheel</string>
        <key>Label</key>
        <string>eXist DB</string>
        <key>Program</key>
        <string>/Applications/eXist-db/bin/startup.sh</string>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/tmp/eXist DB.err</string>
        <key>StandardOutPath</key>
        <string>/tmp/eXist DB.out</string>
        <key>UserName</key>
        <string>root</string>
    </dict>
</plist>

যাইহোক, আমার প্রক্রিয়া আমার ব্যবহারকারী হিসাবে চলতে চলতে davea পরিবর্তে রুট। কোন ধারনা আমি কি করতে হবে?

আমি ম্যাক 10.9.1 ব্যবহার করছি।


কোনও রুট হিসাবে কিছু চালানোর অদ্ভুত ব্যাপার যা কোন নির্দিষ্ট ব্যবহারকারীর লগ ইন হওয়ার পরে চালানো উচিত - কেন অন্যান্য রুট জিনিসগুলি বুট করতে শুরু করে না কেন
Mark

উত্তর:


2

একটি ব্যবহারকারীকে রুট হিসাবে চালানোর জন্য স্ক্রিপ্টটি চালানো LaunchAgent পেতে আপনাকে নিম্নলিখিতটি করতে হবে:

স্ক্রিপ্টের অনুমতি সংশোধন করুন। ব্যবহারকারীর প্রেক্ষাপটে sudoers ফাইলটিতে স্ক্রিপ্ট (বা কমান্ড) যোগ করুন এবং অবশেষে সঠিক লঞ্চ এজেন্ট প্লাস্ট যুক্ত করুন এবং লোড করুন।

এই পদ্ধতির গুরুতর নিরাপত্তা গর্ত তৈরি হতে পারে!


নিচের উদাহরণে আমি eXit-DB এর startup.sh ব্যবহার করি 2.2:

  • একটি প্লেস্ট তৈরি করুন:

    <?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>Disabled</key>
        <false/>
        <key>Label</key>
        <string>org.eXist_DB</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/bin/sudo</string>
            <string>/Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/tmp/eXist_DB.err</string>
        <key>StandardOutPath</key>
        <string>/tmp/eXist_DB.out</string>
        <key>ThrottleInterval</key>
        <integer>10</integer>
    </dict>
    </plist>
    

    এবং হিসাবে এটি সংরক্ষণ করুন org.eXist_DB.plist ~ / লাইব্রেরি / লঞ্চ অ্যাজেন্টস

    শেষ কী

        <key>ThrottleInterval</key>
        <integer>10</integer>
    

    প্রয়োজন হতে পারে না। আমার ভিএম এটি ছিল - অজানা কারণে।

  • Startup.sh এর অনুমতিগুলি সংশোধন করুন:

    sudo chown root /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh
    sudo chmod 4755 /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh
    
  • Sudoers ফাইল সংশোধন করুন:

    sudo visudo
    
  • সুডো পাসওয়ার্ড প্রবেশ করার প্রয়োজন ছাড়া কমান্ডটি কার্যকর করার জন্য একটি লাইন যোগ করুন

    # User privilege specification
    root    ALL=(ALL) ALL
    %admin  ALL=(ALL) ALL
    

    - & gt; দ্বারা

    # User privilege specification
    root    ALL=(ALL) ALL
    %admin  ALL=(ALL) ALL
    your_user_name ALL=(ALL) NOPASSWD: /Applications/eXist-db.app/Contents/Resources/eXist-db/bin/startup.sh
    
  • অবশেষে লিখুন:

    launchctl load -w ~/Library/LaunchAgents/org.eXist_DB.plist
    

    লোড এজেন্ট লোড এবং শুরু


2

জন্য মূল মান জোড়া যোগ করুন UserName:

<key>UserName</key>
<string>root</string>

স্থানটি লঞ্চ কাজ টিকেট মধ্যে /Library/LaunchDaemons/; দ্য /System ফোল্ডার অ্যাপল এর ব্যবহারের জন্য একচেটিয়াভাবে সংরক্ষিত হয়।

নির্দিষ্ট ব্যবহারকারী হিসাবে চালানোর জন্য, কাজ টিকেট স্থাপন করতে ভুলবেন না LaunchDaemons। @ মানু নীচের মতামত উল্লেখ করেছে, ড UserName কী কাজ জন্য উপেক্ষা করা হয় LaunchAgents


2
রেকর্ডের জন্য, 'UserName' কীটি কোন LaunchAgent কে প্রভাবিত করে না, এটি এখনও লগ ইন ব্যবহারকারী হিসাবে চলবে।
Manu

1
প্রশ্ন বিশেষভাবে LaunchAgents এবং লগইন করার পরে একটি প্রক্রিয়া চলমান বোঝায়। লঞ্চডেমন্সগুলি এমন প্রক্রিয়াগুলির জন্য একটি উপযুক্ত ফিট যা কোনও GUI এর মতো লগইন করার পরে কেবলমাত্র উপলব্ধ থাকা জিনিসের উপর নির্ভর করে এবং @ মানু এই উত্তরটিকে লঞ্চঅ্যাগেন্টগুলির জন্য কাজ করে না বলে উল্লেখ করে।
Cory Klein


0

তুমি ব্যবহার করতে পার launchd-oneshot একটি লগইন কাজের সাথে রুট হিসাবে চালান ইনস্টল

brew install cybertk/formulae/launchd-oneshot
sudo launchd-oneshot <script> --on-login-as-root

0
  • কিছু সঙ্গে জগাখিচুড়ি না /System/ যদি না আপনি আপনার সিস্টেম screwing ঝুঁকি নিতে চান। সিরিয়াসলি। দূরে থাকা.

  • ভিতরে রাখো /Library/LaunchDaemons/ পরিবর্তে.


এই সঙ্গে সমস্যা এটা সবসময় লগইন আগে চালানো হবে। তাই যদি আপনার সেবা কিছু GUI উপর নির্ভর করে, এটি লগ-অফে বিরতি দেবে। আমি বর্তমানে লগইন করার পরে চালানোর জন্য একটি বিকল্প অনুসন্ধান করছি কিন্তু দুর্ভাগ্যক্রমে কোন ভাগ্য ছাড়াই রুট হিসাবে।
Nikolay Tsenkov

0

একটি LaunchAgent তৈরি করা যা সুডো / রুট বিশেষাধিকারগুলির সাথে চালিত হয় কেবল তা দ্বারা করা যেতে পারে sudo LaunchAgent execute যে কমান্ড হতে।

প্লেস্ট ফাইল তৈরি করুন

এই সংক্ষিপ্ত উদাহরণ স্থাপন করার চেষ্টা করুন ~/Library/LaunchAgents/com.sudoexample.plist

<?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.sudoexample</string>
        <key>ProgramArguments</key>
        <array>
            <string>sudo</string>
            <string>touch</string>
            <string>/tmp/sudoexample</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardOutPath</key>
        <string>/tmp/sudoexample.log</string>
        <key>StandardErrorPath</key>
        <string>/tmp/sudoexample.log</string>
    </dict>
</plist>

দ্রষ্টব্য: এজেন্ট সাধারণত ব্যবহারকারীর ফাইল মালিকানা থাকা উচিত, কিন্তু root মালিকানা ঠিক যেমন জরিমানা কাজ বলে মনে হয়।

উপরের উদাহরণ রান sudo touch /tmp/sudoexample এবং আউটপুট লগ /tmp/sudoexample.log

আপনি চালানো হলে launchctl load ~/Library/LaunchAgents/com.sudoexample.plist এই সময়ে, কারণ এটি ব্যর্থ হবে sudo একটি পাসওয়ার্ড এবং জন্য প্রম্পট চেষ্টা করবে launchctl কোন সংযুক্ত আছে না tty পাসওয়ার্ড প্রম্পট পরিবেশন করা:

$ ls /tmp/
sudoexample.log
$ cat /tmp/sudoexample.log
sudo: no tty present and no askpass program specified

বর্ধিত বিশেষাধিকার অনুমতি দিন

আমরা আপনার ব্যবহারকারী চালানোর অনুমতি দিতে হবে sudo touch একটি পাসওয়ার্ড ছাড়া।

এটি এমনভাবে করা যেতে পারে:

echo "$(whoami) ALL=(ALL) NOPASSWD: $(which touch)" | sudo tee /etc/sudoers.d/touch

যখন আপনি সম্পন্ন করবেন, ফাইলটি এমন কিছু দেখতে হবে:

$ sudo cat /etc/sudoers.d/touch
coryklein ALL=(ALL) NOPASSWD: /usr/bin/touch

এটা পরীক্ষা করে দেখুন

$ launchctl load ~/Library/LaunchAgents/com.sudoexample.plist
$ ls -l /tmp
total 0
-rw-r--r-- 1 root      wheel 0 Jun 29 14:01 sudoexample
-rw-r--r-- 1 coryklein wheel 0 Jun 29 14:01 sudoexample.log

এখন আপনি LaunchAgent রুট মালিকানা তৈরি করে সফলভাবে দৌড়ে দেখতে পারেন /tmp/sudoexample

ধন্যবাদ klanomath এই এক জন্য ভিত্তি প্রদানের উত্তর।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.