根据https://unix.stackexchange.com/a/489913/674
cron 作业可以以任何用户身份运行,无需该用户登录。
值得庆幸的是,root 不需要登录即可启动 init 进程(想象一下要处理数千台服务器和数百万台虚拟机的队列);
如果我想在不登录的情况下运行一个进程,以我作为其所有者,我该如何在两个地方执行此操作系统/库调用级别和实用级别?
如果root
想做的话,怎么做呢?
怎么能无法登录的服务用户作为进程所有者启动进程还是稍后成为进程所有者?
唯一的方法是调用setuid()
或者seteuid()
在程序中运行的进程吗?
谢谢。
答案1
在 Unix 中,有 3 种方法可以更改进程的用户。
更改进程用户的 2 种系统级方法
- 如果进程具有 CAP_SETUID 能力,传统上 root 具有此能力(以及所有其他能力),那么它可以使用
setuid
、setreuid
、setresuid
、setfsuid
、 系统调用来更改为任何其他用户。任何其他用户都可以打乱 uid:一个进程有 3 个 uid,它可以随意移动它们:它可以交换它们,或删除它们,直到只剩下一个。它不能添加uids
,除非它具有CAP_SETUID 能力。一般来说,进程只能使用这些系统调用来释放权限或移动权限。这些调用允许程序继续。 exec
可执行文件suid
:如果一个可执行文件设置了suid
位,并且它是有效类型(不是脚本、不是 java、不是……),那么当它运行时,其有效用户 ID 会更改为文件所有者的用户 ID 。 (对于带有位的组也可以这样做sgid
)。这是获得特权的唯一途径。当前程序在exec
被调用时结束,它被新程序替换,但它是同一个进程,它也继承打开的文件(例如stdin、stdout、stderr)。
fork
剂量不是更改用户。分叉进程与其父进程完全相同,但有一些例外(请参阅 参考资料man fork
)。特别是 uid、gid 和功能没有改变。
实用方法
这些程序使用上述 2 种系统方法。
- 使用
sudo
或su
:su
会询问其他用户的密码。sudo
会要求您输入密码,但仅当您在文件中注册时才有效sudoers
。
sudo
、su
、login
等cron
使用2种系统方法。 (并且会创建一个新进程。其他系统方法不会创建新进程。)
sudo
,做什么su
?
#↳ ll /usr/bin/sudo
-rwsr-xr-x 1 root root 155K Sep 9 2017 /usr/bin/sudo*
正如用户所看到的,sudo
可执行文件由root拥有,并且设置了suid位(s
您希望看到第一个的位置x
)。
当sudo
运行时,它以 root 身份运行(不要尝试这个,除非你知道你在做什么)。然后它会进行安全检查。然后它用来set??uid
成为所需的用户,然后它exec
(可能是一个分叉)所需的程序。
运行进程,无需登录
使用一些定时启动服务。
- 计划任务
- 在
发送网络消息,例如网络服务器可以响应网络请求来运行任务。
使用自动登录:用于ssh
通过另一台计算机上的脚本启动进程。