更改為 sudo 時保持相同的工作目錄

更改為 sudo 時保持相同的工作目錄

在命令列上工作時,我經常使用 更改為 sudo sudo -i。但是,我的工作目錄自動更改為/root.我從來不想去那裡;我想留在原來的地方!我怎樣才能實現這個目標?

答案1

您可以sudo -s改為使用,它不會將您的當前目錄更改為/root,儘管您的某些環境變數不會是 root 的環境變數。

Ubuntu 論壇有一個很好的總結:

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

Ubuntu 文件中的這個頁面有更多內容sudo 的背景訊息

答案2

如果您想使用su,有一種方法可以保留在同一目錄中。

蘇-使用者-c“cd`pwd`;bash”

這裡發生了什麼事:

  • su - user= 登入為user
  • -c這意味著“在新用戶的 shell 中運行命令”
  • -c "cd `pwd`"我們給出的命令是切換到當前目錄 ( `pwd`) – 但因為我們在雙引號中使用反引號,所以pwd在運行命令之前會評估該命令su,以便我們實際上切換到現在所在的目錄(如舊目錄)用戶。

    • 相比之下,將在新 shell 中-c 'cd `pwd`'執行該命令,因此這將計算為,當然,這不會完成任何事情。pwdcd /root

    這裡唯一的問題是新的 shell 在運行命令後立即退出,所以我們添加:

  • -c "cd `pwd`; bash"這表示「bash運行命令後運行(新 shell)cd。bash shell 在我們登出之前不會退出。

請注意,您可以替換`pwd`$(pwd).它們在功能上是相同的,但大量的類似引號的字元可能會變得難以閱讀。

答案3

我遇到了同樣的問題,並且不允許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目錄下:
#!/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

它會向上尋找進程樹並檢查進程擁有使用者是否發生變更。

答案4

如果兩個使用者都有權利存取工作目錄:

sudo su -- $USER

請注意,如果您成為無權存取工作目錄的用戶,則新用戶將無法在其中執行任何讀取/寫入操作。

或只是在工作目錄中成為 root:

sudo su --

相關內容