ভিন্ন ব্যবহারকারী হিসাবে লিনাক্স পরিষেবা চালানোর জন্য সেরা অনুশীলন


141

rootআমার আরএইচইএল বাক্সে বুট সময় হিসাবে পরিষেবাগুলি ডিফল্ট starting আমি যদি সঠিকভাবে স্মরণ করি তবে অন্যান্য লিনাক্স ডিস্ট্রোজের ক্ষেত্রেও এটি সত্য, যা ইনআর স্ক্রিপ্টগুলি ব্যবহার করে /etc/init.d

পরিবর্তে আমার পছন্দসই (স্থিতিশীল) ব্যবহারকারী হিসাবে প্রক্রিয়াগুলি চালানোর সর্বোত্তম উপায় কী বলে আপনি মনে করেন?

আমি এখানে এসে পৌঁছানোর একমাত্র পদ্ধতিটি ছিল এরকম কিছু ব্যবহার করা:

 su my_user -c 'daemon my_cmd &>/dev/null &'

তবে এটিকে কিছুটা অবাস্তব মনে হচ্ছে ...

এমন কি কিছুটা যাদু দূরে রয়েছে যা অন্য, রুটবিহীন ব্যবহারকারীদের মতো স্বয়ংক্রিয়ভাবে পরিষেবা শুরু করার জন্য একটি সহজ প্রক্রিয়া সরবরাহ করে?

সম্পাদনা: আমার বলা উচিত ছিল যে এই প্রক্রিয়াগুলির মধ্যে আমি যে প্রক্রিয়াগুলি শুরু করছি তা হয় পাইথন স্ক্রিপ্ট বা জাভা প্রোগ্রাম। আমি বরং, তাদের চারপাশে একটি নেটিভ মোড়কের লিখুন না চাই তাই দুর্ভাগ্যবশত আমি ফোন করতে অক্ষম নই ) setuid ( যেমন কালো দাড়ায়।


পাইথন কি সিস্টেম কলগুলির সেটুইড () পরিবারে অ্যাক্সেস সরবরাহ করে না? পার্লের তুলনায় এটি মারাত্মক ত্রুটির মতো বলে মনে হচ্ছে।
জোনাথন লেফলার

12
বাহ, হ্যাঁ এটি করে: os.setuid (uid)। প্রতিদিন একটি স্কুলের দিন!
জেমস ব্র্যাডি

উত্তর:


67

ডেবিয়ানে আমরা start-stop-daemonইউটিলিটিটি ব্যবহার করি যা পিড-ফাইলগুলি পরিচালনা করে, ব্যবহারকারীকে পরিবর্তন করে, ডেমোনটিকে পটভূমিতে রাখে এবং আরও অনেক কিছু।

আমি রেডহ্যাটের সাথে পরিচিত নই, তবে daemonআপনি যে ইউটিলিটিটি ইতিমধ্যে ব্যবহার করছেন (যা সংজ্ঞায়িত /etc/init.d/functions, বিটিডাব্লু।) এর সমতুল্য হিসাবে সর্বত্র উল্লিখিত হয়েছে start-stop-daemon, তাই হয় এটি আপনার প্রোগ্রামের ইউআইডি, বা আপনি যেভাবে করেন তার পরিবর্তনও করতে পারে এটি ইতিমধ্যে সঠিক।

আপনি যদি নেটটি ঘুরে দেখেন তবে আপনি ব্যবহার করতে পারেন এমন বেশ কয়েকটি প্রস্তুত রেপর রয়েছে। কিছু কিছু ইতিমধ্যে রেডহ্যাটে প্যাকেজ করা হতে পারে। কটাক্ষপাত আছে daemonizeউদাহরণস্বরূপ,।


এক্স-রেফ আকর্ষণীয়। আমার নিজস্ব ডেমোনাইজ প্রোগ্রাম রয়েছে, একই রকম; পিডফিল বা লকফিল করে না, উমাস্ক সেট করে। ইউআইডি, জিআইডি, ইডিইউড, ইজিআইডি এবং অক্স গ্রুপগুলি (asroot নামে পরিচিত) সেট করার জন্য আমার একটি পৃথক SID রুট প্রোগ্রাম রয়েছে। আমি 'asroot [opts] - env ​​-i [env] daemonize [opts] - आज्ञा [opts]'
জোনাথন লেফলার

(অবিরত): POSIX স্ট্যান্ডার্ড env প্রোগ্রাম পরিবেশ সেটিং এবং এক্সিকিউটেড কমান্ডের (ইরাকসোম, তবে তাই) মধ্যে '-' গ্রহণ করে না।
জোনাথন লেফলার

4
কীভাবে /etc/init.d/function থেকে ডেমন ফাংশন আপস্টার্ট স্ক্রিপ্টে ব্যবহার করা যেতে পারে? আপনি একটি উদাহরণ দেখাতে পারেন, দয়া করে।
25:12

10
দেবিয়ান দেখুন /etc/init.d/skeleton। ইউআইডি, জিআইডি ভেরিয়েবল এবং do_start()ব্যবহারের জন্য যুক্ত করুন:start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --chuid $UID:$GID -- $DAEMON_ARGS
জোনাথন বেন-অভ্রাহাম

আমি লক্ষ্য করেছি daemon()যে আমার /etc/rc.d/init.d/functionদুটি আরএইচইএল এবং সেন্টোস বাক্সে সংজ্ঞায়িত হয়েছে ।
কুইকশিফ্টিন

53

এখানে সমস্ত পরামর্শ দেখার পরে, আমি কয়েকটি জিনিস আবিষ্কার করেছি যা আমি আশা করি আমার অবস্থানে অন্যদের জন্য কার্যকর হবে:

  1. হপ আমাকে এখানে ফিরে দেখানো ঠিক /etc/init.d/functions: daemonফাংশনটি ইতিমধ্যে আপনাকে বিকল্প ব্যবহারকারী সেট করতে দেয়:

    daemon --user=my_user my_cmd &>/dev/null &
    

    প্রক্রিয়া অনুরোধটি মোড়ানো দ্বারা এটি প্রয়োগ করা হয় runuser- আরও এটির পরে।

  2. জোনাথন লেফ্লার ঠিক বলেছেন: পাইথনে কিছু আছে:

    import os
    os.setuid(501) # UID of my_user is 501
    

    আমি এখনও মনে করি না যে আপনি কোনও জেভিএম এর ভিতরে থেকে সেটআপ করতে পারেন।

  3. আপনি ইতিমধ্যে যে কোনও কমান্ড চালানোর জন্য কমান্ড চালাতে বলছেন না suতেমনই runuserকৌতূহলপূর্ণভাবে পরিচালনাও করবেন না। উদাহরণ:

    [my_user@my_host]$ id
    uid=500(my_user) gid=500(my_user) groups=500(my_user)
    [my_user@my_host]$ su my_user -c "id"
    Password: # don't want to be prompted!
    uid=500(my_user) gid=500(my_user) groups=500(my_user)
    

suএবং এর আচরণকে একত্রে প্রকাশ করার জন্য runuser, আমি আমার আর্ট স্ক্রিপ্টকে এমন কিছুতে পরিবর্তন করেছি:

if [[ "$USER" == "my_user" ]]
then
    daemon my_cmd &>/dev/null &
else
    daemon --user=my_user my_cmd &>/dev/null &
fi

সবাইকে সাহায্য করার জন্য ধন্যবাদ!


5
  • কিছু ডেমন (যেমন অ্যাপাচি) সেটুয়েডকে কল করে নিজেরাই এটি করে ()
  • পৃথক ব্যবহারকারী হিসাবে প্রক্রিয়াটি চালানোর জন্য আপনি সেটুইড-ফাইল পতাকা ব্যবহার করতে পারেন ।
  • অবশ্যই, আপনি যে সমাধানটি উল্লেখ করেছেন সেগুলিও কাজ করে।

যদি আপনি নিজের ডেমন লিখতে চান, তবে আমি সেটুইড () কল করার পরামর্শ দিচ্ছি। এইভাবে, আপনার প্রক্রিয়া পারেন

  1. এর মূল সুবিধাগুলি ব্যবহার করুন (যেমন লগ ফাইলগুলি খুলুন, পিড ফাইলগুলি তৈরি করুন)।
  2. প্রারম্ভকালে একটি নির্দিষ্ট সময়ে এটির মূল বৈশিষ্ট্যগুলি ফেলে দিন D

3

নজর রাখার জন্য কেবল কিছু অন্যান্য জিনিস যুক্ত করতে:

  • একটি init.d স্ক্রিপ্টে সুডো ভাল নয় কারণ এটির জন্য একটি টিটিটি দরকার ("সুডো: দুঃখিত, সুডো চালানোর জন্য আপনার অবশ্যই টিটিআই থাকতে হবে")
  • আপনি যদি জাভা অ্যাপ্লিকেশনটি ডিমনাইজ করে থাকেন তবে আপনি জাভা সার্ভিস র‍্যাপার বিবেচনা করতে পারেন (যা ব্যবহারকারী আইডি সেট করার জন্য একটি পদ্ধতি সরবরাহ করে)
  • আর একটি বিকল্প হ'ল su --session-আদেশ = [সেন্টিমিটার] [ব্যবহারকারী]

3

এসএনএন সার্ভারের জন্য সেন্টোস (রেড হ্যাট) ভার্চুয়াল মেশিনে: /etc/init.d/svnserver পিডকে এমন কিছুতে পরিবর্তন করতে সম্পাদিত যা এসএনএন লিখতে পারে:

pidfile=${PIDFILE-/home/svn/run/svnserve.pid}

এবং যুক্ত বিকল্প --user=svn:

daemon --pidfile=${pidfile} --user=svn $exec $args

মূল পিডফিল ছিল /var/run/svnserve.pid। ডিমন বেকাসু শুরু করেন নি কেবল সেখানে রুট লিখতে পারে।

 These all work:
/etc/init.d/svnserve start
/etc/init.d/svnserve stop
/etc/init.d/svnserve restart

3
এটি একটি সুবিধাসমূহ বাড়ানোর দুর্বলতা তৈরি করে। এসএনএন ব্যবহারকারী এখন /home/svn/run/svnser.pid ফাইলটিতে নির্বিচারে পিআইডি রাখতে পারবেন যা যখনই এসএনএন পরিষেবা বন্ধ বা পুনরায় চালু করা হয় তখন এসএনএন প্রক্রিয়াটির পরিবর্তে হত্যা করা হবে।
rbu

2

কিছু বিষয় লক্ষ্য রাখতে হবে:

  • যেমন আপনি উল্লেখ করেছেন, আপনি যদি ইতিমধ্যে লক্ষ্য ব্যবহারকারীর হন তবে su একটি পাসওয়ার্ডের জন্য অনুরোধ করবে
  • একইভাবে, সেটুইড (2) ব্যর্থ হবে যদি আপনি ইতিমধ্যে লক্ষ্য ব্যবহারকারী (কিছু ওএসে) হন
  • setuid (2) /etc/limits.conf (লিনাক্স) বা / etc / user_attr (সোলারিস) এ সংজ্ঞায়িত সুবিধা বা সংস্থান নিয়ন্ত্রণ ইনস্টল করে না
  • আপনি যদি সেটজিড (2) / সেতুউইড (2) রুটে যান তবে আরম্ভগ্রুপকে (3) কল করতে ভুলবেন না - আরও এখানে এখানে

ডিমেনগুলি শুরু করার আগে যথাযথ ব্যবহারকারীর সাথে স্যুইচ করতে আমি সাধারণত / এসবিিন / স্য ব্যবহার করি।


2

নিচের স্ক্রিপ্টে নিম্নলিখিতটি চেষ্টা করে দেখেন না কেন:

setuid $USER application_name

এটা আমার জন্য কাজ করেছে।


3
এটি সমস্ত ডিস্ট্রোজে উপলব্ধ নয়। আমি setuid: command not found
আরএইচইএল

0

আমার একটি পরিষেবা হিসাবে একটি স্প্রিং। জাজার অ্যাপ্লিকেশন চালানো দরকার ছিল এবং নির্দিষ্ট ব্যবহারকারী হিসাবে এটি চালনার একটি সহজ উপায় খুঁজে পেয়েছি:

আমি আমার জার ফাইলের মালিক এবং গোষ্ঠীটিকে যে ব্যবহারকারী হিসাবে চালাতে চেয়েছিলাম তাতে পরিবর্তন করেছি। তারপরে এই জারটি init.d তে সিমলিংক করে পরিষেবাটি শুরু করে।

তাই:

#chown myuser:myuser /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar

#ln -s /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar /etc/init.d/springApp

#service springApp start

#ps aux | grep java
myuser    9970  5.0  9.9 4071348 386132 ?      Sl   09:38   0:21 /bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.