Diğer adlar sudo kullanırken kullanılamaz

133

Bugün takma adlarla oynuyordum ve sudo kullanırken takma adların kullanılabilir olmadığını fark ettim:

[email protected]:~$ 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'

[email protected]:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

[email protected]:~$ sudo -i
[email protected]:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
[email protected]:~# exit
logout

[email protected]:~$ sudo ll -d /
sudo: ll: command not found

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

    
sordu kemra102 17.01.2011 23:47

7 cevap

209

Aşağıdaki satırı ~/.bashrc dosyanıza ekleyin:

alias sudo='sudo '

Temel kullanım kılavuzundan :

  

Diğer adlar, basit bir komutun ilk sözcüğü olarak kullanıldığında bir sözcük için bir dizenin değiştirilmesine izin verir. Kabuk, takma adlar ve unalias yerleşik komutları ile ayarlanıp ayarlanamayan takma adların bir listesini tutar.

     

Her bir basit komutun ilk sözcüğü, seçilmediyse, takma adının olup olmadığını kontrol eder . Eğer öyleyse, bu kelime diğer adın metni ile değiştirilir. ‘/’, ‘$’, ‘'’, ‘=’ Karakterleri ve yukarıda listelenen kabuk meta karakterleri veya alıntı karakterlerinden herhangi biri diğer adlarda görünmeyebilir. Yedek metin, kabuk meta karakterleri de dahil olmak üzere herhangi bir geçerli kabuk girişi içerebilir. Değiştirme metninin ilk sözcüğü diğer adlar için test edildi, ancak genişletilen bir takma adla aynı olan bir sözcük ikinci kez genişletilmez. Bu, örneğin, "ls -F" değerine sahip olabilir ve Bash, değiştirme metnini yinelemeli olarak genişletmeye çalışmaz. Takma adın son karakteri boşluk veya sekme karakteri ise, bu takma adı taşıyan sonraki komut kelimesi de diğer ad genişlemesi için kontrol edilir .

(Vurgulama benim).
Bash, yalnızca bir takma adın ilk sözcüğünü kontrol eder, bundan sonra herhangi bir sözcük kontrol edilmez. Bu, sudo ll gibi bir komutta, yalnızca ilk kelimenin ( sudo ) baska tarafından bir takma ad için kontrol edildiği anlamına gelir, ll değeri yok sayılır. Diğer adın (yani, sudo ) bir sonraki kelimeyi, diğer adın sonuna boşluk ekleyerek kontrol etmesini söyleyebiliriz.

    
verilen cevap Isaiah 18.01.2011 00:08
5

Bunun için sudo gölgesi olan bir Bash işlevi yazdım.

Verilen komut için bir takma ada sahip olup olmadığımı kontrol eder ve bu durumda sudo ile bir harfli komutu yerine aliased komutunu çalıştırır.

İşte tek liner olarak işlevim:

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

Ya da güzel biçimlendirilmiş:

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

Bunu .bashrc dosyanıza ekleyebilir, kaynak eklemeyi unutmayın veya değişiklikleri daha sonra uygulamak için terminal oturumunuzu yeniden başlatın.

    
verilen cevap Byte Commander 27.09.2016 11:19
3

Takma adlar kullanıcıya özeldir - bunları /root/.bashrc

içinde tanımlamanız gerekir     
verilen cevap Ragnar123 18.01.2011 00:01
3

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

Ancak, sudo komutunu alias komutuyla yeniden tanımlamaya gerek olmayan sudo'daki bir takma ad komutunu çalıştırmak için bir komut satırı çözümü düşündüm.

İşte ilgilerini çekebilecek kişiler için önerim:

Çözüm

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

Örnek

ll komutunda

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

Açıklama

takma adınız olduğunda (örneğin: ll ) type -a komutu, aliased ifadesini döndürür:

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

grep ile aksan ve kesme işareti arasındaki metni seçersiniz. ls -l

Ve xargs , ls -l parametresinin seçili metnini sudo yürütür.

Evet, biraz daha uzun ama tamamen temiz ;-) sudo 'yi takma ad olarak yeniden tanımlamanıza gerek yok.

    
verilen cevap loved.by.Jesus 15.02.2015 20:37
1

Başka bir güzel çözüm var, bu da biraz güven ekliyor:

Sekme tuşuna bastığınızda diğer adlarla birlikte sudo 'nin arkasındaki kelimeleri otomatik olarak değiştirmek için bash tamamlamayı kullanın.

Bunu /etc/bash_completion.d/sudo-alias.bashcomp olarak kaydedin ve etkileşimli kabuk başlangıcında otomatik olarak yüklenmelidir:

_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

Ardından yeni bir terminale giriş yapın ve gitmek için iyi olmalısınız.

    
verilen cevap Evi1M4chine 08.09.2017 18:09
0

Farklı bir çözümüm var; bu şekilde, sudo 'ı takma ad olarak eklemeniz gerekmez. Linux Nane 17.3'ü çalıştırıyorum ama Ubuntu'ya çok benzemeli.

Kök olduğunda, .profile kendi ana dizininden çalıştırılır. Kök altındaki ana dizinin ne olduğunu bilmiyorsanız, aşağıdakileri kontrol edebilirsiniz:

sudo su
echo $HOME

Gördüğünüz gibi, root öğesinin yüzdesi /root/ . İçeriğini kontrol et:

cd $HOME
ls -al

.profile dosyası 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 betik betiğinin yaptığı, .bash_aliases adlı bir dosyayı kontrol etmektir. Dosyalar mevcutsa dosyayı çalıştırır.

.profile dosyasını kaydedin ve diğer adlarınızı .bash_aliases olarak oluşturun. Takma adlar zaten hazırsa, dosyayı bu konuma kopyalayın

Terminali yeniden başlatın ve gitmek için iyisiniz!

    
verilen cevap Karthik Ramakrishnan 10.06.2016 23:06
0

En çok oylanan cevap harika. Ancak, sudo -i yazıp sudo istemine yükselirseniz ( # ) kullanmak istediğiniz takma adlara sahip olmazsınız.

Takma adlarınızı (ve diğer her şey) # isteminde kullanmak için, aşağıdakileri kullanın:

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

"$ PWD", "/ home / YOUR_USER_NAME" konumuna otomatik olarak genişletildiğinde

    
verilen cevap WinEunuuchs2Unix 25.11.2016 03:50

Etiketlerdeki diğer soruları oku