gpt4 book ai didi

linux - 如何将需要 root 权限的功能添加到 Common Lisp 库中?

转载 作者:太空狗 更新时间:2023-10-29 11:24:26 27 4
gpt4 key购买 nike

原始问题

我正在尝试创建一个 Lisp 库,除其他外,它可以编辑我系统的 /etc/hosts 文件和 nginx 配置。我面临的问题是,因为我的 Lisp 镜像以非特权用户身份运行,所以我的库无法执行这些操作。理想情况下,当需要 root 权限时,我能够为我的图书馆提供密码,以便它可以暂时提高其访问权限以完成工作。唉,我没能找到任何与 sudo 等效的 Common Lisp。有吗?我是以错误的方式接近这个吗?我该如何解决这个问题?

在代码中,我希望能够做的基本上是这样的:

(with-sudo (:username "root" :password (securely-read-line))
(with-open-file (f "/etc/hosts" :direction :output :if-exists :append)
(format f "127.0.0.1 mywebsite.local~%")))

说明

我在 OS X 上使用 SBCL。我正在尝试创建一个库,它基本上是网站 quickproject 的特化。目前,每次我在本地计算机上设置一个新的 Web 项目时,我都必须编辑散布在我系统中的配置文件。我希望尽可能多地实现自动化,并且我希望能够在我通常打开并连接到单个 SBCL 实例的 SLIME session 中执行此操作。

以下是一些其他注意事项:

  1. 我不希望我的 SBCL 主实例被 setuid 设置为 root
  2. 我不介意生成新进程,无论是小型 C 程序还是加载几行代码然后退出的 SBCL 裸实例。
  3. 我希望尽可能高地保持 Lisp 与 C 的比率。
  4. 某些文本编辑器(例如 TextMate)在访问需要更高权限才能查看的文件时会提示您输入用户名和密码,并相应地提供访问权限。我想知道我怎样才能让我的 Lisp 库做同样的事情?
  5. 起初我无法让 sudo(实际程序本身)在 SBCL 中运行:

    (劣质外壳:run/ss '("sudo""ls"".")) ;;如何向 sudo 传递密码?

    现在看起来可以使用 sudo-S 选项(谢谢 JustAnotherCurious)。我想我可以走这条路;这绝对是我现在的倾向。

总之,谢谢大家!我从你们身上学到了很多东西。

最佳答案

如果您在您的进程中需要 root 访问权限,您需要首先以 root 身份启动您的 Lisp 进程。回想起来,通常不可能使非根进程运行。

幸运的是,Unix 有一种机制允许进程在运行时在 root 和非 root 权限之间切换。该机制称为有效用户 ID。以 root 身份运行的进程可以使用 seteuid 系统调用切换到非 root 有效 uid,它也可以通过这种方式切换回“成为”root。

当然,如果您以 root 身份启动您的 Lisp 进程,该进程可以完全控制机器,并且根据您处理的数据和机器,您需要考虑可能打开的安全漏洞那。幸运的是,缓冲区溢出在 Lisp 中很难产生,所以从这个角度来看,你更安全 :)

访问系统调用接口(interface)在Common Lisp中没有标准化,但大多数实现都有系统的本地接口(interface),你也可以使用CFFI如果您计划让您的程序可移植到基于 Linux/Unix 的 Lisp 中。

这是以 root 身份运行的 SBCL 的记录,演示了 seteuid 的使用:

CL-USER> (defun write-file-in-filesystem-root ()
(handler-case
(with-open-file (f "/only-root-may-write-to-root"
:direction :output
:if-exists :supersede)
(write "hello" :stream f))
(error (e) (format t "error: ~A~%" e))))
WRITE-FILE-IN-FILESYSTEM-ROOT
CL-USER> (sb-posix:seteuid 0)
0
CL-USER> (write-file-in-filesystem-root)
"hello"
CL-USER> (sb-posix:seteuid 1000)
0
CL-USER> (write-file-in-filesystem-root)
error: error opening #P"/only-root-may-write-to-root": Permission denied
NIL
CL-USER> (sb-posix:seteuid 0)
0
CL-USER> (write-file-in-filesystem-root)
"hello"
CL-USER> (delete-file "/only-root-may-write-to-root")
T

如果您只需要访问 protected 文件,如果可以接受特定于 OSX 并且您希望用户使用标准身份验证请求程序进行身份验证,则可以使用 authopen特定于 OSX 的命令。

关于linux - 如何将需要 root 权限的功能添加到 Common Lisp 库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15700311/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com