更改为sudo时位于同一工作目录


25

在命令行上工作时,我经常使用更改为sudo sudo -i。但是,我的工作目录会自动更改为/root。我永远不想去那里;我想留在原地!我该如何实现?

Answers:


28

您可以改用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的更多背景信息


1
美丽!谢谢,简单但很棒的概述!
恢复莫妮卡2012年

@ user1162541很高兴能够提供帮助。
莱文

sudo -iu对我的作品ubuntuforums.org/...
rofrol

在我的测试过程中,sudo -i用户的环境变量仍然破坏了环境变量。避免这种情况的唯一方法是使用su -l
辛巴

5

如果要使用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)。它们在功能上是相同的,但是大量的引号字符可能变得难以阅读。


0

我也遇到过同样的问题,除了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

它进入流程树,并检查流程拥有者是否已更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.