Jak przekazać alias przez sudo

32

Mam alias, który przekazuje niektóre parametry do narzędzia, którego często używam. Czasami biegam jak ja, czasem pod sudo. Niestety, sudo nie rozpoznaje aliasu.

Czy ktoś ma podpowiedź, jak przekazać alias?

W tym przypadku mam kilka opcji dla Perla podczas debugowania:

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

Czasami muszę debugować moje narzędzia jako root, więc zamiast uruchamiać:

pd ./mytool --some params

Muszę uruchomić to pod sudo. Próbowałem na wiele sposobów:

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'"

Miałem nadzieję na dobry, zwięzły sposób, aby upewnić się, że mój obecny alias pd został w pełni wykorzystany (na wypadek, gdy będę musiał go później poprawić), chociaż niektóre moje próby wcale nie były zwięzłe. Ostatnim rozwiązaniem jest umieszczenie go w skrypcie powłoki i umieszczenie go gdzieś, co sudo będzie w stanie znaleźć. Ale aliasy są czasem bardzo przydatne, więc jest to ostateczność.

Tanktalus
źródło

Odpowiedzi:

50

Bardzo eleganckie rozwiązanie można znaleźć w ArchLinux-wiki:

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

działa, aby przekazać wszystkie aliasy do sudo.

Źródło: http://wiki.archlinux.org/index.php/Sudo#Passing_aliases

Zaskoczony
źródło
16
To świetna sztuczka! Dla ciekawskich wyjaśnienie z sekcji aliasów na stronie bash:A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded.
Russell Davis,
1
To naprawdę powinna być zaakceptowana odpowiedź.
Adrian Frühwirth,
Szkoda, że ​​to nie działa w przypadku funkcji.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
2
Uwaga: Przypuśćmy, że trzeba zdać opcję , aby sudoponownie, a chcąc utrzymać tę sudo-passthrough tricka w tym samym czasie. Nawet to można zrobić: aby ponownie użyć opcji, użyj \sudo. Ukośnik odwróci alias. (Wielu zdaje się o tym nie wiedzieć). W ten sposób możesz ( niebezpieczeństwo! ) Nawet usuwać pliki bez żadnego ostrzeżenia, zastępując alias rm='rm -i'typowo określone w .bash-aliases, po prostu przez wpisanie \rm file-to-delete.
składniaerror
11

Nie jestem do końca pewien, co próbujesz zrobić. Widzę dwa sposoby:

Właściwy sposób

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

Następnie wykonanie pd ./mytoolspowoduje wykonanie polecenia debugowania jako root, ale nadal zachowuje zalety sudo (ścieżka audytu, nie działa z powłoki roota).

Przykład:

insyte $ alias sid = 'sudo id'
insyte $ sid
uid = 0 (root) gid = 0 (root) groups = 0 (root)

Łatwa droga

Dodaj aliasy do roota .bashrci używaj, sudo -igdy sudo chcesz rootować.

root # echo 'alias fb = "echo foo bar"' >> /root/.bashrc
root # exit
wyjście
insyte $ sudo -i
root # fb
bar foo
Insyte
źródło
4

Wystarczy mieć dwa aliasy i użyć zmiennej

Nie widzę powodu, dla którego używam awklub cutchyba, że ​​ma to być tylko jeden podstawowy alias zdefiniowany, aby ułatwić modyfikację. W takim przypadku działa to:

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

Oto uproszczona funkcja tworzenia par aliasów, takich jak powyższa:

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

Używać:

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

Teraz masz pdi spdplus cti 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'
Wstrzymano do odwołania.
źródło
4

Chciałbym oznaczyć dwie odpowiedzi jako „poprawne”. Łącząc właściwą drogę z wnikliwego postu Insyte , z awk (lub wyciętym) rozwiązaniem Billa Weissa , wpadłem na to:

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

Teraz po prostu przejdę do funkcji powłoki w moim .bashrc lub coś, a następnie utworzę wersje „s” wszystkich moich aliasów, które chcę uruchamiać jako root.

Aktualizacja : niewielka modyfikacja uproszczonej funkcji Dennisa Williamsona , aby była nieco łatwiejsza w użyciu:

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

Oznacza to, że muszę po prostu wstawić „s” przed całym poleceniem. Zamiast:

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

Po prostu dodaję s z przodu.

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

I skończyłem. Jasne, komputer wykonuje trochę więcej pracy, ale po to jest komputer. :-)

Dzięki!

Tanktalus
źródło
Możesz (lub powinieneś być w stanie) oznaczyć rzeczy jako zaakceptowane, co jest jak oznaczenie ich poprawnością :)
Bill Weiss,
Racja - chcę zaznaczyć dwie odpowiedzi jako poprawne :-P
Tanktalus,
3
Dlaczego nie odpowiedź Slizzered? alias sudo="sudo "działa idealnie.
trusktr
3

Czy nie byłoby łatwiej po prostu zhakować skrypt, który zawiera twoje opcje, a następnie umieścić go gdzieś w jednym z folderów, który jest ścieżką do zwykłego konta i roota? To naprawdę nie zajmie dużo scenariusza.

#!/bin/bash
exec perl -Ilib -I/home/myuser/lib -d $*
Zoredache
źródło
W rzeczywistości musi to być „$ @” zamiast $ *, i to jest jeden z powodów, dla których zazwyczaj staram się tego unikać. ;-) Działa, po prostu marnuje sporo miejsca na dysku w stosunku do tego, co zawiera.
Tanktalus,
3

To trudne, ale działa tutaj:

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
Bill Weiss
źródło
Wkleiłem tutaj niepełne rozwiązanie, a następnie zredagowałem je, by naprawić. Obecny ma rację. Bezpłatny głos do pierwszej osoby, która skomentuje, co się tutaj dzieje :)
Bill Weiss
Miałem nadzieję na prostszy sposób niż awk, ale mam nadzieję! Czasami rzeczywistość ;-) Najwyraźniej „cut -f2 -d \” będzie działał tak samo dobrze jak awk i będzie trochę krótszy.
Tanktalus,
Tak, cięcie działałoby, zawsze o tym zapominam.
Bill Weiss,
3

Dodaj prefiks „sudo” do wybranych aliasów ORAZ poleceń w swoim stylu ~/.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;

źródło
To nie działa - od tego zacząłem. Próbowałeś?
Tanktalus,
Niezła koncepcja. Myślę, że alias sudo="sudo "jest łatwiej.
trusktr
3

Jak napisano kilka razy, zrób w '.bashrc':

alias sudo = 'sudo'

Powód, dla którego wyjaśniono to w „man bash” i „help alias”:

alias: alias [-p] [name [= wartość] ...] Zdefiniuj lub wyświetl aliasy.

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.**
sixerjman
źródło
1

Chcesz coś takiego:

(alias; echo "exec < /dev/tty") | sudo bash  -i
geocar
źródło
Mogę się mylić, ale ISTR, że bash -i(i = Interactive) jest tylko wer. 4.0. Tak więc na starszym serwerze, na którym nadal bashdziała wersja v3, najprawdopodobniej zakończy się niepowodzeniem. Ale udowodnijcie, że się mylę, śmiało;)
składniaerror
@syntaxerror - Pamiętasz źle. -ijest powłoką Bourne'a, patrz: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
geocar
Wow, nie spodziewałem się, że wkrótce otrzymam odpowiedź na post z ponad 6-letnim postem ... Dlaczego tak, mogłem pomylić to z #!/bin/bash -ishebangiem, który najwyraźniej nie jest taki sam (?). Aby wyciąć długie opowiadanie, stosując historyw bashskrypcie (a nie w linii poleceń „na żywo”) będzie wymagać od -iopcji, które nie udało mi się dostać pracę na serwerze z „tylko” bashv3 zainstalowany. I to jest fakt.
składniaerror
1

Nie wiem, czy to najmądrzejsza rzecz na pudełku produkcyjnym, ale używam jej lokalnie

alias sudo="sudo -E"

Opcja -E ( zachowaj środowisko ) zastąpi opcję env_reset w sudoers (5)). Jest dostępny tylko wtedy, gdy albo pasujące polecenie ma znacznik SETENV, albo ustawiona jest opcja setenv w sudoers (5).

Eddie B.
źródło
-1

Czy możesz dodać alias do .bashrc roota lub po prostu uruchomić .bashrc przez sudo przed twoim poleceniem?

sudo (. ~yourlogin/.bashrc; pd ./mytool --some params)
Robert Swisher
źródło
1
To nawet nie działało. W rzeczywistości jest dość zbliżony do niektórych rzeczy, które próbowałem powyżej, ale jest bardziej oddalony od rzeczywistej składni powłoki / sudo.
Tanktalus,