किसी भिन्न उपयोगकर्ता के रूप में शेल स्क्रिप्ट चलाएँ


42

एक अलग उपयोगकर्ता के रूप में शेल स्क्रिप्ट को चलाने का एक अच्छा तरीका क्या है। मैं डेबियन एच का उपयोग कर रहा हूं, और मुझे पता है कि मैं किस उपयोगकर्ता को प्रतिरूपित करना चाहता हूं।

अगर मैं इसे मैन्युअल रूप से कर रहा था, तो मैं करूंगा:

su postgres
./backup_db.sh /tmp/test
exit

चूंकि मैं इस प्रक्रिया को स्वचालित करना चाहता हूं, मुझे बैकअप_db.sh चलाने के लिए एक तरीका चाहिए, क्योंकि पोस्टग्रेज (पर्यावरण, आदि को विरासत में देना)

धन्यवाद!

जवाबों:


67

अपनी स्क्रिप्ट को एक कमांड के रूप में किसी अन्य उपयोगकर्ता के रूप में चलाने के लिए, चलाएं:

/bin/su -c "/path/to/backup_db.sh /tmp/test" - postgres

Breaking it down:
 /bin/su : switch user
 -c "/path/to..." : command to run
 - : option to su, make it a login session (source profile for the user)
 postgres : user to become

मैं हमेशा इस तरह की लिपियों में पूर्ण पथों का उपयोग करने की सलाह देता हूं - आप हमेशा गारंटी नहीं दे सकते हैं कि जब आप सु (शायद किसी ने आप पर गृहणी बदल दी हो, जो जानता हो) तो आप सही निर्देशिका में होंगे। मैं हमेशा su (/ bin / su) के लिए पूर्ण पथ का उपयोग करता हूं क्योंकि मैं पागल हूं। यह संभव है कि कोई व्यक्ति आपके पथ को संपादित कर सकता है और आपको su के एक समझौता किए गए संस्करण का उपयोग करने का कारण बना सकता है।


यह हमेशा पासवर्ड में मुझे टाइप करना होगा? इसे गोल कैसे कर सकते हैं?
zjffdu

2
यदि आप कमांड को नॉन-रूट उपयोगकर्ता के रूप में चला रहे हैं तो आपको हमेशा पासवर्ड टाइप करना होगा। यदि आप पासवर्ड से बचना चाहते हैं, तो आप अनुमति देने के लिए sudo को कॉन्फ़िगर कर सकते हैं। कैसे - एक उपयोगकर्ता को सु चलाने के लिए सूडो को कॉन्फ़िगर करने से उन्हें कोई भी उपयोगकर्ता बनने की अनुमति मिलती है। मैं सुझाव दूंगा कि आपकी कमांड के लिए एक स्क्रिप्ट बनाई जाए, स्क्रिप्ट अनुमतियों को 700 पर सेट किया जाए और रूट के स्वामित्व में हो, फिर उपयोगकर्ता को उस एकल स्क्रिप्ट को चलाने की अनुमति देने के लिए sudo को कॉन्फ़िगर करना।
बॉमगार्ट

मेरा मानना ​​है - जबकि यह उत्तर ओपी के लिए काम कर सकता है - यह पूरी तरह से सही नहीं है। मेरे ज्ञान के लिए, दोनों -(या --login) का उपयोग करके --command, -cवास्तव में एक लॉगिन सत्र शुरू नहीं होता है, क्योंकि -cहमेशा एक गैर-लॉगिन शेल को मजबूर करता है।
जीनमर्ट्ज़

1
नोट: पोर्टेबिलिटी के लिए, - postgressकमांड के अंत में दिखाई देना चाहिए। मैन पेज से:When - is used, it must be specified before any username. For portability it is recommended to use it as last option, before any username. The other forms (-l and --login) do not have this restriction.
जॉनी

23

यदि चलाने के लिए लक्षित उपयोगकर्ता के पास नलिन शैल है, तो आप शेल निर्दिष्ट करने के लिए -s विकल्प का उपयोग कर सकते हैं:

/bin/su -s /bin/bash -c '/path/to/your/script' testuser

निम्नलिखित प्रश्न देखें: स्क्रिप्ट को उस उपयोगकर्ता के रूप में चलाएं जिसके पास नॉलिन शेल है


9

इसे एक शेड्यूल पर स्वचालित करने के लिए आप इसे उपयोगकर्ता के क्रैटाब में डाल सकते हैं। क्रॉन जॉब्स को हालांकि पूरा माहौल नहीं मिलेगा, लेकिन यह बेहतर हो सकता है कि स्क्रिप्ट में वैसे भी सभी एनवी वैरिएबल लगाएं।

उपयोगकर्ता के crontab को संपादित करने के लिए:

sudo crontab -u postgres -e

क्या आप कृपया अधिक बता सकते हैं?
श्रवणकुमार

3

यह एक जानकारीपूर्ण पढ़ा जाना चाहिए - खोल स्क्रिप्ट पर निर्धारित

यदि आप " " तर्क क्रम के साथ su चलाते हैं - username, तो यह उपयोगकर्ता को उपयोगकर्ता के समान वातावरण देने के लिए एक लॉगिन शेल बना देगा। आमतौर पर, एक अलग लॉगिन से अपने घर के वातावरण के साथ अपनी स्क्रिप्ट को जल्दी से निष्पादित करने के लिए उपयोग किया जाता है।


यह उपयोगी हो सकता है, अगर आपको क्रियाओं की एक श्रृंखला करने की आवश्यकता है। लेकिन ध्यान रखें कि अधिकांश सिस्टम सेवा खातों में मान्य घर पथ और गोले नहीं होने चाहिए।
डैन कार्ले

2

Su manpage की कोशिश करें:

su -c script_run_as_postgres.sh - पोस्टग्रेज

सचेत रूप से, आप sudo का उपयोग कर सकते हैं ताकि आप बिना किसी पासवर्ड के पोस्टग्रेज के रूप में केवल उस कॉमैन को चला सकें। यह आपके / etc / sudoers में कुछ सेटअप लेता है, हालाँकि।


2

दूसरों द्वारा पोस्ट की गई "सु-सी ..." विधि एक अच्छी है। स्वचालन के लिए, आप स्क्रिप्ट को उस उपयोगकर्ता के क्रॉस्टैब पर जोड़ सकते हैं जिसे आपको निष्पादित करने की आवश्यकता है।


1

यदि उपयोगकर्ता के पास पहले से ही sudo की प्रविष्टि है और आप सुपरयुसर का पासवर्ड नहीं जानते हैं, तो आप निम्न का प्रयास कर सकते हैं: यह एक पुनः आरंभ करता है, जिसे /data/my-db/pgsql/9.6/data पर आरंभीकृत किया गया है

sudo su - postgres -c "/usr/pgsql-9.6/bin/pg_ctl -D /data/my-db/pgsql/9.6/data -l /var/log/pgsql.log restart"

-1

आप भी उपयोग कर सकते हैं:

sudo -u postgres script_run_as_postgres.sh

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.