更改为 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 --

相关内容