Как сделать скрипт доступным для пользователя root?
Обычный пользователь может запустить этот скрипт, но root не может его найти.
У меня есть простой скрипт, который я сохранил в ~/bin
, Я обновил .profile
файл для включения этой папки в PATH. Я могу зайти в терминал, работать в любом каталоге, ввести имя скрипта, и он работает нормально. Но если в этом терминале я переключаюсь на root, скрипт не может быть найден. Я предполагаю, что где-то есть файл, который требует нового обновления $PATH, но я не знаю, какой именно.
4 ответа
Если вы используете sudo
, что, вероятно, имеет место, есть политика безопасности, которая изменяет переменную среды $PATH на безопасный путь (определенный в файле / etc / sudoers). Каталог ~/bin не включен в набор по умолчанию secure_path в файле sudoers, поэтому выполняется sudo script
не сработает, но sudo ~/bin/script
было бы.
Вы можете поместить скрипт в одну из папок, определенных в файле конфигурации sudoers (например, / usr / local / bin), чтобы сделать его напрямую доступным. Secure_path также можно изменить в файле конфигурации, хотя это не рекомендуется.
Временно предотвратить sudo
от сброса вашего пути к secure_path
Для одной команды, без изменения какой-либо глобальной конфигурации, вы можете сделать:
sudo env PATH=$PATH command
куда command
это имя исполняемого файла, который вы хотите запустить, который находится в вашем PATH
,
Вы можете сделать псевдоним для этого и добавить свой собственный (не root) ~/.bashrc
... что-то вроде
alias sudo2='sudo env PATH=$PATH'
Тогда вы могли бы использовать sudo2 command
запустить исполняемый файл с sudo
используя свой собственный путь
Как уже говорили другие, привилегированная среда не такая, как у пользователя, и по веским причинам. В основном есть два решения: (i) вызывать ваши сценарии по их пути, или (ii) размещать ваши сценарии в корне и перемещать их выше в файловой иерархии (скажем, /usr/custom/bin, но все, что работает), затем обновлять ПУТЬ пользователя, а не пытаться сделать наоборот.
Почему скрипт не запускается при запуске root?
Вы должны проверить путь эффективного пользователя... в этом случае root
,
Запустите это:
(Первые две строки - это приглашения плюс команды. Последняя строка - это вывод команды.)
$ sudo su -
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
Рекомендации по размещению вашего скрипта для других пользователей:
Сделать подкаталог в разделе /opt
для вашего проекта и поместите там исполняемые скрипты вашего проекта. Это место, которое переживет новую установку ОС в том же разделе (конечно, за исключением форматирования).
Корневая область для ваших скриптов может быть в:
/opt/myprojectname/myscriptfiles/
Теперь вы можете связать свои скрипты /usr/local/bin/
с
$ sudo ln -s /opt/myprojectname/myscriptfile/myscript.sh /usr/local/bin/myscript.sh`
Вам не придется менять root
Переменная $PATH, потому что, как видно из теста выше, она уже есть.
Таким образом, вместо изменения корневого пути, вы можете изменить свой путь для поиска /opt/myprojectname/myscriptname
Кроме того, вы можете связать свой ~/bin/myscript.sh
в /usr/local/bin/myscript.sh
,