sudo -i COMMANDCOMMAND在$HOMEroot 中运行。
当我尝试运行当前目录的脚本时,这会导致错误:
$ sudo -i ./myscript.sh
-bash: ./myscript.sh: No such file or directory
Run Code Online (Sandbox Code Playgroud)
找不到 /home/user/myscript.sh 因为在我的情况下 sudo -i 命令将当前目录移动到 /root 。
如何使sudo -i命令保持当前目录?
sudo并sudo -i有不同的环境,它需要的环境sudo -i
你不能;更改目录是做什么的一部分sudo -i。但是您可以回到原来的位置,然后运行以下命令:
sudo -i sh -c "cd '$PWD'; ./myscript.sh"
Run Code Online (Sandbox Code Playgroud)
如果$PWD包含单引号,那将失败。(另一方面,如果您知道 $PWD不包含空格或 shell 的任何特殊内容,您也可以取消单引号。)
更安全的方法如下:
sudo -i sh -c 'cd "${1}"; ./myscript.sh' sh "$PWD"
Run Code Online (Sandbox Code Playgroud)
(一个普通的"$1"不能像你期望的那样工作,因为sudo -i在两者之间运行用户的登录 shell,导致另一轮扩展。它试图逃避命令以防止这些扩展,但失败了$1($foo等等)。见“sh -c”不会扩展位置参数,如果我从“sudo --login”运行它。有没有办法解决这个问题?对于血腥的细节。)
在任何情况下,如果该脚本是通常由 root 运行的工具,那么将它放在某个目录中是有意义的,该目录既是PATHroot 用户,又只能由root. 一般来说,最好避免非 root 用户搞乱root运行的任何机会,但如果它在您的常规帐户的主目录中,则可能的问题可能很小。