Мне пришлось сделать грязный Linux-хак для кого-то, чтобы они могли запустить принтер с помощью команды оболочки cupsenable printername
, будучи пользователем без полномочий root. Я не хотел, чтобы они могли использовать весь синтаксис cupsenable
как root, поэтому я просто написал оболочку C, которая санирует входной файл argv[1]
и вызывает system("cupsenable sanitizedprintername")
.Зачем нужна setuid (0) в программе C-set set-root, которая вызывает административную программу с системой()?
Я сделал программу setuid root, но даже в этом случае cupsenable
потерпел неудачу с «разрешением отказано». Затем я вставил вызов setuid(0)
до system()
и, вот и все, сработало.
Не обращайте внимания на то, что существует лучший способ предоставить пользователям контроль над принтером. Вероятно, есть лучший способ. Меня интересуют тонкости chmod u+s
против setuid(0)
против system()
. Почему это так?
Whoa. Ну, я сказал, что это грязно. Кажется, что я сделал, это убедить процесс bash, порожденный system(), что я на самом деле, действительно, честно был root, клянусь Богом. Кажется, что некоторые рефакторинги в порядке. – JCCyC