Альтернатива su/sudo в базовой системе

Простой ответ - запускает, пишет Ваш pid где-нибудь, и в каждый x раз (секунды, минуты, Ваша ставка) проверка, если процесс закончился.

Длинный ответ - все вышеупомянутое является хорошими методами. Но несколько сложный.

Также имейте в виду, что быть живым и ответ на запросы являются разными вещами.

6
23.09.2011, 10:34
2 ответа

Если я понимаю правильно, Вы просто должны su от корня до некоторого другого пользователя. Попытайтесь копировать su двоичный файл (это не должен будет быть корень setuid), но я не знаю, будет ли это работать над Солярисом. Или скомпилируйте маленькую программу C, которая отбрасывает полномочия и выполняет команду.

Вот маленький “вниз единственный” su. Минимально протестированный. Должен скомпилировать, как находится под Солярисом и *BSD; Вы должны -D_BDS_SOURCE и #include <grp.h> в соответствии с Linux и другими платформами может потребовать комментирования вызова к общему, но нестандартному setgroups. Выполненный как, например. sugexec UID GID bash /path/to/script (необходимо передать числового пользователя и идентификаторы группы, для предотвращения в зависимости от любой формы пользовательской базы данных, которая не может быть доступной в 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);
}
4
27.01.2020, 20:29
  • 1
    Принятие с тех пор там, кажется, не канонические предложения. –  l0b0 05.05.2011, 10:38

Проверьте schroot, который может chroot в папку как пользователь. Здесь страница справочника для него: http://manpages.ubuntu.com/manpages/hardy/man1/schroot.1.html

0
27.01.2020, 20:29
  • 1
    не то, что определенный для Linux инструмент? –  Mat 19.04.2011, 17:24
  • 2
    Кажется, что проект разрабатывается Debian, но это присутствует во многих дистрибутивах Linux. Также поиск на Google привел меня к этому журналу изменений для schroot назад с 2009, который содержит код для проверки SunOS и Соляриса. Таким образом, я предполагаю, что это может быть скомпилировано на Солярисе..., просто дают ему попытку. mail-archive.com/debian-release@lists.debian.org/msg30798.html –  Patkos Csaba 21.04.2011, 15:32

Теги

Похожие вопросы