Sudo neden takma adları yok sayar?


22

Ubuntu 10.04 kullanıyorum upstartve daemon yönetimi için kullanıyorum . Kurumsal uygulamam bir arka plan programı olarak çalıştırılıyor ve çeşitli ayrıcalıklar nedeniyle kök olarak çalıştırılmalı. Örneğin:

sudo start my-application-long-ID
sudo stop my-application-long-ID
etc

aliasBu komutları aşağıdaki gibi kısaltmak için bir tanıtmak istiyorum:

alias startapp='sudo start my-application-long-ID'

ve startappbu şekilde çalışır ve çalışır ancak takma adlarda sudo olmamasını tercih ederim.

alias startapp='start my-application-long-ID'

kullanarak çalıştırdığınızda sudo startapp, döndürmez sudo: startapp: command not found.

Ancak takma adı eklediğimde:

alias sudo='sudo '

sudo startapp şimdi çalışıyor ama hala sudo'nun takma isimleri görmezden geldiğini merak ediyorum.


Kaçtın mı source ~/.bashrc? Bu .bashrc dosyasını günceller ve yeni takma adları kullanılabilir duruma getirir?
manu

@manu Evet, yaptım
amfi

Yanıtlar:


35

Aşağıdaki bilgileri buradan görüyorum .

Sudo kullanırken, takma ad genişletme özelliğini kullanın (aksi halde sudo takma adınızı yoksayar)

alias sudo='sudo '

Çalışmamasının nedeni burada açıklanmıştır .

Bash yalnızca bir takma adın ilk kelimesini kontrol eder, ondan sonraki sözcükler kontrol edilmez. Bu, sudo ll gibi bir komutta, yalnızca ilk sözcük (sudo) bir takma ad için bash tarafından kontrol edilir, ll yoksayılır. Bash'a takma ad değerinin sonuna bir boşluk ekleyerek, takma addan sonraki (sudo) sonraki sözcüğü kontrol etmesini söyleyebiliriz.


6

Diğer adlar ve işlevler bir kabukta tanımlanır. Sudo harici bir programdır. Böylece sudo takma adları, işlevleri veya kabuk yerleşiklerini görmez, yalnızca harici komutları görür.

Diğer adların alternatif komut adları olduğu anlamına gelir, bu nedenle kabukları komutlarda argüman olduğunda değil, yalnızca komut konumunda genişletir. Zsh, komut satırında herhangi bir yere yayılmış küresel takma adlarını destekler ve takma adın anlamadığı durumlarda bile yanlışlıkla genişletme riski bulunduğundan, en iyi şekilde kullanın.

Bir kabuk çağırmak için sudo söyleyebilir: sudo sh -c '…shell command here…'. Normal takma adlarınız o kabuk komutunun içinde kullanılamaz, ancak normalde bunlar yalnızca etkileşimli mermilerle okunan ~/.bashrcveya böyle bir dosyada saklanır ~/.zshrc.

alias sudo='sudo 'Ramesh tarafından önerildiği gibi , kabuktan sonra takma adların genişlemesine neden olur sudo.


1
alias sudo='sudo 'ZSH için de işe yarıyor mu ?
CMCDragonkai 13:16

2
@ CMCDragonkai Evet
Gilles 'SO- kötülükten

1

Zsh kullanıcıları için bir çözüm

Hem bash hem de zsh'da boşluk içeren bir diğer adı sonlandırmak, kabuğun bir sonraki sözcüğü diğer adı genişletmesine neden olur. Bu, takma adın genişlemesine aşağıdaki gibi bir şey sağlarmyalias

alias 'sudo=sudo '
sudo myalias

Ne yazık ki, takma adınızda bir kelimeden daha fazla kelime bulunduğunda bu ayrılır (ancak sudo -u someone. Komutun herhangi bir yerinde takma adı el ile genişletmek için zsh "global aliases" özelliğini kötüye kullanabilirsiniz.

alias -g '$= '

Bu, $uzayda biten (istediğiniz herhangi bir kelimeyi kullanabilirsiniz) adında bir genel takma ad oluşturur . Bu, zsh'nin bir sonraki sözcüğü normal bir komut takma adı olarak genişletmesine neden olur. Takma ad boşluk alanına genişlediğinden, bağımsız değişken olarak değerlendirilmez. Bu, aşağıdakilerin çalışmasına izin verir.

% alias myalias=echo
% sudo -u someone myalias foo
sudo: myalias: command not found
% sudo -u someone $ myalias foo
foo

$Karmaşık komut yerleştirme işlemleriniz varsa, tek bir komut satırında birden çok kez kullanabilirsiniz . Bunu zshrc'mde kalıcı bir yere sahip olacak kadar faydalı buldum, ancak takma ad, ne zaman kullanmanız gerektiğini tanımlamak için yeterince basit.


0

Ben sadece buradasudo bir takma adı yeniden tanımlamaksızın alternatif bir cevap verdim .

Senin durumunda bu olurdu:

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

Hepsi bir satırda, fazladan kabuk yok, takma ad tanımlaması yok. ;-)


Oh bir dakika bekle - Anladım - xargstırnakları kullanmak için kullanıyorsun , ve ipuçlarını almak için sürün =. Zekice ama muhtemelen gereksiz. eval "sudo $(alias aliasname | cut -d= -f2-)"Büyük olasılıkla daha iyi - xargsteklifleri her zaman doğru kullanmayacak ve orada birden fazla olabilir =.
mikeserv

@mikeserv Bunu anlamadığınız için üzgünüm ;-) xargstırnak işaretleri yapmaz. Çözümlenen komutu tırnak işaretleri arasında alan grep'tir. Bilirsin işte type -a alias_nameböyle bir şey alias_name is aliased to command_within_quotes. Bu arada ben emrinizi denedim ve benim ubuntu :-( üzerinde çalışmaya vermedi o dönüşü mı. type -aLinux sürümleri arasında farklı (i şüpheliyim)?.
loved.by.Jesus

Ben biliyorum typeiçinde - yapar bash. Yine de, tekliflerin iki kat doğru olduğunu biliyorsunuz. Tek tırnak içeren bir takma adla denediniz mi? Her neyse, işimin işe yaramadığı konusunda haklısın - ya eval "sudo sh -c "$(...da ihtiyacın var eval "'sudo $(alias alias_name| cut -d\' -f2-)". Şeydir aliases temelde düzenlemeler yapılmıştır evals - aliasgüvenle reinput kabuk olabilir, böylece yarar çıkışına içeriklerini spec 'edilir. Sanırım xargsboşlukları düzleştirmek için uygulanıyor? Sadece ona dikkat et, tamam mı?
mikeserv
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.