Answers:
您可以改用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
sudo -iu
对我的作品ubuntuforums.org/...
sudo -i
用户的环境变量仍然破坏了环境变量。避免这种情况的唯一方法是使用su -l
。
如果要使用su
,有一种方法可以保留在同一目录中。
su- 用户 -c“ cd`pwd`; bash”
这里发生了什么:
su - user
=登录为 user
-c
这意味着“在新用户的外壳程序中运行命令”-c "cd `pwd`"
我们提供的命令是切换到当前目录(`pwd`
)–但由于我们使用双引号将双引号引起来,因此pwd
在运行该su
命令之前先对命令求值,以便实际上切换到现在位于旧目录中的目录用户。
-c 'cd `pwd`'
将pwd
在新的shell中执行命令,因此该结果将等于cd /root
,这当然不会完成任何事情。唯一的问题是新外壳程序在运行命令后立即退出,因此我们添加:
-c "cd `pwd`; bash"
这意味着“ bash
在运行cd
命令后运行(新外壳程序)。bash外壳程序直到我们注销后才退出。请注意,您可以替换`pwd`
使用$(pwd)
。它们在功能上是相同的,但是大量的引号字符可能变得难以阅读。
我也遇到过同样的问题,除了sudo su - devuser
在开发服务器上,我不能运行其他任何东西,所以这就是我想出的:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
cd $prev_user_home
fi
#!/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
它进入流程树,并检查流程拥有者是否已更改。