Sudo -i ने लक्ष्य उपयोगकर्ता के लिए XDG_RUNTIME_DIR क्यों सेट नहीं किया है?


14

XDG_RUNTIME_DIRsystemctl --userकाम करने के लिए आवश्यक है ।

मैंने सिस्टमड उपयोगकर्ता सत्र चलाने के लिए ubuntu सर्वर 16.04 स्थापित किया है। अब, जब उन्हें प्रशासित करने की कोशिश की जा रही है, तो मुझे पता चलता है कि जब उपयोगकर्ता द्वारा sudo -u $user -iया यहाँ तक कि किसी उपयोगकर्ता के माध्यम से su - $user, वातावरण XDG_RUNTIME_DIRसेट नहीं होता है, तो systemctl --userकाम करने से रोकता है। हालाँकि, जब मैं sshसीधे उस उपयोगकर्ता में आता हूं, तो यह सही तरीके से सेट किया गया है।

यदि मैं दस्तावेज़ीकरण को सही ढंग से समझता हूं, libpam-systemdतो उपयोगकर्ता सत्र बनाते समय इसे सेट किया जाना चाहिए । उपयोगकर्ता स्लाइस को सही ढंग से शुरू किया गया है, क्योंकि निर्देशिका को XDG_RUNTIME_DIRइंगित करना चाहिए ( /run/users/$uid) मौजूद है। मैं इसे केवल हार्डकोड करने में संकोच कर रहा हूं, कहते हैं, .bash_profileक्योंकि यह हैकी (यद्यपि काम करना) लगता है, जब पैम को इसकी देखभाल करनी चाहिए।

मैं, ज़ाहिर है, जोड़ सकते हैं XDG_RUNTIME_DIRकरने के लिए env_keepमें sudoersहै, लेकिन यह सिर्फ sudoing उपयोगकर्ता के पर्यावरण की रक्षा करेगा, जो नहीं है कि मैं क्या चाहता हूँ। मुझे लक्ष्य उपयोगकर्ता का वातावरण चाहिए।

हालांकि, मैं वास्तव में आश्चर्यचकित हूं, लेकिन यह है कि कैसे सत्र को सही ढंग से सेट किया गया है ssh, लेकिन इसके साथ suया नहीं sudo -i?

जवाबों:


9

मैंने अपने फेडोरा 25 सिस्टम पर इस मुद्दे को दोहराया है।

मुझे स्रोत कोड में एक बहुत ही संदिग्ध स्थिति मिली। https://github.com/systemd/systemd/blob/f97b34a/src/login/pam_systemd.c#L439 ऐसा लगता है कि मानो यह सामान्य रूप से लिखा गया था, sudoलेकिन नहीं sudo -u non-root-user

machinectl shell --uid=non-root-user आपके अनुरोध के अनुसार काम किया।

systemd-run मशीनिनल डॉक्यूमेंट में इसके संदर्भ के बावजूद वांछित काम नहीं किया।

यदि आपने अभी तक SELinux को सक्षम किया है, तो कुछ मशीन कमांड काम नहीं करती हैं, और जब तक मैंने नहीं किया, तब तक ये विशिष्ट कमांड मेरे लिए काम नहीं करती हैं setenforce 0। हालाँकि, मैं मशीनरेल को पाने के लिए वर्कअराउंड की कोशिश कर रहा हूँ, क्योंकि मैं इसे SELinux को wrt करना चाहता हूँ, इसलिए यह संभव है कि मेरी फ़िडलिंग क्या है जैसे machinectl shellसमय से पहले होना।

संपादित करें: मुझे लगता है कि इस चर्चा के बाद यह कोड पेश किया गया था । और जाहिरा तौर पर su -/ sudo -iकाम करने के लिए बनाया जा सकता है, लेकिन किसी ने इसे (अभी भी) लागू नहीं किया है।


दूसरे शब्दों में, PAM डिजाइन द्वारा सत्रों के XDG_RUNTIME_DIRलिए निर्धारित नहीं होगा sudo? मुझे लगता है कि फिर मुझे लगता है कि ~/.profileजैसा मैंने सोचा था कि यह उतना आसान नहीं है।
मकीटो

3
मैं "डिज़ाइन द्वारा" कहना नहीं चाहता क्योंकि मैं यह नहीं बता सकता कि डिज़ाइन क्या है। सुडो को फिर से देखते हुए, मैं कम से कम कुछ बिल्ड / डिस्ट्रीब्यूशन को पर्याप्त पर्यावरण चर को संरक्षित करता हूं, जो कि रूट के रूप में चलने वाले प्रोग्राम मूल उपयोगकर्ता पर अनुमति की समस्याओं को समाप्त कर सकते हैं। हालाँकि, यह XDG_RUNTIME_DIR को लक्ष्य उपयोगकर्ता के अनुरूप सेट नहीं करने का एक कारण नहीं है ।
sourcejedi

1
एक संबंधित Q & A unix.stackexchange.com/questions/423632 है
JdeBP

3

हालांकि, मैं वास्तव में सोच रहा हूं कि कैसे सत्र सही तरीके से ssh के साथ सेट होता है, लेकिन su या sudo -i के साथ नहीं?

https://github.com/systemd/systemd/issues/7451#issuecomment-346787237

क्षमा करें, लेकिन "सु" उपयोगकर्ता पहचान और बहुत कम अन्य प्रक्रिया क्रेडेंशियल्स को अस्थायी रूप से बदलने के लिए एक उपकरण है। यह पूरी तरह से नया लॉगिन सत्र खोलने के लिए एक उपकरण नहीं है। एक नए लॉगिन सत्र में एक बहुत अच्छी तरह से परिभाषित, प्राचीन सेटअप है, जो किसी भी अन्य सत्र से कुछ भी विरासत में नहीं मिला है, लेकिन यह वास्तव में "सु" के लिए मामला नहीं है uid परिवर्तन: अधिकांश निष्पादन वातावरण विरासत में मिला है, कई और गैर-स्पष्ट में तरीकों के लिए, उदाहरण के लिए मैक संदर्भों, लेखा परीक्षा संदर्भों, cgroup संदर्भों, नामस्थान संदर्भों, समय-निर्धारण, टाइमर बारीकियों, ...

यदि आप एक पूर्ण नया सत्र चाहते हैं, तो "मशीनिनल लॉगिन" या "मैकिनकेल शेल" जैसी किसी चीज़ का उपयोग करें, जो वास्तव में आपके पूर्ण स्वच्छ, स्वतंत्र, अलग वातावरण को प्राप्त करेगा, जिसमें कोई छिपी हुई प्रक्रिया गुण नहीं हैं जहां से आप इसे कहते हैं।

लॉगइंड सत्र ज्यादातर ऑडिट सत्र अवधारणा से जुड़े होते हैं, और ऑडिट सत्र "सु" से अप्रभावित रहते हैं, वास्तव में उन्हें "सील बंद" के रूप में परिभाषित किया जाता है, अर्थात यदि कोई प्रक्रिया एक बार सत्र में प्रवेश करती है, तो यह हमेशा बनी रहेगी। इसके साथ, और इसी तरह इसके बच्चे, यानी एक नया सत्र प्राप्त करने का एकमात्र तरीका पीआईडी ​​1 (या कुछ इसी तरह) से कुछ को दूर करना होगा जो कभी भी सत्र का हिस्सा नहीं रहा है।

या इसे अलग तरीके से कहने के लिए: "सु" के माध्यम से आप जो सामान लेते हैं, वह "लॉगिंटल" में ठीक दिखाई देगा, हालांकि, यह आपके मूल सत्र का हिस्सा बना हुआ है, आपने मूल रूप से लॉग इन किया था। आप मूल सत्र की आईडी (जिसे आप इको $ XDG_SESSION_ID के माध्यम से देख सकते हैं) पर "लॉगिंटल स्टेटस" को इनवॉइस करके सत्यापित कर सकते हैं।

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