Системные вызовы Perl при запуске от имени другого пользователя с использованием sudo - PullRequest
2 голосов
/ 16 марта 2012

Я разработал Perl-скрипт, который обеспечивает функциональность на основе меню, позволяющую пользователям выполнять некоторые простые задачи.

Мне нужно, чтобы пользователи могли выполнять такие задачи, как копирование файлов (сохранение текущей даты и разрешений), запуск других программ (например, less или vi) от имени другого пользователя.Скрипт использует много функций system ().Я хочу, чтобы пользователи запускали меню, вызывая:

sudo -u perluser /usr/bin/perl /data/perlscripts/scripta.pl

Это должно запустить скрипт как пользователь perl, что он делает, а затем выполнять различные задачи в зависимости от того, что выберет пользователь.Проблема заключается в том, что всякий раз, когда я использую системный вызов, такой как

system("clear");

, я получаю следующую ошибку

Can't exec "clear": Permission denied at /data/perlscripts/scripta.pl line 3

Если я запускаю скрипт, войдя в систему как perluser, то все это выполняется успешно.

Есть ли способ заставить это работать?Я не хочу, чтобы пользователи могли входить в систему как привилегированный пользователь, поскольку мне нужно контролировать, что они могут запускать.Я также не хочу запускать такие команды, как

system("sudo -u perluser clear");

, поскольку тогда мне потребовалась бы другая команда для настройки всех команд sudo, которые я хотел запустить (что они, вероятно, откажутся выполнять), и этоне будет масштабируемым, если мне придется добавить дополнительные команды в какой-то момент.

Спасибо,

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Я думаю, что вам, вероятно, нужно добавить опцию -i ("имитировать начальный вход в систему") к sudo:

sudo -i -u perluser /usr/bin/perl /data/perlscripts/scripta.pl

Это обеспечит, что .profile или .login или еще много чегозапустить правильно, и, следовательно, $PATH настроен правильно и так далее.Это будет почти во всех отношениях, как если бы perluser действительно входил в систему и выполнял /usr/bin/perl /data/perlscripts/scripta.pl в оболочке.

0 голосов
/ 16 марта 2012

Я знаю, что это немного другой подход, но не могли бы вы установить для оболочки perluser значение /data/perlscripts/scripta.pl? Это позволит избежать головной боли, обычно связанной с конфигурацией sudo, если у вас несколько компьютеров. Конечный пользователь просто использовал бы login perluser вместо sudo. Когда вы закроете сценарий, сеанс входа прекратится. Нет необходимости предоставлять больше тюрьмы, чем это право?

Альтернативный (и, возможно, правильный) ответ

Я думаю, что корень проблемы в том, что Perl exec не в большинстве случаев использует оболочку. Это означает, что "clear" не имеет смысла, поскольку оболочка - это то, что осуществляет поиск по $PATH для поиска команды. Вот соответствующий perldoc от system. Обратите внимание на акцент.

o system LIST

o ПЕРЕЧЕНЬ ПРОГРАММ системы

Действует точно так же, как exec LIST , за исключением того, что сначала выполняется форк, и родительский процесс ожидает завершения дочернего процесса. Обратите внимание, что обработка аргументов варьируется в зависимости от количества аргументов. Если в LIST имеется более одного аргумента или если LIST является массивом с более чем одним значением, запускается программа, заданная первым элементом списка, с аргументами, заданными остальной частью списка. Если есть только один скалярный аргумент, этот аргумент проверяется на наличие метасимволов оболочки, и если они есть, весь аргумент передается в системную командную оболочку для анализа (это /bin/sh -c на платформах Unix, но зависит от другие платформы). Если в аргументе нет метасимволов оболочки, он разбивается на слова и передается непосредственно в execvp , что более эффективно.

Попробуйте изменить system("clear") на system("/usr/bin/clear") или system("clear;").

...