
Я подключаюсь к своей машине по ssh, а затем, чтобы выполнить некоторые команды, мне нужно sudo bash
сначала .
Если в интерактивном терминальном сеансе я сделаю следующее:
[vagrant@33 ~]$ sudo bash
[root@33 vagrant]# which bundle
/opt/upnxt/rbenv-0.4.0-7/shims/bundle
все работает. Но если мне нужно сделать это в одну строку:
[vagrant@33 ~]$ sudo bash -c "whoami; which bundle"
root
which: no bundle in (/sbin:/bin:/usr/sbin:/usr/bin)
вещи перестают работать. Почему это происходит и что мне еще нужно сделать со вторым сценарием, чтобы запустить его так же, как первый?
решение1
Когда вы вызываете, sudo bash
вы запускаете новый экземпляр bash с user root environment
. Но если вы вызываете, sudo bash -c "whoami; which bundle"
среда остается такой же, как и для вашего пользователя. Если вы не собираетесь этого делать, вы можете изменить последний вызов с помощью sudo
опций-i
-я,--авторизоваться
Запустите оболочку, указанную в записи базы данных паролей целевого пользователя, как оболочку входа. Это означает, что файлы ресурсов, специфичные для входа, такие как.профильили.авторизоватьсябудет прочитана оболочкой. Если указана команда, она передается оболочке для выполнения через ее-сопция. Если команда не указана, выполняется интерактивная оболочка. судопытается перейти в домашний каталог этого пользователя перед запуском оболочки. Команда запускается в среде, похожей на ту, которую пользователь получит при входе в систему.Командная средараздел вsudoers(5) В руководстве описывается, как параметр -i влияет на среду, в которой выполняется команда, когда используется политика sudoers.