С помощью sudo вы можете очень детально настраивать свои разрешения. Если вы хотите дать пользователю разрешение только на запуск вашего скрипта и ничего другого, вы можете добавить эту строку в свой / etc / sudoers:
user ALL=(yourusername) NOPASSWD: /path/to/your/script
Затем, в качестве другого использования, вы должны запустить:
sudo -u yourusername /path/to/your/script
Я не очень понимаю некоторые части вашего кода. 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
.