С помощью zsh
, если запустить как root
и вы установите
EUID=1000
Он установит евид равным 1000. Реальный uid все равно будет установлен в 0, так что вы можете вернуться к EUID 0. Любая программа, которую вы запустите, также сможет получить привилегии, выполнив setuid()
, но если целью является предотвращение непреднамеренного повреждения, а не защита от вредоносных программ, то этого должно быть достаточно.
#! /bin/zsh -
GID=1000 # optional
EUID=1000 # drop *effective* privileges
some-potentially-harmful-command-that-doesnt-need-superuser
and-another
EUID=0 some-command-that-needs-superuser
more-non-privileged-commands
EUID=0 UID=1000 # now drop privileges with no coming back
# alternatively:
# USERNAME=stephane # sets uid, gid, supplementary groups... based on the user db
Обратите внимание, что вы можете установить EUID/UID... на время выполнения команды с помощью
UID=1000 the-command
, но не с помощью UID
или USERNAME
, если строится команда
или функция, так как zsh
не будет вилкировать другой процесс, поэтому не сможет восстановить реальный пользовательский идентификатор.
Вы также можете установить EUID
/UID
/USERNAME
в подоболочке с:
(EUID=0 USERNAME=stephane; untrusted-application)
(мы установили EUID равным 0, чтобы впоследствии иметь возможность переключать пользователя).
Я могу придумать две возможности:
Обычно вы запускаете сценарий bash из что-то вроде cron, где ваш скрипт профиля пользователя не запущен и не настроил $ PATH. В этом случае вы можете указать
system "/path/to/fastacmd ...
в скрипте perl, чтобы он не зависел от пути, или вы можете установить
$ENV{PATH}= "/my/custom/paths:$ENV{PATH}";
внутри скрипта perl, или вы можете исправить путь в скрипте bash, загрузив свой скрипты профиля:
source /etc/profile;
source ~/.profile;
source ~/.bash_profile;
Но другая возможность состоит в том, что #! / usr / bin / perl
, объявленный в вашем скрипте, не тот же perl, что и в вашем PATH. Вы можете проверить это, сказав
which perl
Например, если вы скажете ./ xREPredoTop.pl
, он станет
/usr/bin/perl -w ./xREPredoTop.pl
, но если вы скажете perl ./xREPredoTop.pl
, он может стать
/usr/local/bin/perl ./xREPredoTop.pl
и что один может быть настроен по-другому, так что он меняет путь.