如何对我自行创建的、已在我的路径中且可执行的脚本使用 sudo?

如何对我自行创建的、已在我的路径中且可执行的脚本使用 sudo?

我如何制作一个我自己制作的脚本,该脚本已放入我的路径中并可通过 sudo 执行?(Xubuntu 22.04.1。)

脚本位于此处:~/bin/myScript

当我从任意目录中执行

sudo myScript

我收到的错误是这样的:

sudo: myScript: command not found

答案1

有很多方法可以做到这一点。

  1. 使用绝对路径而不是相对路径(但这违背了将其放在路径中的目的)。
  2. 制作一个单独的脚本来调用 sudo 并将内容转换为绝对路径。
  3. 使用 update-alternatives 将您的脚本添加到系统。
  4. 将您的脚本放在适合此类操作的不同路径中(它将是一个系统路径 - 而不是您的主目录中的路径)。
  5. 添加一个新路径(无论它是否在您的主目录中)作为执行此类操作所需的路径。如果您这样做,您需要了解事情的底层安全原因。
  6. 从脚本本身调用 sudo(而不是在脚本外部)。别名和函数也一样。

虽然 #4 和 #5 可能有效,但我认为大多数人都不想这么做,因为如果你做错了,它可能会破坏你的系统并让你面临安全漏洞;而且还有一个学习曲线(我还不知道所有的来龙去脉)。所以,我将使用 #2 给你一个简单的非侵入式解决方案,然后我会告诉你如何做 #3。

好的,这是我编写的 Python 3.x 脚本;我只是调用它sud并放入它~/bin(在 Ubuntu 中,它会自动将其放入您的常规路径中;您不需要将它放入可与 sudo 一起使用的超特殊路径中)。该脚本本质上调用 sudo 并让它执行 sudo 所做的操作。但是,如果您想调用常规路径中的自己的脚本,请在其前面加上逗号(以使其成为脚本的绝对路径),并在不在路径中的常规相对路径前面加上 +(以将它们变成文件的绝对路径);一定要这样做chmod u+x ~/bin/sud(使其对当前用户可执行;出于安全原因,可能没有必要使其对其他任何人可执行 aschmod +xchmod a+xdo)。是的,您可以通过这种方式明确地将标志和选项与 sudo 和调用程序一起使用。

#!/usr/bin/env python3

"""
This is like sudo, except it finds the absolute paths for scripts if they begin with a comma, and it finds the absolute paths for filepaths if they begin with a plus. It also uses an absolute path for sudo. The aim is to allow a flexible way for all scripts in the path to be run with sudo, while keeping the user conscious of which ones don't naturally run with sudo.

It should also be able to be used like sudo for the uses that sudo already works for. Obviously, it will cause problems if your files or commands begin with + or , naturally. So, don't use it on those.

Example usage:
sud ,myscript
sud +mypath
sud ,myscript +mypath
sud app
sud app path
"""

import subprocess, sys, os, shutil

sys.argv[0]=shutil.which("sudo")

i=1
while i<len(sys.argv):
    if sys.argv[i].startswith(","):
        sys.argv[i]=sys.argv[i][1:]
        sys.argv[i]=shutil.which(sys.argv[i])
    elif sys.argv[i].startswith("+"):
        sys.argv[i]=sys.argv[i][1:]
        sys.argv[i]=os.path.abspath(sys.argv[i])
    i+=1
subprocess.run(sys.argv)

好的,现在是 update-alternatives 选项。这需要 root 权限。它还会将脚本放在您的路径中(因此您可以将它放在任何地方;它不必先放在您的路径中)。如果脚本的位置在系统范围内可用,它还会使脚本在系统范围内可用。执行此操作后不要移动脚本,否则会破坏命令。

首先,为您的脚本选择一个系统上未使用的名称(否则这会更加复杂,我现在也不打算解释如何处理更复杂的东西)。

将以下行添加到您的~/.bashrc文件中:

enter() {
    sudo update-alternatives --install /usr/bin/"$1" "$1" $(realpath "$1") 0
}

保存并退出。退出终端并打开另一个终端。现在,无论何时输入enter myScriptName(请确保您在同一个目录中,并使用仅包含脚本名称的相对路径),它都会将该脚本添加到您的路径中,使其可以在使用和不使用 sudo 的情况下使用。如果您处于多用户环境中,请确保正确设置您的权限和文件位置(即可能不在您的主目录中,并确保权限不是 0600 之类的值,而是 0555 之类的值)。

如果您想在使用 update-alternatives 添加该脚本后将其从路径中删除,请执行以下操作(无论您位于哪个目录中):

sudo update-alternatives --remove-all myScriptName

当然,您也可以使用 update-alternatives 手动添加它们,而不是使用enter上面的函数。因此,如果您想添加/opt/Programs/myScript到路径中,可以执行以下操作:

sudo update-alternatives --install /usr/bin/myScript myScript /opt/Programs/myScript 0

然后您可以从任何地方输入这些内容来调用它:

  • 我的脚本 [我的参数]
  • sudo myScript [myArgs]

相关内容