在命令行上工作时,我经常使用 更改为 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 --