Разрешить другому пользователю запускать определенный сценарий в качестве моего идентификатора

Можно сделать это с VLC; это имеет пакеты в наличии для большинства дистрибутивов, включая Debian.

4
03.06.2015, 02:31
2 ответа

С помощью sudo вы можете очень детально настраивать свои разрешения. Если вы хотите дать пользователю разрешение только на запуск вашего скрипта и ничего другого, вы можете добавить эту строку в свой / etc / sudoers:

user ALL=(yourusername) NOPASSWD: /path/to/your/script

Затем, в качестве другого использования, вы должны запустить:

sudo -u yourusername /path/to/your/script
9
27.01.2020, 20:48

Я не очень понимаю некоторые части вашего кода. 1) Выполняет ли сценарий filefilter.sh фильтрацию? 2) Если да, в каком состоянии он будет фильтровать (например, $ service существует) 3) Фильтруете ли вы выбранные службы или все процессы, работающие

Отступы очень важны при написании сценариев, так как вы можете легко четко определить циклы

[Ваш код]:

if (( $(ps -ef | grep $service | wc -l) > 0 ))
then
    echo "$service is not done" >> /root/test.txt
else
    (( $(wc -l /root/filter/first.txt) > 0 ))        #There is no condition required for the else-loop

    if (( $(ps -ef | grep $service | wc -l) < 0 ))
    then
            ./root/filter/filefilter.sh

    else
        (( $(ls | grep /root/filter/final.txt | wc -l) > 0 ))   #There is no condition required for the else-loop

            if (( $(ps -ef | grep awk | wc -l) > 0 ))  
            then
                    (( $(ls | grep /root/filter/final.txt | wc -l) > 0 ))
            else
                    #You can use the exit command to stop the loop base on the condition you want

        fi
    fi
fi
-121--251173-

С sqlite3 :

sqlite3 <<EOT
CREATE TABLE file(line);
.import "data.txt" file
SELECT line FROM file ORDER BY length(line) LIMIT 1;
EOT
-121--20173-

Использование sudo является самым простым способом. Но для этого требуется сотрудничество системного администратора.

Если вы хотите сделать это без специальных привилегий, вы можете использовать исполняемый файл setuid , но вы должны быть осторожны, чтобы не позволить вызывающему сделать больше, чем вы хотели.

Большинство вариантов Unix запрещают сценарии оболочки setuid ; например, в Linux ядро всегда игнорирует бит setuid в сценарии. Так что вам нужна обертка в собственном коде.

Убедитесь, что обертка удаляет все, что может позволить пользователю, вызывающему ее, запустить код. Например, переменные среды белого списка; все, что не известно, является безопасным (например, TERM ).

Вот предложение для оболочки setuid, которая сохраняет только переменную среды TERM . Остерегайтесь, что я не просмотрел его или действительно протестировал; обратная связь приветствуется.

/* Compilation command:
   c99 -DTARGET='"/absolute/path/to/script"' -o setuid-wrapper setuid-wrapper.c
 */

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

void die(const char *argv0, const char *obj, const char *msg) {
    if (msg == NULL) msg = strerror(errno);
    fprintf(stderr, "%s: %s: %s\n", argv0, obj, msg);
    exit(127);
}

int env_want(const char *entry) {
    size_t n;
    for (n = 0; entry[n]; n++) {
        if (entry[n] == '=') {
            break;
        } else if (!(isalnum(entry[n]) || entry[n] == '_')) {
            return 0;
        }
    }
    if ((n == 7 && !strncmp(entry, "DISPLAY", n)) ||
        (n == 10 && !strncmp(entry, "XAUTHORITY", n))) {
        return 1;
    }
    if ((n == 4 && !strncmp(entry, "LANG", n)) ||
        (n >= 3 && !strncmp(entry, "LC_", 3)) ||
        (n == 2 && !strncmp(entry, "TZ", n))) {
        return !strpbrk(entry, "/%");
    }
    return 0;
}

int main(int argc, char *argv[], char **environ) {
    size_t i, j;
    const char *program_name = argv[0];
    if (program_name == NULL) program_name = "setuid-wrapper";
    /* Drop privileges */
    if (setgid(getegid())) die(program_name, "setgid", NULL);
    /*if (setgroups(0, NULL)) die(program_name, "setgroups", NULL);*/
    if (setuid(geteuid())) die(program_name, "setuid", NULL);
    /* Sanitize the environment */
    for (i = j = 0; environ[i]; i++) {
        if (env_want(environ[i])) {
            environ[j] = environ[i];
            j++;
        }
    }
    environ[j] = NULL;
    /* Execute the command */
    execle(TARGET, TARGET, NULL, environ);
    die(program_name, TARGET, NULL);
}

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

Альтернативный подход заключается в запуске сервера (например, веб-сервера) и вызове сценария с этого сервера. Существует множество небольших HTTP-серверов, поддерживающих сценарии CGI. Основное преимущество этого подхода заключается в том, что его проще защитить, поскольку сервер работает в контексте, выбранном целевым объектом (стороной, в контексте безопасности которой выполняется код), а не клиентом.

Вариант этого подхода заключается в инициировании запуска сценария через файловую систему FUSE . Например, подключите каталог scriptfs , содержащий сценарий, с помощью параметра allow _ other mount. Для этого пользователю _ разрешить установку _ другого параметра в /etc/fuse.conf .

1
27.01.2020, 20:48

Теги

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