Як пройти псевдонім через sudo


32

У мене є псевдонім, який передає в деяких параметрах інструмент, яким я часто користуюся. Іноді я біжу як сама, іноді під судо. На жаль, звичайно, судо не визнає псевдоніму.

Хтось має підказку, як пройти псевдонім через?

У цьому випадку у мене є купа варіантів для perl під час налагодження:

alias pd='perl -Ilib -I/home/myuser/lib -d'

Іноді мені доводиться налагоджувати свої інструменти як root, тому замість запуску:

pd ./mytool --some params

Мені потрібно запустити це під судо. Я перепробував багато способів:

sudo eval $(alias pd)\; pd ./mytool --some params
sudo $(alias pd)\; pd ./mytool --some params
sudo bash -c "$(alias pd)\; pd ./mytool --some params"
sudo bash -c "$(alias pd); pd ./mytool --some params"
sudo bash -c eval\ "$(alias pd)\; pd ./mytool --some params"
sudo bash -c eval\ "'$(alias pd)\; pd ./mytool --some params'"

Я сподівався на приємний, стислий спосіб забезпечити повне використання мого поточного псевдоніма pd (на випадок, якщо мені доведеться його переробити пізніше), хоча деякі мої спроби зовсім не були стислими. Моя остання можливість - це вкласти його в сценарій оболонки і помістити, що десь це судо зможе знайти. Але іноді псевдоніми дуже зручні, тому це в крайньому випадку.

Відповіді:


50

Дуже елегантне рішення може бути знайдено в Archlinux-Wiki:

alias sudo='sudo '
# whitespace ---^

працює для передачі всіх псевдонімів sudo.

Джерело: http://wiki.archlinux.org/index.php/Sudo#Passing_aliases


16
Це чудова хитрість! Для допитливих пояснення з розділу псевдоніму на баш-сторінці:A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded.
Рассел Девіс,

1
Це справді має бути прийнятою відповіддю.
Адріан Фрюхвірт

Соромно, що це не працює для функцій.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

2
Примітка: Припустимо , що ви дійсно повинні пройти опцію , щоб sudoзнову, в той час як бажання зберегти цей sudo-passthrough трюк в той же час. Навіть це можна зробити: знову використовувати параметри, використовувати \sudo. Нахил нахилу перекриє псевдонім. (Здається, багато хто про це не знає). Таким чином, ви можете ( небезпека! ) Навіть видаляти файли без будь-якого попередження, переосмислюючи alias rm='rm -i'загально вказане в .bash-aliases, просто ввівши \rm file-to-delete.
синтаксичний помилок

11

Мені не зрозуміло, що ти намагаєшся робити. Я бачу два способи:

Правильний шлях

alias pd='sudo perl -Ilib -I/home/myuser/lib -d'

Тоді виконання pd ./mytoolбуде виконувати вашу команду налагодження як root, але все ж збереже переваги sudo (аудиторський слід, не працює з кореневою оболонкою).

Приклад:

insyte $ alias sid = 'ідентифікатор судо'
insyte $ sid
uid = 0 (корінь) gid = 0 (корінь) групи = 0 (корінь)

Легкий шлях

Додайте псевдоніми до root .bashrcта використовуйте sudo -iщоразу, коли ви судо до root.

root # echo 'alias fb = "echo foo bar"' >> /root/.bashrc
root # вихід
Вхід
insyte $ sudo -i
корінь # fb
foo bar

4

Просто мати два псевдоніми і використовувати змінну

Я не бачу причини використання awkабо, cutякщо не потрібно, щоб один раз визначений псевдонім ядра, щоб полегшити його зміни. Якщо це так, то це працює:

# ... in .bashrc ...
pd='perl -Ilib -I/home/myuser/lib -d'
alias pd="$pd"
alias spd="sudo $pd"

Ось спрощена функція створення псевдонімічних пар, таких як вище:

mkap () {
    alias $1=$2
    alias s$1="sudo $2"
}

Використовувати:

mkap pd 'perl -Ilib -I/home/myuser/lib -d'
mkap ct 'cat'

Тепер у вас є pdі spdплюс, ctі sct.

$ ct /etc/shadow
cat: /etc/shadow: Permission denied
$ sct /etc/shadow
[sudo] password for dennis:
root:[censored]...
$ alias
alias ct='cat'
alias pd='perl -Ilib -I/home/myuser/lib -d'
alias sct='sudo cat'
alias spd='sudo perl -Ilib -I/home/myuser/lib -d'

4

Я б хотів, щоб я міг позначити дві відповіді як "правильні". Поєднуючи правильний шлях з гм, проникливий пост Insyte з рішенням awk (або вирізати) Білла Вайса , я придумав це:

alias spd="sudo $(alias pd | cut -d\' -f2)"

Тепер я просто перейду і вставлю це у функцію оболонки в моєму .bashrc або щось інше, а потім створять "s" версії всіх моїх псевдонімів, які я хочу запустити як root.

Оновлення : незначна модифікація спрощеної функції Денніса Вільямсона , щоб полегшити її використання:

 salias()
 {
   local a c
   a=$(echo "$1" | cut -f1 -d=)
   c=$(echo "$1" | cut -f2- -d=)
   alias $a="$c"
   alias s$a="sudo $c"
 }

Це означає, що я просто повинен поставити "s" перед усією командою. Замість:

alias pd='perl -Ilib -I/home/myuser/lib -d'

Я просто додаю s в передній частині.

salias pd='perl -Ilib -I/home/myuser/lib -d'

І я закінчив. Звичайно, комп’ютер робить трохи більше роботи, але для цього потрібен комп'ютер. :-)

Спасибі!


Ви можете (або повинні вміти) позначати речі прийнятими, це на зразок маркування їх правильними :)
Білл Вайс

Правильно - я хочу відзначити дві відповіді правильними :-P
Tanktalus

3
Чому б не відповісти Slizzered? alias sudo="sudo "працює ідеально.
trusktr


3

Чи не було б простіше просто зламати скрипт, що включає ваші параметри, а потім помістити його десь в одну з папок, що є шлях до регулярного облікового запису та root? Насправді сценарій не потребує великої кількості.

#!/bin/bash
exec perl -Ilib -I/home/myuser/lib -d $*

Це насправді має бути "$ @" замість $ *, і це частина причини, яку я, як правило, намагаюся уникати. ;-) Це працює, він просто витрачає купу дискового простору відносно того, що він містить.
Tanktalus

3

Це грубо, але воно працює тут:

houdini@clanspum:~/ > alias fb
fb='echo foo bar'
houdini@clanspum:~/ > alias fb | awk -F\' '{print $2}'
echo foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}')"
foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}') a b c"
foo bar a b c
houdini@clanspum:~/ > fb
foo bar
houdini@clanspum:~/ > fb a b c
foo bar a b c

Я вставив тут неповне рішення, потім відредагував, щоб виправити. Нинішня права. Безкоштовне звернення до першої особи з коментарями, що пояснює, що тут відбувається :)
Білл Вайс

Я сподівався на простіший спосіб, ніж awk, але сподіваюся! = Реальність іноді ;-) Мабуть, "cut -f2 -d \" "буде працювати так само добре, як awk, і бути таким крихітним трохи коротшим.
Tanktalus

Так, порізка спрацювала б, я про це завжди забуваю.
Білл Вайс

3

Додайте префікс "sudo" до вибраних псевдонімів і команд з вашого ~/.bashrcподібного:

#a regular alias
alias pd='perl -Ilib -I/home/myuser/lib -d'

#sudofy (command id, alias pd - add others to this list)
for cmd in id pd;
      do alias "s$cmd"="sudo $cmd";
done;

Це не працює - саме з цього я і почав. Ви пробували?
Tanktalus

Хороша концепція. Я думаю alias sudo="sudo ", що простіше.
trusktr

3

Як було розміщено кілька разів, зробіть у ".bashrc":

псевдонім sudo = 'sudo'

Причина, що пояснюється в "man bash" та "help alias":

псевдонім: псевдонім [-p] [ім'я [= значення] ...] Визначення або відображення псевдонімів.

Without arguments, `alias' prints the list of aliases in the reusable
form `alias NAME=VALUE' on standard output.

Otherwise, an alias is defined for each NAME whose VALUE is given.
**A trailing space in VALUE causes the next word to be checked for
alias substitution when the alias is expanded.**

1

Ви хочете щось подібне:

(alias; echo "exec < /dev/tty") | sudo bash  -i

Я можу помилятися, але ISTR, що bash -i(i = інтерактивний), є лише v4.0. Отже, на старішому сервері, на якому все ще bashпрацює v3, це, швидше за все, не вдасться. Але доведіть мене неправильно, будь-хто, продовжуйте;)
синтаксис-помилка

@syntaxerror - Ви неправильно пам'ятаєте. -iє оболонкою Борна, дивіться: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
геокар

Нічого собі, не сподівався отримати відповідь так скоро за 6-річну посаду ... Чому так, я, можливо, плутав це #!/bin/bash -iпісля шебангу, який, мабуть, не той (?). Щоб вирізати Коротше кажучи, використовуючи historyв bashскрипті (а не на «живий» в командному рядку) буде вимагати -iваріант, який я не зміг змусити працювати на сервері з «тільки» bashv3 встановлений. І це факт.
синтаксичний помилок

1

Я не знаю, чи це найрозумніше зробити на виробничій коробці, але я використовую локально

alias sudo="sudo -E"

Параметр -E ( зберегти середовище ) замінить параметр env_reset у sudoers (5)). Він доступний лише тоді, коли в команді відповідності є тег SETENV або параметр setenv встановлений в судорах (5).


-1

Чи можете ви додати псевдонім до .bashrc root або просто виконати .bashrc через sudo перед вашою командою?

sudo (. ~yourlogin/.bashrc; pd ./mytool --some params)

1
Гм, це навіть мало не спрацювало. Це насправді досить близько до деяких речей, які я спробував вище, але це далеко від фактичного синтаксису оболонки / судо.
Tanktalus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.