如何防止 sudo -i 命令更改当前目录?

如何防止 sudo -i 命令更改当前目录?

sudo -i COMMANDCOMMAND在根目录中运行$HOME

当我尝试运行当前目录的脚本时,这会导致错误:

$ sudo -i ./myscript.sh
-bash: ./myscript.sh: No such file or directory

找不到 /home/user/myscript.sh 因为 sudo -i 命令在我的情况下将当前目录移动到 /root 。

如何使sudo -i命令保留当前目录?

sudo并且sudo -i有不同的环境,并且它需要的环境sudo -i

答案1

你不能;更改目录是其中的一部分sudo -i。但您可以返回到原来的位置,然后运行命令:

sudo -i sh -c "cd '$PWD'; ./myscript.sh"

$PWD如果包含单引号,则会失败。 (另一方面,如果你知道 $PWD不包含空格或 shell 的任何特殊内容,您也可以取消单引号。)

更安全的方法如下:

sudo -i sh -c 'cd "${1}"; ./myscript.sh' sh "$PWD"

(普通命令"$1"无法按您的预期工作,因为sudo -i在其间运行用户的登录 shell,导致另一轮扩展。它尝试转义命令以防止这些扩展,但失败了$1$foo等等)。请参阅如果我从“sudo --login”运行“sh -c”,则它不会扩展位置参数。有没有解决的办法?了解血淋淋的细节。)


无论如何,如果该脚本是一个通常由 root 运行的工具,那么将其放在PATHroot 所在的某个目录中是有意义的,只能由 写入root。一般来说,最好避免非 root 用户搞乱运行的任何机会root,但如果它位于您的常规帐户的主目录中,则可能出现的问题可能很小。

答案2

为了避免sudo -i更改您的主目录,请不要使用该-i标志,

sudo ./myscript.sh

sudo(请参阅man sudo)旗帜状态的文档-i(重点是我)

-i,--login 运行由目标用户的密码数据库条目指定的 shell 作为登录 shell。这意味着shell 将读取特定于登录名的资源文件,例如.profile.bash_profile或。 .login[...]sudo在运行 shell 之前尝试更改到该用户的主目录。该命令在类似于用户登录时收到的环境中运行。

您的问题刚刚经过编辑,表示您需要根配置文件才能运行脚本。在不知道你需要什么环境的情况下,我能提供的最接近的是这个

sudo -i "${PWD:-$(pwd)}/myscript.sh"

如果您知道实际位置myscript.sh(例如,在您的主目录中),您最好直接提供该位置,

sudo -i "$HOME/myscript.sh"

可能有更好的选择,但您需要提供需要设置的环境的详细信息

相关内容