准系统上 su/sudo 的替代方案

准系统上 su/sudo 的替代方案

我想在chrootSolaris 上的准系统监狱中运行一些单元测试。没有susudosu,并且(with )的副本libpam.so.1仅返回退出代码 1,没有任何输出,无论带或不带参数。有没有一些简单的方法以非 root 用户身份运行 Bash 脚本在这样的系统上?也许是 setuid 或包装脚本?

答案1

如果我理解正确的话,您只需su要从 root 切换到其他用户即可。尝试复制su二进制文件(不需要 setuid root),但我不知道这是否适用于 Solaris。或者编译一个小的 C 程序,删除权限并执行命令。

这是一个小的“仅向下”su。经过最低限度的测试。应该在 Solaris 和 *BSD 下按原样编译;你需要-D_BDS_SOURCE#include <grp.h>Linux下,而其他平台可能需要注释掉对常见但非标准的setgroups.例如运行sugexec UID GID bash /path/to/script(您必须传递数字用户和组 ID,以避免依赖于 chroot 中可能不可用的任何形式的用户数据库)。

#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

void die(char *argv0, char *obj, char *msg) {
    if (msg == NULL) msg = strerror(errno);
    fprintf(stderr, "%s: %s: %s\n", argv0, obj, msg);
    exit(127);
}
int main(int argc, char *argv[]) {
    uid_t uid;
    gid_t gid;
    char *endp;
    /* Command line parsing */
    if (argc <= 3) {
        fprintf(stderr, "Usage: %s UID GID COMMAND [ARG...]\n",
                argv[0]==NULL ? "sugexec" : argv[0]);
        exit(127);
    }
    uid = strtoul(argv[1], &endp, 0);
    if (*endp) die(argv[0], argv[1], "Bad uid");
    gid = strtoul(argv[2], &endp, 0);
    if (*endp) die(argv[0], argv[2], "Bad gid");
    /* Drop to specified user and group */
    if (setgid(gid)) die(argv[0], "setgid", NULL);
    if (setgroups(0, NULL)) die(argv[0], "setgroups", NULL);
    if (setuid(uid)) die(argv[0], "setuid", NULL);
    /* Execute the command */
    execvp(argv[3], argv + 3);
    die(argv[0], argv[3], NULL);
}

答案2

查看 schroot,它可以以用户身份 chroot 到文件夹中。这是它的手册页:http://manpages.ubuntu.com/manpages/hardy/man1/schroot.1.html

相关内容