Як я можу отримати команди sudo для використання налаштувань у /root/.bashrc


9

Я налаштував .bashrcдекілька псевдонімів, зокрема llіexport LS_OPTIONS='--color=auto'

На жаль, це не працює при використанні sudo, тому я також змінив /root/.bashrc, але це, мабуть, не мало значення.

sudo envпоказує HOME=/rootіSHELL=/bin/bash

Як я можу отримати sudoкоманди для використання налаштувань /root/.bashrc?

Я розумію, що це відбувається лише тоді, коли bashвиконується інтерактивно, тому я відкритий для будь-яких інших пропозицій щодо налаштування.


@ daniel-gelling - Я завжди відчував, що це Q проблема XY - meta.stackexchange.com/questions/66377/what-is-the-xy-problem . У заголовку випливає, що вони хочуть нічого, /root/.bashrcале насправді те, що йде Q, - це псевдоніми цього файлу - цього неможливо - unix.stackexchange.com/questions/1496/… .
slm

@slm Те , що я після додавання методу до Bashrc - як я зробив в моєму особистому файлі .bashrc, а також файл .bashrc для кореня до «відключити» в -rопції для crontab: crontab () { [[ $@ =~ -[iel]*r ]] && echo '"r" not allowed' || command crontab "$@" ;}. Це працює при вході в систему як будь-який користувач, проте коли я sudo crontab -rйого виконую, все ще виконується.
Даніель Гелінг

@DanielGelling - подивіться, чи працює моя відповідь для вас.
slm

Відповіді:


6

sudoвиконує виконувану, а не командну оболонку. Тож про псевдоніми він не знає. Якщо ви біжите sudo ls, це так sudo /bin/ls, він не використовує жодного lsпсевдоніма, який у вас може бути.

Ви можете викликати sudo lsрозширення псевдоніму, помістивши у своє .bashrc:

alias sudo='sudo '

Зверніть увагу на пробіл - що сповіщає оболонку продовжувати розширення псевдоніму зі словом, яке надається після sudo. Будьте уважні, що розширення псевдонімів після судо не завжди може бути хорошою ідеєю, це залежить від того, які у вас псевдоніми є.

Крім того, sudo видаляє більшість змінних із середовища. Це не вплине на псевдонім на зразок alias ls='ls $LS_OPTIONS', тому що це змінна оболонки, використовувана оболонкою, коли вона розширює команду (і експортує її з .bashrcне слугує мети). Але це вплине на змінні, які використовуються командою, такі як LS_COLORS. Ви можете налаштувати sudo для збереження певних змінних середовища, відредагувавши його конфігурацію: запустіть visudoта додайте рядок

Defaults env_keep += "LS_COLORS"

За допомогою цих налаштувань sudo llподарує кольори, до яких ви звикли.

Крім того, можна запустити кореневу оболонку за допомогою sudo -s. Ця оболонка завантажить файл конфігурації ( ~/.bashrcдля bash). Залежно від налаштування sudo, це може бути HOMEвстановлено у вашому домашньому каталозі чи змінити його на /root. Ви можете змусити домашній каталог встановити на root sudo -Hs; навпаки, щоб зберегти початковий домашній каталог, запустіть sudo env HOME="$HOME" bash.


3

Дякую тим, хто відповів, хто спонукав мене man sudoуважніше читати .

sudo -s Якщо команда не вказана, виконується інтерактивна оболонка.

Ця інтерактивна оболонка використовує /root/.bashrcі, таким чином, включає мої налаштування.

Це вимагає введення команди окремо, але це нормально.


2

Фон

Я завжди відчував, що це питання є проблемою XY . У заголовку випливає, що вони хочуть нічого, /root/.bashrcале насправді те, що виникає питання, - це псевдоніми цього файлу - це, як вважається, неможливо за цим - Чому мій сценарій Баша не визнає псевдоніми? .

В основному, за задумом, ваші псевдоніми не будуть підхоплені sudoв інших місцях, оскільки вони не є портативними, і це моя думка щодо них.

Все, що знаходиться в середовищі користувача, не повинно сприйматися сценаріями та будь-яким програмним забезпеченням, яке може працювати в заданому полі. Але я усвідомлюю, що існують сценарії, в яких у певному обліковому записі користувача можуть бути псевдоніми, $HOME/.bashrcякі інші можуть захотіти використовувати в інтерактивних сценаріях.

З цією метою ви можете просто сказати інтерпретатору Bash розширити будь-які псевдоніми, які він знайде в процесі входу за межі звичайної поведінки оболонки, на яку ви стикаєтесь при використанні sudo.

Приклад

Налаштування

Щоб налаштувати речі, я додав такі псевдоніми, змінні середовища та функції до мого кореневого користувача /root/.bashrcта /root/.bash_profileфайлів.

$ grep smurf ~/.bashrc
alias brc_smurf='echo "ran alias from /root/.bashrc"'
export brc_smurf_env='var from /root/.bashrc'
bpf_smurf_func() { echo 'ran func from /root/.bash_profile'; }

$ grep smurf ~/.bash_profile
alias bpf_smurf='echo "ran alias from /root/.bash_profile"'
export bpf_smurf_env='var from /root/.bash_profile'
brc_smurf_func() { echo 'ran func from /root/.bashrc'; }

Не роблячи нічого, нічого з цієї роботи (не сюрпризів):

$ sudo brc_smurf
sudo: brc_smurf: command not found

$ sudo bpf_smurf
sudo: bpf_smurf: command not found

Ми бачимо, що aliasкоманда не показує псевдонімів при запуску в sudo:

$ sudo alias
$

Така поведінка - ваш натяк, що ви не повинні очікувати, що псевдоніми будуть доступними. Але ми продовжуємо ...

Крок №1 - псевдоніми видно

Якщо ми запустимо, bash -ciми можемо спонукати Bash хоча б прочитати наше $HOME/.bashrc:

$ sudo bash -ci 'alias' | grep smurf
alias brc_smurf='echo "ran alias from /root/.bashrc"'

Круто, то, може, ми можемо це запустити?

$ sudo bash -ci 'alias; brc_smurf'
bash: alias; brc_smurf: No such file or directory

Крок №2 - shopt -s expand_aliases

Ні. Знову ж таки, це дизайн, ми робимо те, чого не вважаємо робити, тому існує ряд "безпек", які ми повинні відключити. інша "безпека" - Баш.

$ sudo bash -ci 'shopt -s expand_aliases; alias; brc_smurf'
alias brc_smurf='echo "ran alias from /root/.bashrc"'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
ran alias from /root/.bashrc

Тут ми можемо побачити наше повідомлення /root/.bashrc, ми успішно виконали псевдонім користувача root brc_smurf.

Крок №3 - а що з env vars?

Якщо ви використовуєте метод, показаний вище, тепер вони також повинні працювати.

$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env'
ran alias from /root/.bashrc
var from /root/.bashrc

Крок №4 - як щодо функцій?

Ці роботи теж, як очікувалося:

$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env;brc_smurf_func'
ran alias from /root/.bashrc
var from /root/.bashrc
ran func from /root/.bashrc

TLDR;

Це можна зробити, щоб отримати доступ до змінних оточуючих середовищ + псевдонімів /root/.bashrc:

$ sudo bash -ci 'shopt -s expand_aliases; <cmds>'

Відволікайте

Цей метод дозволяє вміст /root/.bashrc, він не підбирає вміст /root/.bash_profile.

Список літератури


Так, хоча між ними є незначні відмінності, не будемо тут детально розбиратись ;-). У будь-якому випадку, чи можете ви допомогти мені у ситуації, про яку я говорив у коментарях до питання: використання функцій у .bashrcсудо; зокрема видалення -rпараметра crontab?
Даніель Гелінг

Гаразд, але це означатиме, що мені доведеться бігати: sudo bash -ci 'alias; shopt -s expand_aliases; echo $brc_smurf_env'замість простого sudo echo $brc_smurf_env?
Даніель Гелінг

Ви можете видалити alias, що було просто для того, щоб показати їх, вам потрібно було б зробитиsudo bash -ci 'shopt -s expand_aliases; <cmds>'
slm

Це було б багато набору, щоб просто відредагувати мій crontab для root. Дозвольте створити псевдонім для цього :-P
Daniel Gelling

@DanielGelling - так, ласкаво просимо до всіх веселощів в нутрі оболонки.
slm

0

У файлі / etc / sudoers є спеціально налаштування або налаштування середовища для виконання команд sudo (наприклад, переконайтеся, що PATH має лише надійні місця), але залежно від того, що ви сподіваєтеся вийти з цього. ви, можливо, не зможете робити те, що вам потрібно, якщо це передбачає виконання фактичних команд в оболонці для налаштування середовища. Sudoing спеціально не дає вам оболонки для входу в корінь, тому вона не налаштує звичайний профіль для вас.


0

Скажемо, що ми редагуємо /root/.bashrc таким чином:

$ sudo su -
Password: ******
# cat ~/.bashrc

echo "root bashrc file was read"
PATH=~/bin:$PATH
echo "$PATH"
export USERVAR=set
echo "$USERVAR"

umask 022
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'

Дозволяє вийти з системи та увійти знову, щоб bash прочитав файл:

# exit
$ sudo su -
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@here:~# alias l
alias l='ls $LS_OPTIONS -lA'
root@here:~# 

Як бачите, файл був прочитаний, PATH змінено і псевдоніми встановлені. Все є функціональним за вашим запитом.

Однак судо все одно не буде працювати так, як ви очікували.

root@here:~# exit
$ sudo env | grep USERVAR              # no output 
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

PATH не змінився. Можливо, існують способи змінити шлях у судорах, але я настійно рекомендую вам уникати цього. І все одно, псевдоніми, функції та деякі інші зміни все ще не застосовуватимуться, змінивши лише ПАТ. Файл потрібно знайти. Виконуючи це, кожен сценарій або команда попросить комп'ютер виконати більше роботи без реальної вигоди. Сценарій не використовує псевдоніми (немає практичного використання для них всередині скриптів).

Отже, просто увійдіть, .bashrcфайл завантажиться автоматично та приступить до роботи.

Ви можете почати баш так:

$ sudo bash
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@mail:/home/isaac/me/temp/clocks-master#

Але, як ви бачите вище, pwd (робочий каталог) не змінився, і, якщо ви ознайомитесь трохи більше, деякі інші налаштування також не змінилися. Ось чому правильною командою є використання:

$ sudo su -

Якщо ця команда занадто довга для введення, створіть псевдонім або функцію у користувача (а не root), де ця команда буде використовуватися, щось на зразок:

$ alias mysu='sudo su -'
$ mysu
# 

0

TL; DR: Ви можете використовувати sudo -iдля запуску визначеної функції/root/.bashrc (але не псевдонім), а також мати доступ до змінних, експортованих з цього файлу:

аргументи команди sudo -i 

Псевдоніми там не працюють, але ви можете легко перетворити їх у функції, якщо хочете зробити їх доступними sudo -i.

Читайте далі для повного аналізу та більш детальної інформації.


Тут є кілька проблем, деякі в тому, як працює судо, а деякі - як працює сам баш ...

За замовчуванням sudoбуде шукати лише команди та обійде оболонку, тому просто запуск sudo llпрацюватиме лише за наявності llвиконуваного файлу в одному з каталогів у $PATH. Отже, для використання псевдонімів (або функцій) вам потрібно переконатися, що оболонка викликається як частина процесу.

Один із способів - запустити щось на кшталт sudo shабо sudo bash, хоча сучасний sudo(я тестую це на sudo 1.8.19p1), є варіанти -sі -iдля цього.

Отож, одна спроба була б чимось на кшталт sudo -s ll(що еквівалентно sudo bash -c 'll', якщо припустити, що це Ваш $SHELLBash, що, здається, випадок на основі rcfileзгаданих вами згаданих вами.) Але це також не працює, оскільки він запускає оболонку в неінтерактивний, режим без входу, який не читає жодного з його запуску файлів. Це по суті те саме, що якщо ви пишете скрипт оболонки і використовуєте #!/bin/bashдля його запуску. Псевдоніми (і функції), які ви маєте у своєму ~/.bashrc, не будуть доступні з цього сценарію ...

Отже, наступний -iваріант, який створює оболонку входу. Це більш перспективно, оскільки воно буде читати ваші файли запуску! І все ж sudo -i ll(рівнозначно sudo bash -l -c 'll') все одно не вийде. Так як це можливо, враховуючи , що було прочитати визначення llпсевдоніма?

Ну, наступне пояснення тут полягає в тому, що за замовчуванням bash не розширюватиме псевдоніми, за винятком випадків, коли оболонка інтерактивна ... Ця оболонка, запущена sudo -i(або bash -l), є оболонкою для входу , але все ще не є інтерактивною.

Наступним кроком є ​​отримання інтерактивної оболонки, яка потім працює :

sudo bash -i -c 'll'

( Зрозуміло, що вхід і інтерактив також непогано, звичайно, bash -l -i -c ...спрацюють.)

Інша альтернатива - продовжувати використовувати оболонку для входу (неінтерактивну), але попросіть її прямо розширити псевдоніми, щоб це також спрацювало:

sudo bash -l -O expand_aliases -c 'll'

(У випадку, коли bash був інтерактивним , не потрібна оболонка для входу , оскільки цього достатньо, щоб прочитати файли ініціалізації, але цей повинен -lїх прочитати.)

Це досить довгі командні рядки ... І вони також вимагають, щоб ви цитували всю команду оболонки, тому, якщо ви називаєте псевдонім з аргументами, вам доведеться все це перетворити на рядок ... Так що це незграбний у використанні ...

Зауважте, що раніше я говорив про псевдоніми та функції ... Це було навмисно, оскільки функції насправді набагато зручніші. Вам не потрібно нічого особливого (наприклад, мати інтерактивну оболонку або встановити певний параметр) для виконання функцій на оболонці, доки ви не знайдете їх визначення.

Таким чином , якщо ви визначили llяк функцію замість псевдоніма, ви зможете використовувати його безпосередньо SUDO в -iярлику:

sudo -i ll

І якщо у вас є довший командний рядок з аргументами, ви можете також передати їх безпосередньо тут:

sudo -i ll -C -R /etc

(Порівняти sudo bash -i -c 'll -C -R /etc'.)

Функції також набагато гнучкіші і зазвичай простіші в обслуговуванні ... Перетворювати псевдонім у функцію зазвичай просто, єдиний застереження - завжди використовувати "$@"там, де ви очікуєте, що зайві аргументи будуть прийняті (як правило, наприкінці псевдонім.)

Наприклад, цей псевдонім:

alias ll='ls $LS_OPTIONS -l'

Не вдалося перетворити цю функцію:

ll () {
    ls $LS_OPTIONS -l "$@"
}

Вони для більшості цілей рівнозначні. І, як згадувалося раніше, функція повинна бути доступна безпосередньо з sudo -i, так що це додатковий бонус.

Сподіваюся, ви знайдете цю відповідь та пояснення корисними!


DV - Я не відчуваю, що це вже покращує ситуацію, ніж те, що вже є.
slm

1
@slm я думаю , що моя відповідь що - то додати, так як немає відповіді на попереднє запитання не згадав форму , sudo -i command argumentsщоб мати можливість запускати функції з /root/.bashrcі мають експортовані змінні доступні. Але я бачу, як моя відповідь була, мабуть, занадто довгою, і ця інформація була дещо закопана там… Тож я додав TL; DR, щоб узагальнити її (зберігаючи технічні деталі розслідування навколо). Будь ласка, погляньте ще раз.
filbranden
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.