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