Sudo kullanırken takma adlar kullanılamıyor


159

Bugün takma adlarla oynuyordum ve takma adların kullanım sırasında kullanılamaz göründüğünü fark ettim sudo:

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

Kullanırken takma ad kullanamamanızın bir nedeni var mı sudo?


Bu takma adı .bashrc / root /
Luciano Facchinelli'de

2
@ LucianoFacchinelli: /root/.bashrcsudo ile bir komut çalıştırırken okunamıyor.
Flimm


@ Flimm: Peki ya sudo -i?
Evi1M4chine

Yanıtlar:


250

Aşağıdaki çizgiyi bilgisayarınıza ekleyin ~/.bashrc:

alias sudo='sudo '

Gönderen bash kılavuzu :

Diğer adlar, basit bir komutun ilk sözcüğü olarak kullanıldığında, bir dizgenin bir sözcükle değiştirilmesine izin verir. Kabuk, takma ad ve unalias yerleşik komutları ile ayarlanabilecek ve birleştirilebilecek diğer adların bir listesini tutar.

Her basit komutun ilk sözcüğü, eğer alıntılanmamışsa, takma adı olup olmadığını görmek için kontrol edilir . Öyleyse, bu kelime diğer adın metni ile değiştirilir. '/', '$', '`', '=' Karakterleri ve yukarıda listelenen kabuk meta karakterlerinden veya alıntı karakterlerinden herhangi biri takma ad adında görünmeyebilir. Yeni metin, kabuk meta karakterleri de dahil olmak üzere geçerli bir kabuk girişi içerebilir. Değiştirme metninin ilk sözcüğü takma adlar için test edilir, ancak genişletilen takma adla aynı sözcük ikinci kez genişletilmez. Bunun anlamı, örneğin, "ls -F" nin diğer adı olabilir ve Bash, değiştirilen metni tekrar tekrar genişletmeyi denemez. Diğer ad değerinin son karakteri bir boşluk veya sekme karakteri ise, diğer adı izleyen bir sonraki komut sözcüğü ayrıca diğer ad genişletme olup olmadığını denetler .

(Vurgu madeni).
Bash yalnızca bir takma adın ilk kelimesini kontrol eder, ondan sonraki sözcükler kontrol edilmez. Bunun gibi bir komutta sudo ll, sadece ilk sözcük ( sudo) bir takma ad için bash ile kontrol edilir ll, göz ardı edilir. Bash'a sudotakma ad değerinden sonra bir boşluk ekleyerek diğer addan sonraki adı kontrol etmesini söyleyebiliriz .


18
Oldukça güzel bir çözüm.
ulidtko

Yani, temelde mesele, sudo'nun sadece alias'ın kontrol edemeyeceği şekilde kontrol edilemeyecek şekilde programlanmış olması gerçeğinden kaynaklanıyor?
kemra102

2
Belgeleri okumak kesinlikle bir sürü
işe

4
Örneğin, bir sudo bayrağı kullanırsam kırılır sudo -H llmı?
Mark E. Haase,

1
@ mehaase Evet, denedim ve kırıldı.
user31389,

5

Gölgeler için bir Bash işlevi yazdım sudo.

Verilen komut için bir takma adı olup olmadığımı kontrol eder ve sudobu durumda değişmez olan yerine yerine aliased komutunu çalıştırır .

İşte tek liner olarak benim fonksiyonum:

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

Veya güzel biçimlendirilmiş:

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

.bashrcDosyanızı ekleyebilir , kaynak yapmayı unutmayın veya sonrasında değişiklikleri uygulamak için terminal oturumunuzu yeniden başlatın.


Bu aynı zamanda sudo -H ll için de işe yararsa harika olurdu.
saat

3

Diğer adlar kullanıcıya özeldir, bunları tanımlamanız gerekir. /root/.bashrc


3
Zaten /root/.bashrc altındalar bu yüzden sorun değil
kemra102

1
Bu cevap, ancak, kabuğun kendisini kök olarak, olduğu gibi sudo -sveya sudo -i(ve yalnızca , veya formları ile değil , bir kök kabuk elde etmek için çalıştırılırsa ) veya veya bulunduğunuz durum için çalıştırdığınız durum için doğru olacaktır. kök girişlerini etkinleştirdim ve bu şekilde bir kök kabuğuna sahip oldum. Kök olmayan bir kullanıcı kendi kabuğundan çalıştığında , diğer ad genişletme işlemi kendi kök dışı kabuğu tarafından gerçekleştirilir. kendisi takma adları genişletmez, bu nedenle soruda açıklanan duruma uygulandığında , bu cevap yanlıştır. sudo -s command...sudo -i command...sudo bashsudo susudo command...sudo
Eliah Kagan

3

@Alvins cevap en kısa olanıdır. Şüphesiz! :-)

Ancak , sudo'dasudo bir aliaskomut ile yeniden tanımlamaya gerek kalmayan takma bir komutu çalıştırmak için bir komut satırı çözümü düşündüm .

İlgilenebileceği kişilere teklifim:

Çözüm

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

Örnek

llKomut durumunda

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

açıklama

bir takma adınız olduğunda (örneğin :) llkomut type -atakma ifadeyi döndürür:

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

ile grepsize bu durumda aksan `ve kesme işareti 'arasındaki metni seçinls -l

Ve xargsseçilen metni ls -lparametresi olarak çalıştırır sudo.

Evet, biraz daha uzun ama tamamen temiz ;-) sudoTakma adı yeniden tanımlamanıza gerek yok .


3
aliasÇıktıları daha temiz olduğu için yerleşimi kullanıyorsanız daha basit olabilir . alias llçıktılar alias ll='ls -ahlF'.
muru

İşte @ MURU önerisini içeren sürümü: alias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudo.
ACK_stoverflow

Bence asıl sorunun amacı, işi sudo -iilk önce yapmak zorunda kalmadan , takma adı verilen komutu çalıştırmak yerine, hemen yapmaktan kurtarmaktı . Böyle karmaşık bir komuta sahip olmak bunu yener. Sadece birincisini yapabilir ve daha hızlı olabilirsiniz.
Evi1M4chine

1

Benim de biraz güven veren başka güzel bir çözümüm var:

sudoSekmeye basarken arkasındaki sözcükleri diğer adlarıyla otomatik olarak değiştirmek için bash tamamlamayı kullanın .

Bunu farklı kaydedin /etc/bash_completion.d/sudo-alias.bashcompve etkileşimli kabuk başlangıcında otomatik olarak yüklenmesi gerekir:

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

O zaman yeni bir terminale giriş yapın ve gitmeniz iyi olur.


Özellikle tamamlama amaçlı bir takma ad listesi almanın bir yolu var:compgen -a
muru

@muru: Teşekkürler, ama bu durumda değerlere ihtiyacım var, anahtarlara değil. Öyleyse girilen takma adın yerini alacak. Diğer adı sudo llgirersiniz (içinde olduğu gibi ), [TAB ↹] tuşuna basın; komut dosyası lldiğer ad atamaları listesinde bulur , kendisine ne atandığını keser ve onu ekler. (Yani örneğin alırsınız sudo ls -lahvF --color=auto --time-style=long-iso.)
Evi1M4chine

0

sudoTakma ad eklemek zorunda olmadığınız farklı bir çözümüm var . Linux Mint 17.3 kullanıyorum ancak Ubuntu ile oldukça benzer olması gerekiyor.

Kök olduğunuzda, .profileana dizinden çalıştırılır. Kök altındaki giriş dizininin ne olduğunu bilmiyorsanız, şunları kontrol edebilirsiniz:

sudo su
echo $HOME

Gördüğünüz gibi, ev rootolduğunu /root/. İçeriğini kontrol et:

cd $HOME
ls -al

Bir .profiledosya olmalı . Dosyayı açın ve aşağıdaki satırları ekleyin:

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

Temel olarak, bu bash betiğinin yaptığı bir dosyayı aramaktır .bash_aliases. Dosyalar varsa, dosyayı çalıştırır.

Dosyayı kaydedin .profileve takma adlarınızı içinde oluşturun .bash_aliases. Takma ad dosyanız zaten hazırsa, dosyayı bu konuma kopyalayın.

Terminali yeniden başlatın ve gitmeniz iyi olur!


0

En çok oylanan cevap çok güzel. Ancak sudo -ibir sudo istemi ( #) yazar ve yükseltirseniz , kullanmak istediğiniz diğer adlara sahip olmazsınız.

İstemdeki takma adlarınızı (ve diğer her şeyi) #kullanmak için aşağıdakileri kullanın:

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

"$ PWD" nin otomatik olarak "/ home / YOUR_USER_NAME" dizinine genişletildiği yer


0

@ WinEunuuchs2Unix: $PWD"mevcut çalışma dizini" ne genişletilir. Ne istediğini düşünüyorum $HOME.

Ayrıca, çoğu durumda, ayrı bir kök .bashrc dosyasına sahip olmak muhtemelen en iyisidir. Aslında, onu gerçek bir dosya haline getirir /root, kullanıcının giriş dizininde (örneğin .bashrc_root) yumuşak bir bağlantı kurar ve onu kullanıcının dosyasından alırdım .bashrc. Daha sonra bu ayrıcalıklı kullanıcı hesabı artık mevcut değilse, kök .bashrcdosya başka kullanıcılar tarafından kullanılabilir durumda kalır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.