सूडो में बदलते समय एक ही कार्यशील निर्देशिका में रहें


25

कमांड लाइन पर काम करते समय, मैं अक्सर सूडो का उपयोग करके बदल जाता हूं sudo -i। हालाँकि, मेरी वर्किंग डायरेक्टरी अपने आप बदल जाती है /root। मैं वहां जाना कभी नहीं चाहता; मैं वहीं रहना चाहता हूं, जहां मैं था! इसे कैसे प्राप्त किया जा सकता है?

जवाबों:


28

आप sudo -sइसके बजाय उपयोग कर सकते हैं , यह आपकी वर्तमान निर्देशिका को नहीं बदलेगा /root, हालांकि आपके कुछ पर्यावरण चर जड़ के नहीं होंगे।

उबंटू मंच से इस पृष्ठ का एक अच्छा सारांश है:

Summary of the differences found   
                                               corrupted by user's 
                HOME=/root      uses root's PATH     env vars
sudo -i         Y               Y[2]                 N
sudo -s         N               Y[2]                 Y
sudo bash       N               Y[2]                 Y
sudo su         Y               N[1]                 Y

उबंटू के दस्तावेज़ों के इस पृष्ठ में सुडो पर पृष्ठभूमि की अधिक जानकारी है


1
सुंदर! धन्यवाद एक गुच्छा, सरल लेकिन बहुत कम अवलोकन!
मोनिका

@ user1162541 मदद करने में सक्षम होने के लिए खुश।
लेवोन

sudo -iuमेरे लिए ubuntuforums.org/…
rofrol

मेरे परीक्षण के दौरान, sudo -iउपयोगकर्ता के env var द्वारा अभी भी भ्रष्ट है। इससे बचने का एक ही तरीका है कि हम इसका इस्तेमाल करें su -l
सिमबा

5

यदि आप उपयोग करना चाहते हैं su, तो उसी निर्देशिका में रहने का एक तरीका है।

su - उपयोगकर्ता -c "cd` pwd`; बाश "

यहाँ क्या चल रहा है:

  • su - user = के रूप में लॉगिन करें user
  • -c जिसका अर्थ है "नए उपयोगकर्ता के शेल में एक कमांड चलाना"
  • -c "cd `pwd`"हम जो कमांड देते हैं, वह वर्तमान निर्देशिका ( `pwd`) पर स्विच करने के लिए है - लेकिन क्योंकि हम दोहरे कोट्स में बैकटिक्स का उपयोग करते हैं, pwdकमांड का मूल्यांकन हम suकमांड चलाने से पहले करते हैं , ताकि हम वास्तव में उस निर्देशिका में स्विच कर सकें जो अब हम पुराने रूप में कर रहे हैं उपयोगकर्ता।

    • इसके विपरीत, नए शेल में कमांड -c 'cd `pwd`'निष्पादित करेगा pwd, इसलिए यह मूल्यांकन करेगा cd /root, जो निश्चित रूप से, कुछ भी पूरा नहीं करेगा।

    यहां एकमात्र समस्या यह है कि कमांड चलाने के बाद नया शेल सही निकलता है, इसलिए हम जोड़ते हैं:

  • -c "cd `pwd`; bash"जिसका अर्थ है "रन bash(नया शेल) cdकमांड को चलाने के बाद । बैश शेल तब तक बाहर नहीं निकलता जब तक हम उससे बाहर नहीं निकल जाते।

ध्यान दें कि आप के `pwd`साथ बदल सकते हैं $(pwd)। वे कार्यात्मक रूप से समान हैं, लेकिन उद्धरण जैसे वर्णों की प्रचुरता को पढ़ना मुश्किल हो सकता है।


0

मैंने एक ही मुद्दे का सामना किया है और मुझे sudo su - devuserदेव सर्वर पर इसके अलावा कुछ भी चलाने की अनुमति नहीं है, इसलिए यही मैं साथ आया हूँ:

  1. पिछले उपयोगकर्ता के घर में अगर यह पाया जाता है तो devuser.profile पर वापस जाएँ:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
        cd $prev_user_home
fi
  1. पिछले उपयोगकर्ता को निर्धारित करने के लिए एक स्क्रिप्ट। स्क्रिप्ट को devuser की बिन निर्देशिका में रखा गया है:
#!/bin/bash
#brings you back home after sudo su

function get_owner {
  pid=$1
  echo $(ps ouid -p $pid h | tr -d ' ')
}

pid=$$
my_uid=$(get_owner $pid)
uid=$my_uid
i=0
while [[ $uid == $my_uid && $i -lt 20 ]] ; do
    pid=$(ps -o ppid= $pid)
    uid=$(get_owner $pid)
    i=$((i+1))
done

user_home=$(getent passwd $uid | cut -d ':' -f '6')
if [[ -d $user_home && $uid != 0 ]] ; then
    echo $user_home
fi

यह एक प्रक्रिया ट्री ऊपर जाता है और जाँचता है कि क्या प्रक्रिया के मालिक ने उपयोगकर्ता बदल दिया है।

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