sudo -i COMMAND
COMMAND
在根目录中运行$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 运行的工具,那么将其放在PATH
root 所在的某个目录中是有意义的,和只能由 写入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"
可能有更好的选择,但您需要提供需要设置的环境的详细信息