Sudo aracılığıyla takma ad nasıl geçilir?


32

Bazı parametrelerde sık kullandığım bir araca geçen bir takma adım var. Bazen kendim gibi koşarım, bazen sudo altında. Ne yazık ki, elbette, sudo takma adı tanımıyor.

Takma adı nasıl geçireceğine dair bir ipucu var mı?

Bu durumda, hata ayıklama yaparken perl için bir sürü seçeneğim var:

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

Bazen, araçlarımı çalıştırmak yerine kök olarak hata ayıklamak zorunda kalıyorum:

pd ./mytool --some params

Onu sudo altında çalıştırmam gerekiyor. Birçok yol denedim:

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

Şu anki pd takma adımın tam olarak kullanıldığından emin olmak için güzel ve özlü bir yol umuyordum (daha sonra ince ayar yapmam gerekebilirdi), denemelerimden bazıları kısa olmasa da. Son çare, onu bir kabuk betiğine koymak ve sudo'nun bulabileceği bir yere koymak. Ancak takma adlar bazen çok kullanışlı, bu yüzden son çare.

Yanıtlar:


50

Bir çok zarif çözüm Arch Linux-Wiki bulunabilir:

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

tüm takma adları iletmek için çalışır sudo.

Kaynak: http://wiki.archlinux.org/index.php/Sudo#Passing_aliases


16
Bu harika bir numara! Meraklı için bash el sayfasındaki takma ad bölümünün açıklaması:A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded.
Russell Davis

1
Bu gerçekten kabul edilen cevap olmalı.
Adrian Frühwirth

Bu fonksiyonlar için işe yaramazsa bir ayıp değildir.
Ciro Santilli,

2
Not: Bir geçmesi gereğini DO düşünürsek seçeneği için sudotutmak istemekle birlikte, yine sudoaynı anda -passthrough hile. Bu bile yapılabilir: seçenekleri tekrar kullanmak için kullanın \sudo. Ters eğik çizgi , diğer adı geçersiz kılar . (Birçoğu bunu biliyor gibi görünmüyor). Bu yolla, herhangi bir uyarı vermeden dosyaları bile ( tehlike! ) Kaldırabilir, genel olarak belirtilenleri geçersiz kılarak yazabilirsiniz . alias rm='rm -i'.bash-aliases\rm file-to-delete
sözdizimi,

11

Ne yapmaya çalıştığın konusunda net değilim. İki yol görebiliyorum:

Doğru yol

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

Ardından çalıştırma pd ./mytoolhata ayıklama komutunuzu root olarak çalıştıracak, ancak sudo'nun faydalarını koruyacaktır (denetim izi, root kabuğundan işlemiyor).

Örnek:

insyte $ alias sid = 'sudo kimliği'
insyte $ sid
uid = 0 (kök) gid = 0 (kök) gruplar = 0 (kök)

Kolay yol

Takma adı kökündekilere ekleyin .bashrcve sudo -ine zaman köküne salaysanız kullanın.

root # echo 'alias fb = "yankı çubuğu" ">> /root/.bashrc
root # exit
çıkış
insyte $ sudo -i
kök # fb
foo bar

4

Sadece iki takma adınız ve bir değişken kullanın

Kullanmanın nedenini görmüyorum awkya da cutdeğiştirmeyi kolaylaştırmak için yalnızca bir defa çekirdek takma adı tanımlanmadığı sürece göremiyorum . Bu durumda, o zaman bu çalışır:

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

İşte yukarıdaki gibi bir takma ad çifti yapmak için basit bir işlev:

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

Kullanmak:

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

Şimdi sahipsin pdve spdartı ctve 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'

4

Keşke iki cevabı "doğru" olarak işaretleyebilseydim. Dan Doğru birleştiren Insyte dan awk (veya kesim) çözeltisi ile, anlayışlı yazı, um, 's Bill Weiss , bu ile geldim:

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

Şimdi gidip bunu .bashrc veya başka bir şeyde kabuk fonksiyonuna koyacağım ve daha sonra root olarak çalıştırmak istediğim tüm takma adlarımın "s" versiyonlarını oluşturacağım.

Güncelleme : biraz daha kolay hale getirmek için Dennis Williamson basit işlevinin küçük bir değişiklik :

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

Bu sadece komutun önüne "s" koymam gerektiği anlamına geliyor. Yerine:

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

Sadece ön taraftakileri ekliyorum.

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

Ve ben bittim. Tabii, bilgisayar biraz daha çalışıyor, ama bilgisayar bunun için. :-)

Teşekkürler!


Bir şeyleri kabul edildiği gibi işaretleyebilir (ya da yapabilmelisiniz), bu onları doğru şekilde işaretlemeye benzer :)
Bill Weiss

Doğru - İki cevabı doğru olarak işaretlemek istiyorum :-P
Tanktalus

3
Neden Slizzered'in cevabı değil? alias sudo="sudo "mükemmel çalışıyor.
trusktr


3

Seçeneklerinizi içeren bir betiği kesmek, ardından normal hesap ve kök için yolun bulunduğu klasörlerden birinde bir yere yerleştirmek daha kolay olmaz mıydı? Gerçekten bir senaryoyu pek almazdı.

#!/bin/bash
exec perl -Ilib -I/home/myuser/lib -d $*

Aslında $ * yerine "$ @" olmalı ve bu genellikle kaçınmaya çalıştığım nedenin bir parçası. ;-) Çalışır, sadece içerdiğine göre bir sürü disk alanı boşa harcar.
Tanktalus

3

Bu zor, ama burada çalışıyor:

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

Buraya eksik bir çözüm yapıştırdım, sonra düzeltmek için düzenledim. Şimdiki doğru. Burada neler olduğunu açıklayan ilk yorumu siz yapın :)
Bill Weiss

Uyanmaktan daha basit bir yol umuyordum, ama umut! = Realite bazen ;-) Görünüşe göre, "cut -f2 -d \ '", awk kadar iyi çalışır ve bu kadar küçük olur.
Tanktalus

Evet, kesim işe yarayacak, her zaman unuturum.
Bill Weiss,

3

Seçtiğiniz takma adlara VE komutlarına istediğiniz ~/.bashrcgibi bir "sudo" öneki ekleyin :

#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;

Bu işe yaramıyor - ben oradan başladım. Onu denedin mi?
Tanktalus

Güzel bir kavram. Bence alias sudo="sudo "daha kolay.
trusktr

3

Birkaç kez yayınlandığı gibi, '.bashrc'de yapın:

alias sudo = 'sudo'

'Adam bash' ve 'takma yardım' da açıklanmasının nedeni:

alias: alias [-p] [name [= value] ...] Diğer adları tanımlayın veya görüntüleyin.

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.**

1

Böyle bir şey istersiniz:

(alias; echo "exec < /dev/tty") | sudo bash  -i

Yanılıyor olabilirim, ancak ISTR bash -i(i = interaktif) sadece v4.0. Yani hala bashv3 çalışan eski bir sunucuda , bu büyük olasılıkla başarısız olur. Ama beni yanlış olduğunu kanıtlayın, herkes, devam et;)
sözdizimi

@syntaxerror - Yanlış hatırlıyorsun. -iBourne kabuğudur, bkz: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
geocar

Vay, 6 + yaşındaki bir yazı için bu kadar kısa sürede bir cevap almayı beklemiyordum ... Neden evet, #!/bin/bash -igörünüşe göre aynı olmayan (?) Shebang'dan sonra kafamı karıştırmış olabilirim . Kullanarak, kısa uzun bir hikaye kesmek için historybir yer bash(ve "canlı" komut satırında) komut dosyası olacak gerektiren -iben "sadece" bir sunucuda çalışan alamadı seçeneği, bashyüklü v3. Ve bu bir gerçek.
sözdizimi,

1

Bir üretim kutusunda yapılacak en akıllıca şey olup olmadığını bilmiyorum ama yerel olarak kullanıyorum

alias sudo="sudo -E"

-E ( ortamı koru ) seçeneği, sudoers'daki (5) env_reset seçeneğini geçersiz kılar. Sadece eşleşen komut SETENV etiketine sahipse veya setenv seçeneği sudoers (5) olarak ayarlanmışsa kullanılabilir.


-1

Takma adı root'un .bashrc dosyasına ekleyebilir veya komutunuzdan önce sudo aracılığıyla .bashrc komutunu çalıştırabilir misiniz?

sudo (. ~yourlogin/.bashrc; pd ./mytool --some params)

1
Bu da neredeyse işe yaramadı. Aslında yukarıda denediğim bazı şeylere oldukça yakın, ancak gerçek kabuk / sudo sözdiziminden uzakta.
Tanktalus
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.