
在命令列上工作時,我經常使用 更改為 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`'
執行該命令,因此這將計算為,當然,這不會完成任何事情。pwd
cd /root
這裡唯一的問題是新的 shell 在運行命令後立即退出,所以我們添加:
- 相比之下,將在新 shell 中
-c "cd `pwd`; bash"
這表示「bash
運行命令後運行(新 shell)cd
。bash shell 在我們登出之前不會退出。
請注意,您可以替換`pwd`
為$(pwd)
.它們在功能上是相同的,但大量的類似引號的字元可能會變得難以閱讀。
答案3
我遇到了同樣的問題,並且不允許sudo su - devuser
在開發伺服器上運行任何其他內容,所以這就是我想到的:
- 在 devuser 的 .profile 中,如果找到,則切換回先前的使用者主目錄:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
cd $prev_user_home
fi
- 用於確定先前使用者的腳本。該腳本放置在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 --