запустите команду с помощью sudo, войдите в root (sudo -i) и запустите команду

Вопрос был бы

в чем именно разница между запуском этих двух команд.

Я как рут сделал кастомный env. Переменная

export A="abcdef"

затем в корневой оболочке

sudo -i
echo $A  

возвращается

abcdef (as expected)

Однако, когда я возвращаюсь к обычному пользователю и запускаю

sudo -i echo $A

он возвращает пустую строку.

Итак, когда вы запускаете команду sudo echo $ A, используются ли переменные среды и оболочка от обычного пользователя?

и есть ли способ получить abcdef, даже если я запустил sudo echo $ A?

Спасибо


РЕДАКТИРОВАТЬ 1

Когда вы говорите, что сделали переменную A как root, я предполагаю, что вы имеете в виду, что вы сделали это в root .profile или что-то в этом роде. -> (да!)


РЕДАКТИРОВАТЬ 2

В этом есть смысл, но есть некоторые проблемы.

Когда я делаю

sudo -i 'echo $A' 

Я получаю
-bash: echo $ A: команда не найдена.

Однако когда я это сделаю

su -c 'echo $A' 

это возвращает

abcdef

Что не так с

sudo -i 'echo $A' 

команда?


person user1566629    schedule 31.07.2012    source источник


Ответы (3)


Если вы хотите передать свою среду sudo, используйте sudo -E:

-E    The -E (preserve environment) option indicates to the
      security policy that the user wishes to preserve their
      existing environment variables.  The security policy may
      return an error if the -E option is specified and the user
      does not have permission to preserve the environment.

Среда сохраняется как в интерактивном режиме, так и во всем, что вы запускаете из командной строки.

person chmeee    schedule 31.07.2012
comment
Сэр, вы не знаете, насколько ваш комментарий помог бедному старику !! : P +10 - person Sunny R Gupta; 11.12.2013

Когда вы говорите, что создали переменную A как root, я предполагаю, что вы имеете в виду, что вы сделали это в корневом профиле или что-то в этом роде. И я предполагаю, что вы имеете в виду, что у обычного пользователя не установлено A. В этом случае применяется следующее:

Когда вы запускаете свою команду sudo -i echo $A, она сначала интерпретируется локальной оболочкой, а $A заменяется. В результате получается sudo -i echo, что и выполняется.

Вы имеете в виду следующее:

sudo -i 'echo $A'

Это передает echo $A оболочке sudo.

~ rnapier$ sudo -i echo $USER
rnapier
~ rnapier$ sudo -i 'echo $USER'
root

Попробуйте этот синтаксис:

sudo -i echo '$USER'
person Rob Napier    schedule 31.07.2012
comment
Да, ваше предположение верно, но проблема все еще есть. пожалуйста, обратитесь к редактированию. Спасибо. - person user1566629; 01.08.2012
comment
синтаксис sudo -i echo '$ USER' возвращает $ USER. просто к сведению, что это делается для пользователя без полномочий root. - person user1566629; 01.08.2012
comment
Если я попробую, sudo -i echo $ USER, он вернет huser, который является пользователем без полномочий root, который у меня есть (точно так же, как rnapier там) - person user1566629; 01.08.2012

Хотя мне не удалось воспроизвести результаты на своем компьютере, на странице руководства для sudo указано опция -i отключит / удалит несколько переменных.

man sudo

-i [команда]

Параметр -i (имитировать начальный вход в систему) запускает оболочку, указанную в записи passwd (5) целевого пользователя, как оболочку входа в систему. Это означает, что файлы ресурсов для входа в систему, такие как .profile или .login, будут прочитаны оболочкой. Если команда указана, она передается в оболочку для выполнения. В противном случае выполняется интерактивная оболочка. sudo пытается перейти в домашний каталог этого пользователя перед запуском оболочки. Он также инициализирует среду, оставляя DISPLAY и TERM неизменными, устанавливая HOME, MAIL, SHELL, USER, LOGNAME и PATH, а также содержимое / etc / environment в системах Linux и AIX. Все остальные переменные среды удаляются.

Поэтому я бы попробовал без опции -i.

person PopeJohnPaulII    schedule 31.07.2012