@ TomHunt указал на проблему в своем комментарии, и заслуживает похвалы за ответ. Я просто хотел расширить его точку зрения, чтобы будущие вопросы cron работы можно было решить легче.
Я предлагаю захватить текущую (функциональную) среду, а также среду сценария cron-задания, а затем сравнить их, чтобы увидеть, чего не хватает. Помните, что cron запускается во время загрузки и никогда не читает файлы среды личной оболочки (~/.bashrc, ~/.bash _ profile или что-либо другое, загруженное оттуда).
set | sort >/tmp/set.out
set | sort >/tmp/cron-set.out
в
сценарий оболочки задания cron diff/tmp/cron-set.out/tmp/set.out
set
сверху). Тюрьма chroot предотвращает прямой доступ к файлам вне chroot только тех процессов, которые выполняются в chroot. Это не мешает процессам в chroot получать доступ к вещам, отличным от файлов, таким как другие процессы (которые могут быть уничтожены и отслежены при работе с тем же пользователем), сети и т.д. Это также не мешает процессам в chroot использовать ошибки других процессов (например, программы setuid).
Chroot сам по себе не является большим средством защиты. Chroot обеспечивает безопасность только в сочетании с другими мерами; по крайней мере, любой процесс, выполняемый внутри тюрьмы, должен выполняться под другим идентификатором пользователя, чем любой процесс, выполняемый вне тюрьмы.
SELinux, если он настроен правильно (что может быть затруднено), обеспечивает изоляцию даже для процессов, запущенных как root. Chroot на самом деле избыточен как средство безопасности, если у вас есть SELinux - вы можете настроить SELinux, чтобы ограничить программу определенными каталогами - но это намного проще настроить правильно.
-121--97584- .bashrc
является файлом конфигурации bash, только когда он выполняется в интерактивном режиме. Загружается только при запуске bash, а не при запуске другой программы, например sh
(даже если bash вызывается через имя sh
). И загружается только когда bash интерактивный, а не когда он выполняет сценарий или команду с -c
.
sudo sh -c 'echo $ PATH'
или sudo bash -c 'echo $ PATH'
не вызывает интерактивную оболочку, поэтому .bashrc
не участвует.
судо су; echo $ PATH
запускает интерактивный экземпляр оболочки корня. Если это bash, то загружается ~ root/.bashrc
. Этот фрагмент выполняет echo $ PATH
после завершения этой интерактивной оболочки, поэтому все, что происходит в интерактивной оболочке, не влияет на то, что фрагмент печатается в конце. Но если ввести echo $ PATH
в подсказке интерактивной оболочки, запущенной sudo su
, появится значение, заданное ~ root/.bashrc
.
С тех пор .bashrc
вызывается в каждой интерактивной оболочке, а не оболочками входа (даже не оболочками интерактивного входа, что является дефектом конструкции в bash), это неправильное место для определения переменных среды. Используйте .bashrc
для интерактивных параметров настройки bash, таких как привязки ключей, псевдонимы и параметры настройки завершения. Набор переменные среды в файлах, загружаемых при входе в систему: ~/.pam _ environment
или ~/.profile
.
Установите PATH
в .profile
вместо .bashrc
и либо запустите оболочку входа с sudo -i 'echo $ PATH'
, либо явно укажите исходный .profile
с sudo sh -c '. ~/.profile; echo $ PATH '
.