我最近学习了两个简洁的命令,
sudoedit
和sudo -e
,这可以帮助我在启用我最喜欢的编辑器配置的情况下编辑不可写的文件。另外,我认为 sudoedit
命令只是一个将 -e
标志传递给 sudo
的包装器。然而,我发现 sudoedit
命令只是 sudo
: 的符号链接
lrwxrwxrwx 1 root root 4 Jun 22 04:49 sudoedit -> sudo
所以我想知道,作为一个符号链接,为什么
sudoedit
与sudo
有不同的行为?这是怎么发生的?
它有点埋藏在 Lajos Arpad 的答案中(“当作为 sudoedit 调用时”......)。
您可以通过使用您最喜欢的搜索引擎查找“unix argv”或类似内容来找到“它是如何发生的”,但简而言之: 如果你用 C 语言编写程序,你的 main 函数将作为参数给出一个参数数组(通常称为“argv”);按照约定 argv[0] 应该是程序名称,虽然事情可能会变得复杂(https://utcc.utoronto.ca/~cks/space/blog/unix/Argv0IsEasy - tldr 你可以通过任何东西) 作为 argv[0]),重要的是程序可以查看 argv[0] 并决定“如果 argv[0] 是(某个名称),则执行(某事)”。
你猜怎么着?如果您通过符号链接调用程序(并且不要做任何可怕的事情),则 argv[0] 是该符号链接的名称...
作为一个简单的测试,将
echo "$0($*)"
写入 shell 脚本,例如 foo.sh,使其可执行 (chmod +x foo.sh
),创建指向它的符号链接 (ln -s foo.sh mysymlink
),然后查看运行 ./foo.sh 1 2 3
与./mysymlink 1 2 3
如果你运行
man sudoedit
,那么你会看到一个很长的手册页,我只粘贴相关部分:
姓名 sudo, sudoedit — 以另一个用户身份执行命令 概要 [...] sudoedit [-ABknS] [-C 数字] [-D 目录] [-g 组] [-h 主机] [-p 提示符] [-R 目录] [-r 角色] [-t 类型] [-T超时] [-u 用户] 文件... 描述 [...] 当作为 sudoedit 调用时,隐含 -e 选项(如下所述)。 [...] -e, --edit 编辑一个或多个文件而不是运行命令。在查询安全策略时,使用字符串“sudoedit”代替路径名。如果用户 经政策授权,采取以下步骤: 1. 临时副本由要编辑的文件组成,所有者设置为调用用户。 2. 运行策略指定的编辑器来编辑临时文件。 sudoers 策略使用 SUDO_EDITOR、VISUAL 和 EDITOR 环境变量 (以该顺序)。如果未设置 SUDO_EDITOR、VISUAL 或 EDITOR,则使用编辑器 sudoers(5) 选项中列出的第一个程序。 3. 如果临时文件已被修改,则临时文件将被复制回其原始位置,并删除临时版本。 为了帮助防止编辑未经授权的文件,除非安全策略明确允许,否则将强制执行以下限制: • 符号链接不可编辑(1.8.15 及更高版本)。 • 当调用用户可写父目录时,不会遵循要编辑的路径上的符号链接,除非该用户是 root(版本 1.8.16 及更高版本)。 • 位于调用用户可写的目录中的文件不得编辑,除非该用户是root(版本1.8.16 及更高版本)。 用户永远不允许编辑设备特殊文件。 如果指定的文件不存在,则会创建该文件。请注意,与 sudo 运行的大多数命令不同,编辑器是在调用用户的环境中运行的 未经修改。如果编辑后临时文件变空,安装前会提示用户。如果由于某种原因 sudo 无法启动- 如果将文件与其编辑版本一起添加日期,用户将收到警告,并且编辑后的副本将保留在临时文件中。 [...]
所以,
sudoedit
等价于sudo -e
,因此,sudo
和sudoedit
之间的差异与sudo
和sudo -e
之间的差异非常相同,即:
编辑一个或多个文件而不是运行命令