Переменная среды для команды, названной через хороший

Зависит от того, что точно Вы делаете, но Ваши опции:

  • Сделайте пользователя способным запустить программу как другого пользователя. Можно сделать это через sudo, или через setuid на исполняемом файле. Остерегайтесь этого с любым из них, вещи кроме .bashrc пользователя смогут запустить программу. (Отметьте: и sudo и setuid могут быть пользователями кроме корня и должны быть если возможны),
  • Имейте систему входа в систему, вызывают процесс (как корень) прежде на самом деле закончить пользовательский вход в систему. Преимущество здесь состоит в том, что Вы не даете разрешений пользователю, и пользователь не сможет обойти его (через, например, редактируя или удаляя .bashrc, или переключая оболочки, или...). Один путь, кажется, pam_exec сцепляться в PAM. Ваш исполняемый файл должен отбросить полномочия пользователя root, если это возможно.
2
25.01.2014, 01:05
3 ответа

Попробуйте это

( export a=20; nice -n 10 sh -c 'echo $a' )
1
27.01.2020, 21:57
  • 1
    Это разворачивает переменную в списке аргументов (который является тем, что пример OP пытается сделать), но это не передает его в среде (который является тем, что просит вопрос.) –  alexis 24.01.2014, 17:47
JIM=x
JIM=20 nice -n 10 echo $JIM

действительно передает JIM=20 переменная среды к nice, но это не nice ни echo это расширяется $JIM, это - оболочка.

Оболочка разветвляет процесс и выполняется:

execve("/usr/bin/nice", ["nice", "-n", "10", "echo", "x"], ["JIM=20", other vars])

nice устанавливает правильность и затем выполняется в том же процессе:

execve("/bin/echo", ["echo", "x"], ["JIM=20", other vars])

Так echo действительно получает JIM=20 в его среде, но echo ничего не делает с его средой.

Вы работали:

JIM=20 nice -n 10 sh -c 'echo $JIM'

Затем sh сделал бы что-то с той переменной среды. Оболочки отображают переменные среды, которые они получают для окружения переменных. Таким образом выше, это sh установил бы $JIM переменная к 20 и названный echo встроенный с 20 как аргумент.

4
27.01.2020, 21:57

В моем конкретном случае я закончил тем, что сделал сам сценарий renice, примерно так:

JIM=20 sh -c 'renice -n +15 -p $$; echo ${JIM}'
0
27.01.2020, 21:57

Теги

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