A sudo használata nem áll rendelkezésre

133

Ma aliasokkal játszottam, és észrevettem, hogy az aliasok nem állnak rendelkezésre asudo használatakor:

danny@kaon:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found

Van valami oka annak, hogy nem használhat álneveket asudo? használata közben?

    
készlet kemra102 17.01.2011 23:47
forrás

7 válasz

211

Adja hozzá a következő sort a~/.bashrc:

elemhez
alias sudo='sudo '

A bash-kézikönyvről :

  

Az álnevek lehetővé teszik, hogy egy sztring helyettesítsen egy szót, amikor egy egyszerű parancs első szójaként használják. A shell fenntartja az álnevek listáját, amelyeket az alias és az unalias beépített parancsok segítségével állíthat be és törölhet.

     

Az egyes egyszerű parancsok első szavát, ha nincs megadva, be van jelölve, hogy van-e alias . Ha igen, ezt a szót helyettesíti az alias szövege. A '/', '$', '' ',' = 'karakterek és a fent felsorolt ​​shell metakarakterek vagy idézőjelek bármelyike ​​nem jelenhet meg álnévben. A csereeszköz tartalmazhat bármilyen érvényes shell bemenetet, beleértve a héj metakaraktereket is. A helyettesítő szöveg első szavát alias-okra tesztelik, de egy szó, amely megegyezik egy alias bővítéssel, nem bővül másodszor. Ez azt jelenti, hogy például az "ls -F" nevet adhatjuk, és a Bash nem próbálja rekurzívan bontani a helyettesítő szöveget. Ha az alias érték utolsó karaktere szóköz vagy lap karakter, akkor az alias után következő parancsszót is ellenőrizzük az alias bővítéshez .

(Emphasis mine)
A Bash csak egy parancs első szavát ellenőrzi egy álnévre, és minden szó után nem ellenőrizzük. Ez azt jelenti, hogy asudo ll parancsban csak az első szót (sudo) az alias-nak ellenőrizte, all figyelmen kívül marad. Elmondhatjuk a bash-nek, hogy ellenőrizze a következő szót az alias után (azazsudo), ha helyet ad hozzá az alias érték végéhez.

    
válasz adott Isaiah 18.01.2011 00:08
forrás
5

Bash-függvényt írtam rá, amely árnyékolja asudo -ot.

Ellenőrzi, hogy van-e alias-e az adott parancs számára, és az alias parancsot futtatja a szóban forgó helyett asudo -kal.

Itt van a funkcióom egy vonalzóként:

sudo() { if alias "" &> /dev/null ; then $(type "" | sed -E 's/^.*'(.*).$//') "${@:2}" ; else command sudo $@ ; fi }

Vagy szépen formázva:

sudo() { 
    if alias "" &> /dev/null ; then 
        $(type "" | sed -E 's/^.*'(.*).$//') "${@:2}"
    else 
        command sudo "$@"
    fi 
}

A.bashrc fájljához csatolhatod, ne felejtsd el a forrásodat, vagy utána újraindítani a terminál munkamenetét, hogy alkalmazd a módosításokat.

    
válasz adott Byte Commander 27.09.2016 11:19
forrás
3

Az álnevek felhasználó-specifikusak - meg kell határozni őket a (z)/root/.bashrc

fájlban     
válasz adott Ragnar123 18.01.2011 00:01
forrás
3

@Alvins válasz a legrövidebb. Kétségtelen! : -)

Mindazonáltal egy parancssori megoldásra gondoltam, hogy lefuttathassam a sudo nevű alias parancsot, ahol nincs szükség asudo újrafogalmazására egyalias paranccsal.

Itt van javaslatom azokra, akiknek érdekelheti:

Solution

type -a <YOUR COMMAND HERE> | grep -o -P "(?<=\').*(?=')" | xargs sudo

Példa

All parancs

esetén
type -a ll | grep -o -P "(?<=\').*(?=')" | xargs sudo

Magyarázat

ha van alias (például:ll), atype -a parancs visszaküldi az alias kifejezést:

$type -a ll
ll is aliased to 'ls -l'

agrep -kal kiválasztja az akkent és aposztróf közötti szöveget ebben az esetbenls -l

És axargs végrehajtja als -l -ot asudo paramétereként.

Igen, egy kicsit hosszabb, de teljesen tiszta ;-) Nem szükséges újra definiálni asudo -ot aliasként.

    
válasz adott loved.by.Jesus 15.02.2015 20:37
forrás
1

Van egy másik kedves megoldásom, ami egy kicsit a bizalmat is:

Használja a bash-befejezést, ha automatikusan helyettesítené a szavakat asudo -on az aliasok mögött a lap megnyomásakor.

Mentse ezt/etc/bash_completion.d/sudo-alias.bashcomp -ként, és automatikusan be kell töltenie az interaktív héj indításakor:

_comp_sudo_alias() { from=""; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$//" )" )
    return 0
  fi
  return 1
}
complete -o bashdefault -o default -F _comp_sudo_alias sudo

Ezután jelentkezzen be egy új terminálra, és jónak kell lenned.

    
válasz adott Evi1M4chine 08.09.2017 18:09
forrás
0

Van egy másik megoldásom, amellyel nem kell hozzáadnia asudo -ot alias-ként. Futtattam a Linux Mint 17.3-at, de elég hasonló lenne az Ubuntu-hoz.

Ha root, akkor a.profile fut a saját könyvtárából. Ha nem tudja, mi a root könyvtár a root alatt, akkor ellenőrizheti:

sudo su
echo $HOME

Amint láthatja, aroot otthon/root/. Ellenőrizze annak tartalmát:

cd $HOME
ls -al

Legyen egy.profile fájl. Nyissa meg a fájlt, és adja hozzá a következő sorokat:

if [ "$BASH" ]; then
    if [ -f ~/.bash_aliases];then
        . ~/.bash_aliases 
    fi
fi

Alapvetően ez a bash parancsfájl ellenőrzi a.bash_aliases nevű fájlt. Ha a fájlok jelen vannak, végrehajtja a fájlt.

Mentse el a.profile fájlt, és készítsen aliasokat a (z).bash_aliases -ban. Ha már rendelkezik az álnevek készítésével, akkor másolja a fájlt erre a helyre

Indítsa újra a terminált, és jó lesz!

    
válasz adott Karthik Ramakrishnan 10.06.2016 23:06
forrás
0

A legjobb választott válasz nagyszerű. Ha azonban beírja asudo -i -ot, és emeli a sudo parancssorba (#), akkor nem fogja használni a használni kívánt aliasokat.

Az álnevek (és minden mást) a# parancssorban történő felhasználásához használja:

sudo cp "$PWD"/.bashrc /root/.bashrc

Ahol a "$ PWD" automagically kiterjesztésre kerül "/ home / YOUR_USER_NAME"

    
válasz adott WinEunuuchs2Unix 25.11.2016 03:50
forrás