как передать переменную окружения в sudo su

Просто мои 2 цента...

Это более чем правда, что вращение дисков уменьшает срок их службы. Многолетний опыт показывает, что запуск и остановка двигателя диска вызывает гораздо большее утомление, чем круглосуточное вращение. На всех моих дисках с большим количеством запусков/остановок есть перераспределенные сектора, и все мои диски, которые вращаются 10 лет 24/7, (хотите верьте, хотите нет) как новенькие. В конце концов, диски созданы для вращения, а не для простоя, поэтому если для вас приоритетнее усталость, а не энергопотребление, смело ставьте диски на круглосуточное вращение.

У меня есть внешний диск на 2 ТБ, который отключается после 30 минут бездействия. Диск должен быть включен 24 часа в сутки 7 дней в неделю для резервного копирования и в качестве небольшого NAS, подключенного к Orange PI.

Я использовал следующее правило udev в

/etc/udev/rules.d

(Оно никогда не работало, так как отключение вращения находится в прошивке диска)

SUBSYSTEM=="usb", TEST=="power/autosuspend" ATTR{power/autosuspend}="-1"

Хотя диск поддерживает

hdparm -B

Я написал небольшой процесс демона, который может запускаться во время загрузки в

/etc/rc.local

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

Параметры командной строки: целевой каталог для записи awake.log и (опционально) временная задержка (по умолчанию 300)

например,

/usr/sbin/disk_awake /mnt/some_disk/keep_alive 30

код:

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

int main(int argc, char* argv[])
{
FILE *fp=NULL;
pid_t process_id=0;
pid_t sid=0;
int secs=300;
char log_file[512];
time_t raw_time;
struct tm *time_info;
int ticks=0;
unsigned long step=1;

if (argc<2||argc>3)
{
 printf("Usage: %s target_directory [seconds]\n",argv[0]);
 exit(1);
}
if (strlen(argv[1])>500)
{
 printf("String length of target_directory is HUGE!\n");
 exit(1);
}
if (chdir(argv[1])<0)
{
 printf("Directory %s does not exist\n",argv[1]);
 exit(1);
}
strcpy(log_file,argv[1]);
strcat(log_file,"/awake.log");
if (!(fp=fopen(log_file,"w+")))
{
 printf("Could not open log file %s\n",log_file);
 exit(1);
}
if (!(argv[2]))
{
 printf("Delay argument not specified. Defaulting to 300 seconds\n");
 secs=300;
}
if (argv[2]&&(secs=atoi(argv[2]))<=0)
{
 printf("Could not parse delay option. Defaulting to 300 seconds\n");
 secs=300;
}
printf("Delay interval %d seconds\n",secs);
process_id=fork();
if (process_id<0)
{
printf("Could not fork()\n");
exit(1);
}
if (process_id>0)
{
printf("Started with pid %d\n", process_id);
exit(0);
}
umask(0);
sid=setsid();
if(sid<0)
{
printf("Could not setsid()\n");
exit(1);
}
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
while (1)
{
if (ticks==10)
{
 fclose(fp);
 if (!(fp=fopen(log_file,"w+"))) exit(1);
 ticks=0;step++;
}
time(&raw_time);
time_info=localtime(&raw_time);
fprintf(fp,"%s %lu : %s","Step",step,asctime(time_info));
fflush(fp);
ticks++;
sleep(secs);
}
fclose(fp);
return(0);
}
32
18.09.2016, 19:19
1 ответ

Lo que sigue es una solución que no necesita cambiar la política de seguridad.

Ignoraré la parte su, ya que podemos usar la opción --userde sudo.

Queremos pasar variables de entorno a un commandejecutado a través de sudo. Sin embargo, sudono permitirá que las variables de entorno se pasen a un comando (. Hay una razón de seguridad válida para esto, algunas variables pueden ser peligrosas ). Se puede usar un shell para establecer variables de entorno, y sudopuede ejecutar un shell con un script que se le pasa. Por lo tanto, dígale a sudoque ejecute un script que establezca las variables de entorno.

var_a=someThing
var_b=someOtherThing

sudo bash -c "
    export var_a=\"${var_a}\"
    export var_b=\"${var_b}\"

    the_command some_args
"
0
27.01.2020, 19:37

Теги

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