LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Или ещё вариант как оставить nginx под рутом, выдать права его перезапускать, и не пользоваться не понравившимся тебе sudo (мне он тоже не нравится).

Пишешь прогу например nginx-runner.c

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <grp.h>

!!! тут заменяешь пути на другие если у тебя другие
#define NGINX_BIN "/usr/sbin/nginx"
#define NGINX_CONF "/etc/nginx/nginx.conf"

int main(int argc, char **argv) {
  char *args[10], *envp[10], *sig;
  if(argc==1) sig = NULL;
  else if(argc!=2) { usage:
    fprintf(stderr, "Usage: %s [start|stop|quit|reopen|reload]\n", argv[0]);
    return -1;
  } else if(!strcmp(argv[1],"start")) sig = NULL;
  else if(!strcmp(argv[1],"stop") || !strcmp(argv[1],"quit") || !strcmp(argv[1],"reopen") || !strcmp(argv[1],"reload")) sig = argv[1];
  else goto usage;
  if(setgroups(0,NULL)<0 || setgid(0)<0 || setuid(0)<0) {
    fprintf(stderr, "failed to set superuser, error %d (%s)\n", errno, strerror(errno));
    return -1;
  }
  args[0] = NGINX_BIN;
  if(!sig) args[1] = NULL;
  else { args[1] = "-s"; args[2] = sig; args[3] = NULL; }
  envp[0] = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
  envp[1] = NULL;
  execve(args[0], args, envp);
  fprintf(stderr, "exec(%s) error %d (%s)\n", args[0], errno, strerror(errno));
  return -1;
}
Пути в define в начале ставишь те которые у тебя, но учти: в случае запуска nginx от рута конфиг тоже должен лежать у рута (т.е. например в /etc), иначе ты создашь очень плохую уязвимость по незапланированному повышению привилегий.

Компилируешь её и кладёшь на место (от рута):

gcc -Wall -o /usr/local/bin/nginx-runner nginx-runner.c
chgrp группа_твоего_юзера /usr/local/bin/nginx-runner
chmod 4750 /usr/local/bin/nginx-runner
После этого твой юзер может запускать
nginx-runner (запустить nginx)
nginx-runner start (запустить nginx)
nginx-runner stop (остановить nginx)
nginx-runner reload
nginx-runner reopen
nginx-runner quit

Учти только что если у тебя nginx запускается из systemd то скорее всего start он будет делать ему сам автоматически и команда start отсюда всегда будет ругаться что он уже запущен. Можно отключить в systemd его целиком и тогда управление останется целиком у юзера (если надо).

Исправление firkax, :

Или ещё вариант как оставить nginx под рутом, выдать права его перезапускать, и не пользоваться не понравившимся тебе sudo (мне он тоже не нравится).

Пишешь прогу например nginx-runner.c

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <grp.h>

!!! тут заменяешь пути на другие если у тебя другие
#define NGINX_BIN "/usr/sbin/nginx"
#define NGINX_CONF "/etc/nginx/nginx.conf"

int main(int argc, char **argv) {
  char *args[10], *envp[10], *sig;
  if(argc==1) sig = NULL;
  else if(argc!=2) { usage:
    fprintf(stderr, "Usage: %s [start|stop|quit|reopen|reload}\n", argv[0]);
    return -1;
  } else if(!strcmp(argv[1],"start")) sig = NULL;
  else if(!strcmp(argv[1],"stop") || !strcmp(argv[1],"quit") || !strcmp(argv[1],"reopen") || !strcmp(argv[1],"reload")) sig = argv[1];
  else goto usage;
  if(setgroups(0,NULL)<0 || setgid(0)<0 || setuid(0)<0) {
    fprintf(stderr, "failed to set superuser, error %d (%s)\n", errno, strerror(errno));
    return -1;
  }
  args[0] = NGINX_BIN;
  if(!sig) args[1] = NULL;
  else { args[1] = "-s"; args[2] = sig; args[3] = NULL; }
  envp[0] = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
  envp[1] = NULL;
  execve(args[0], args, envp);
  fprintf(stderr, "exec(%s) error %d (%s)\n", args[0], errno, strerror(errno));
  return -1;
}
Пути в define в начале ставишь те которые у тебя, но учти: в случае запуска nginx от рута конфиг тоже должен лежать у рута (т.е. например в /etc), иначе ты создашь очень плохую уязвимость по незапланированному повышению привилегий.

Компилируешь её и кладёшь на место (от рута):

gcc -Wall -o /usr/local/bin/nginx-runner nginx-runner.c
chgrp группа_твоего_юзера /usr/local/bin/nginx-runner
chmod 4750 /usr/local/bin/nginx-runner
После этого твой юзер может запускать
nginx-runner (запустить nginx)
nginx-runner start (запустить nginx)
nginx-runner stop (остановить nginx)
nginx-runner reload
nginx-runner reopen
nginx-runner quit

Учти только что если у тебя nginx запускается из systemd то скорее всего start он будет делать ему сам автоматически и команда start отсюды всегда будет ругаться что он уже запущен. Можно отключить в systemd его целиком и тогда управление останется целиком у юзера (если надо).

Исправление firkax, :

Или ещё вариант как оставить nginx под рутом, выдать права его перезапускать, и не пользоваться не понравившимся тебе sudo (мне он тоже не нравится).

Пишешь прогу например nginx-runner.c

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <grp.h>

!!! тут заменяешь пути на другие если у тебя другие
#define NGINX_BIN "/usr/sbin/nginx"
#define NGINX_CONF "/etc/nginx/nginx.conf"

int main(int argc, char **argv) {
  char *args[10], *envp[10], *sig;
  if(argc==1) sig = NULL;
  else if(argc!=2) { usage:
    fprintf(stderr, "Usage: %s [start|stop|quit|reopen|reload}\n", argv[0]);
    return -1;
  } else if(!strcmp(argv[1],"start")) sig = NULL;
  else if(!strcmp(argv[1],"stop") || !strcmp(argv[1],"quit") || !strcmp(argv[1],"reopen") || !strcmp(argv[1],"reload")) sig = argv[1];
  else goto usage;
  if(setgroups(0,NULL)<0 || setgid(0)<0 || setuid(0)<0) {
    fprintf(stderr, "failed to set superuser, error %d (%s)\n", errno, strerror(errno));
    return -1;
  }
  args[0] = NGINX_BIN;
  if(!sig) args[1] = NULL;
  else { args[1] = "-s"; args[2] = sig; args[3] = NULL; }
  envp[0] = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
  envp[1] = NULL;
  execve(args[0], args, envp);
  fprintf(stderr, "exec(%s) error %d (%s)\n", args[0], errno, strerror(errno));
  return -1;
}
Пути в define в начале ставишь те которые у тебя, но учти: в случае запуска nginx от рута конфиг тоже должен лежать у рута (т.е. например в /etc), иначе ты создашь очень плохую уязвимость по незапланированному повышению привилегий.

Компилируешь её и кладёшь на место (от рута):

gcc -Wall -o /usr/local/bin/nginx-runner nginx-runner.c
chgrp группа_твоего_юзера /usr/local/bin/nginx-runner
chmod 4750 /usr/local/bin/nginx-runner
После этого твой юзер может запускать
nginx-runner (запустить nginx)
nginx-runner start (запустить nginx)
nginx-runner stop (остановить nginx)
nginx-runner reload
nginx-runner reopen
nginx-runner quit

Исправление firkax, :

Или ещё вариант как оставить nginx под рутом, выдать права его перезапускать, и не пользоваться не понравившимся тебе sudo (мне он тоже не нравится).

Пишешь прогу например nginx-runner.c

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <grp.h>

!!! тут заменяешь пути на другие если у тебя другие
#define NGINX_BIN "/usr/sbin/nginx"
#define NGINX_CONF "/etc/nginx/nginx.conf"

int main(int argc, char **argv) {
  char *args[10], *envp[10], *sig;
  if(argc==1) sig = NULL;
  else if(argc!=2) { usage:
    fprintf(stderr, "Usage: %s [start|stop|quit|reopen|reload}\n", argv[0]);
    return -1;
  } else if(!strcmp(argv[1],"start")) sig = NULL;
  else if(!strcmp(argv[1],"stop") || !strcmp(argv[1],"quit") || !strcmp(argv[1],"reopen") || !strcmp(argv[1],"reload")) sig = argv[1];
  else goto usage;
  if(setgroups(0,NULL)<0 || setgid(0)<0 || setuid(0)<0) {
    fprintf(stderr, "failed to set superuser, error %d (%s)\n", errno, strerror(errno));
    return -1;
  }
  args[0] = NGINX_BIN;
  if(!sig) args[1] = NULL;
  else { args[1] = "-s"; args[2] = sig; args[3] = NULL; }
  envp[0] = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
  envp[1] = NULL;
  execve(args[0], args, envp);
  fprintf(stderr, "exec(%s) error %d (%s)\n", args[0], errno, strerror(errno));
  return -1;
}
Компилируешь её и кладёшь на место (от рута):
gcc -Wall -o /usr/local/bin/nginx-runner nginx-runner.c
chgrp группа_твоего_юзера /usr/local/bin/nginx-runner
chmod 4750 /usr/local/bin/nginx-runner
После этого твой юзер может запускать
nginx-runner (запустить nginx)
nginx-runner start (запустить nginx)
nginx-runner stop (остановить nginx)
nginx-runner reload
nginx-runner reopen
nginx-runner quit

Исходная версия firkax, :

Или ещё вариант как оставить nginx под рутом, выдать права его перезапускать, и не пользоваться не понравившимся тебе sudo (мне он тоже не нравится).

Пишешь прогу например nginx-runner.c

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <grp.h>

#define NGINX_BIN "/usr/sbin/nginx"
#define NGINX_CONF "/etc/nginx/nginx.conf"

int main(int argc, char **argv) {
  char *args[10], *envp[10], *sig;
  if(argc==1) sig = NULL;
  else if(argc!=2) { usage:
    fprintf(stderr, "Usage: %s [start|stop|quit|reopen|reload}\n", argv[0]);
    return -1;
  } else if(!strcmp(argv[1],"start")) sig = NULL;
  else if(!strcmp(argv[1],"stop") || !strcmp(argv[1],"quit") || !strcmp(argv[1],"reopen") || !strcmp(argv[1],"reload")) sig = argv[1];
  else goto usage;
  if(setgroups(0,NULL)<0 || setgid(0)<0 || setuid(0)<0) {
    fprintf(stderr, "failed to set superuser, error %d (%s)\n", errno, strerror(errno));
    return -1;
  }
  args[0] = NGINX_BIN;
  if(!sig) args[1] = NULL;
  else { args[1] = "-s"; args[2] = sig; args[3] = NULL; }
  envp[0] = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
  envp[1] = NULL;
  execve(args[0], args, envp);
  fprintf(stderr, "exec(%s) error %d (%s)\n", args[0], errno, strerror(errno));
  return -1;
}
Компилируешь её и кладёшь на место (от рута):
gcc -Wall -o /usr/local/bin/nginx-runner nginx-runner.c
chgrp группа_твоего-юзера /usr/local/bin/nginx-runner
chmod 4750 /usr/local/bin/nginx-runner
После этого твой юзер может запускать
nginx-runner (запустить nginx)
nginx-runner start (запустить nginx)
nginx-runner stop (остановить nginx)
nginx-runner reload
nginx-runner reopen
nginx-runner quit