/Root/.bashrc içindeki ayarları kullanmak için sudo komutlarını nasıl alabilirim?


9

Ben özelleştirmiş .bashrc, takma bir dizi spesifik llveexport LS_OPTIONS='--color=auto'

Ne yazık ki bu, kullanıldığında işe yaramıyor sudo, bu yüzden ben de değiştirdim /root/.bashrc, ancak bu hiçbir fark yaratmamış gibi görünüyor.

sudo envgösterir HOME=/rootveSHELL=/bin/bash

sudoAyarları kullanmak için komutları nasıl alabilirim /root/.bashrc?

Bunun yalnızca bashetkileşimli olarak yürütüldüğünde gerçekleştiğini anlıyorum, bu yüzden nasıl özelleştirileceğine dair diğer önerilere açıkım.


@ daniel- gelling - Hep bu Q'nun bir XY sorunu olduğunu hissettim - meta.stackexchange.com/questions/66377/what-is-the-xy-problem . Başlık, bir şey istemediklerini ima ediyor, /root/.bashrcancak gerçekten Q'nun peşinde olan bu dosyadaki takma adlar - bu mümkün değil - unix.stackexchange.com/questions/1496/… .
slm

i sonra bashrc için bir yöntem ekliyor şey şu @slm - benim kişisel Bashrc dosyası hem de "devre dışı" Kökten için Bashrc dosyasında yaptığım gibi -rseçeneğiyle crontab: crontab () { [[ $@ =~ -[iel]*r ]] && echo '"r" not allowed' || command crontab "$@" ;}. Bu, her iki kullanıcı olarak oturum açtığında çalışır, ancak yürüttüğümde sudo crontab -rhala yürütülür .
Daniel Gelling

@DanielGelling - cevabımın senaryo için çalışıp çalışmadığına bakın.
slm

Yanıtlar:


6

sudokabuk komutu değil yürütülebilir bir dosya çalıştırır. Yani takma adlar hakkında bir şey bilmiyor. Eğer kaçarsan sudo ls, en hoşlandığımı sudo /bin/ls, herhangi kullanmaz lsolabilecek bu takma adı.

Sen neden olabilir sudo lsGözlerinde farklı aşağıdakileri koyarak takma genişletmek için .bashrc:

alias sudo='sudo '

Kabuğa sonra gelen sözcükle takma ad genişletmeye devam etmesini söyleyen arka boşluğa dikkat edin sudo. Sudo'dan sonra genişleyen takma adların her zaman iyi bir fikir olmayabileceğine dikkat edin, ne tür takma adlara sahip olduğunuza bağlıdır.

Ayrıca sudo çoğu değişkeni ortamdan kaldırır. Bu, benzer bir takma adı etkilemez alias ls='ls $LS_OPTIONS', çünkü bu komutu genişletirken kabuk tarafından kullanılan bir kabuk değişkendir (ve onu dışa .bashrcaktarmanın hiçbir amacı yoktur). Ancak, komut tarafından kullanılan değişkenleri etkiler LS_COLORS. Sudo'yu, yapılandırmasını düzenleyerek belirli ortam değişkenlerini tutacak şekilde yapılandırabilirsiniz: visudosatırı çalıştırın ve ekleyin

Defaults env_keep += "LS_COLORS"

Bu ayarlarla sudo llalışkın olduğunuz renkleri verir.

Alternatif olarak, ile bir kök kabuk çalıştırabilirsiniz sudo -s. Bu kabuk, yapılandırma dosyasını yükler ( ~/.bashrcbash için). Sudo'nun nasıl yapılandırıldığına bağlı olarak, bu durum HOMEana dizininize ayarlanmaya devam edebilir veya olarak değiştirilebilir /root. Ana dizini ile kök dizine ayarlanmaya zorlayabilirsiniz sudo -Hs; tersine, orijinal giriş dizinini tutmak için çalıştırın sudo env HOME="$HOME" bash.


3

Yanıtlayanlar, beni man sudodaha dikkatli okumamı isteyenlere teşekkürler .

sudo -s Herhangi bir komut belirtilmezse, etkileşimli bir kabuk yürütülür.

Bu etkileşimli kabuk /root/.bashrcbenim özelleştirmelerimi kullanır ve bu nedenle içerir.

Komutun ayrı olarak girilmesini gerektirir, ancak bu sorun değil.


2

Arka fon

Her zaman bu sorunun bir XY sorunu olduğunu hissettim . Başlık, bir şey istemediklerini ima ediyor, /root/.bashrcancak gerçekten sorunun peşinde olan bu dosyadaki takma adlar - bunun mümkün olmadığına inanılıyor - Bash komut dosyam neden takma adları tanımıyor? .

Temel olarak, takma adlarınızın sudotaşınabilir olmadığı için başka yerlerde ve başka yerlerde alınmayacağı tasarım gereğidir ve bu da onlar hakkında benim düşüncem.

Kullanıcının ortamında bulunan hiçbir şey, komut dosyaları ve belirli bir kutuda çalıştırılabilecek herhangi bir yazılım tarafından varsayılmamalıdır. Ancak, belirli bir kullanıcı hesabında $HOME/.bashrcdiğerlerinin etkileşimli senaryolardan yararlanmak isteyebileceği bazı takma adların olabileceği senaryoların olduğunu fark ediyorum .

Bu amaçla, Bash yorumlayıcısına, giriş işlemi sırasında bulduğu diğer adları, kullanırken karşılaştığınız normal kabuk davranışlarının dışında genişletmesini söyleyebilirsiniz sudo.

Misal

Kurmak

İşleri ayarlamak için kök kullanıcı /root/.bashrcve /root/.bash_profiledosyalara aşağıdaki takma adları, ortam değişkenlerini ve işlevleri ekledim .

$ grep smurf ~/.bashrc
alias brc_smurf='echo "ran alias from /root/.bashrc"'
export brc_smurf_env='var from /root/.bashrc'
bpf_smurf_func() { echo 'ran func from /root/.bash_profile'; }

$ grep smurf ~/.bash_profile
alias bpf_smurf='echo "ran alias from /root/.bash_profile"'
export bpf_smurf_env='var from /root/.bash_profile'
brc_smurf_func() { echo 'ran func from /root/.bashrc'; }

Bu işlerin hiçbirini yapmadan (sürpriz yok):

$ sudo brc_smurf
sudo: brc_smurf: command not found

$ sudo bpf_smurf
sudo: bpf_smurf: command not found

aliasKomutun çalıştırıldığında hiçbir takma ad göstermediğini görüyoruz sudo:

$ sudo alias
$

Bu davranış, takma adların erişilebilir olmasını beklememeniz gerektiğine dair ipucunuzdur. Ama devam ediyoruz ...

Adım # 1 - Görünen takma adlar

Biz çalıştırırsanız bash -cien azından bizim okumayı biz Bash teşvik edebilir $HOME/.bashrc:

$ sudo bash -ci 'alias' | grep smurf
alias brc_smurf='echo "ran alias from /root/.bashrc"'

Harika, belki de çalıştırabiliriz?

$ sudo bash -ci 'alias; brc_smurf'
bash: alias; brc_smurf: No such file or directory

Adım 2 - shopt -s expand_aliases

Hayır! Yine bu, tasarım gereğidir, yapmamamız gereken bir şey yapıyoruz, bu yüzden devre dışı bırakmamız gereken bir dizi "güvenlik" var. diğer "güvenlik" ise Bash.

$ sudo bash -ci 'shopt -s expand_aliases; alias; brc_smurf'
alias brc_smurf='echo "ran alias from /root/.bashrc"'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
ran alias from /root/.bashrc

Burada mesajımızı görebiliriz /root/.bashrc, kök kullanıcının takma adını başarıyla uyguladık brc_smurf.

Adım # 3 - Env vars ne olacak?

Yukarıda gösterilen yöntemi kullanıyorsanız, bunların da çalışması gerekir.

$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env'
ran alias from /root/.bashrc
var from /root/.bashrc

Adım # 4 - Peki ya fonksiyonlar?

Bunlar da beklendiği gibi çalışıyor:

$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env;brc_smurf_func'
ran alias from /root/.bashrc
var from /root/.bashrc
ran func from /root/.bashrc

TLDR;

Ortam değişkenleri + takma adlarına aşağıdakilerden erişmek için bunu yapabilirsiniz /root/.bashrc:

$ sudo bash -ci 'shopt -s expand_aliases; <cmds>'

Uzaklaşın

Bu yöntem içeriğini etkinleştirir, içeriğini /root/.bashrcalmaz /root/.bash_profile.

Referanslar


Evet, aralarında ufak tefek farklılıklar olsa da, burada ayrıntılara girmeyelim ;-). Her neyse, sorunun yorumunda belirttiğim durumla ilgili bana yardımcı olabilir misiniz: .bashrcsudo ile işlevleri kullanma ; özellikle -rseçeneği kaldırma crontab?
Daniel Gelling

Tamam, ama bu kaçmam gerektiği anlamına geliyordu: sudo bash -ci 'alias; shopt -s expand_aliases; echo $brc_smurf_env'basit yerine sudo echo $brc_smurf_env?
Daniel Gelling

Sen-ebilmek kaldırabilirsiniz alias, bu sadece onlara göstermek için, yapmanız gerekirsudo bash -ci 'shopt -s expand_aliases; <cmds>'
slm

Bu sadece root için crontab'ımı düzenlemek için yazmak çok fazla olurdu. Bunun için bir takma ad oluşturmama izin verin :-P
Daniel Gelling

@DanielGelling - evet, kabuk bağırsaklarındaki tüm eğlenceye hoş geldiniz.
slm

0

/ Etc / sudoers dosyasında özellikle sudo komutları çalıştırıldığında (örn. PATH'in yalnızca güvenilir konumlara sahip olduğundan emin olmak için) bir ortam ayarlamak, ancak bundan kaçmayı umduğunuza bağlı olarak bir grup ayar vardır. ortamı kurmak için bir kabukta gerçek komutları çalıştırmayı içeriyorsa, peşinde olduğunuz şeyi yapamayabilirsiniz. Sudoing size kök giriş kabuğu vermediğinden, sizin için düzenli bir profil oluşturmaz.


0

Diyelim ki /root/.bashrc'yi şu şekilde düzenliyoruz:

$ sudo su -
Password: ******
# cat ~/.bashrc

echo "root bashrc file was read"
PATH=~/bin:$PATH
echo "$PATH"
export USERVAR=set
echo "$USERVAR"

umask 022
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'

Bash'ın dosyayı okuması için oturumu kapatıp tekrar girelim:

# exit
$ sudo su -
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@here:~# alias l
alias l='ls $LS_OPTIONS -lA'
root@here:~# 

Gördüğünüz gibi, dosya okundu, PATH değiştirildi ve takma adlar ayarlandı. İstediğiniz gibi hepsi işlevsel.

Ancak, sudo hala beklediğiniz gibi çalışmaz.

root@here:~# exit
$ sudo env | grep USERVAR              # no output 
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

PATH değişmedi. Sudo'larda yolu değiştirmenin yolları olabilir, ancak bunu yapmaktan kaçınmanızı şiddetle tavsiye ederim. Her neyse, takma adlar, fonksiyonlar ve diğer bazı değişiklikler sadece PATH değiştirilerek uygulanmayacak. Bir dosyanın kaynağı olmalıdır. Her komut dosyası veya komut için bunu yapmak, bilgisayardan gerçek bir yarar olmadan daha fazla iş yapmasını ister. Komut dosyası takma ad kullanmaz (komut dosyalarının içinde pratik bir kullanım yoktur).

Yani, sadece giriş yapın, .bashrcdosya otomatik olarak yüklenecek ve çalışmaya başlayacaktır.

Bash'i şu şekilde başlatabilirsiniz:

$ sudo bash
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@mail:/home/isaac/me/temp/clocks-master#

Ancak yukarıda gördüğünüz gibi, pwd (çalışma dizini) değişmedi ve biraz daha incelerseniz, diğer bazı ayarlar da değişmedi. Bu yüzden doğru komut kullanmaktır:

$ sudo su -

Bu komut yazmak için çok uzunsa, kullanıcıda bu komutun kullanılacağı yerde (kök değil) bir diğer ad veya işlev oluşturun:

$ alias mysu='sudo su -'
$ mysu
# 

0

TL; DR: Tanımlı sudo -ibir işlevi çalıştırmak için /root/.bashrc(ancak diğer ad değil) kullanabilir ve ayrıca bu dosyadan dışa aktarılan değişkenlere erişebilirsiniz:

sudo -i  komut bağımsız değişkenleri

Ancak takma adlar orada çalışmaz, ancak bunları kullanılabilir hale getirmek istiyorsanız bunları işlevlere kolayca dönüştürebilirsiniz sudo -i.

Tüm analiz ve daha fazla ayrıntı için okumaya devam edin.


Burada, bazıları sudo'nun nasıl çalıştığı, bazıları da bash'ın nasıl çalıştığı konusunda birkaç sorun var ...

Varsayılan olarak, sudoyalnızca komutları arar ve kabuğu atlar, bu nedenle sadece içindeki dizinlerden birinde çalıştırılabilir sudo llbir lldosya çalıştırıldığında çalışır $PATH. Bu nedenle, takma adları (veya işlevleri) kullanmak için, bir kabuğun işlemin bir parçası olarak çağrıldığından emin olmanız gerekir.

Tek yönlü gibi bir şey çalıştırmak olacaktır sudo shveya sudo bashçağdaş rağmen sudo(ben sudo 1.8.19p1 bu test ediyorum) seçenekleri vardır -sve -ibu amaçla.

Yani bir deneyin gibi bir şey olurdu sudo -s ll(eşdeğerdir sudo bash -c 'll', senin varsayarak $SHELLdayanarak böyle görünüyor Bash vardır rcfile, olmayan bir interaktif içinde kabuğunu başlatır beri, ya da çalışmaz Ama söz etti.) başlangıç ​​dosyalarının hiçbirini okumayan oturum açma modu. Bu aslında bir kabuk betiği yazıp #!/bin/bashçalıştırmak için kullandığınız gibidir. İçinde bulunduğunuz diğer adlara (ve işlevlere) ~/.bashrcbu komut dosyasından erişilemez ...

Sırada -ibir oturum açma kabuğu oluşturan seçenek var. O zamandan beri Yani, daha umut verici olduğunu edecektir başlangıç dosyalarını okumak! Ve yine de, sudo -i ll(buna eşdeğer sudo bash -l -c 'll') hala çalışmaz. Yani nasıl olabilir, verilen bu did tanımını okumak lltakma?

Buradaki bir sonraki açıklama, varsayılan olarak, bash'ın kabuk etkileşimli olması dışında takma adları genişletmeyeceği ... sudo -i(veya bash -l) tarafından başlatılan bu kabuk bir giriş kabuğu, ancak yine de etkileşimli değil.

Bir sonraki adım , daha sonra çalışan etkileşimli bir kabuk elde etmektir :

sudo bash -i -c 'll'

(Hem Having giriş ve interaktif da ince, tabii ki bash -l -i -c ...çalışacaktır.)

Başka bir alternatif, bir giriş kabuğu (etkileşimli olmayan) kullanmaya devam etmektir, ancak açıkça takma adları genişletmesini istemektir, böylece bu da işe yarayacaktır:

sudo bash -l -O expand_aliases -c 'll'

(Bash oldu vaka interaktif bir gerek yoktu giriş o başlatma dosyalarını okumak için yeterli olduğundan, kabuk, ama bu bir ihtiyaç -lonları okumak için.)

Bunlar oldukça uzun komut satırları ... Ve ayrıca tüm kabuk komutunu alıntılamanızı gerektirir, bu yüzden argümanlarla bir takma ad çağırırsanız, bunları bir dizeye dönüştürmeniz gerekir ... kullanmak için sakar ...

Daha önce takma adlar ve işlevler hakkında konuştuğumu unutmayın ... Amaçlar buradaydı, çünkü işlevler aslında burada çok daha uygun. Tanımlarını kaynakladığınız sürece, bir kabuk üzerinde işlevleri yürütmek için özel bir şeye (etkileşimli bir kabuğa sahip olmak veya belirli bir seçeneği ayarlamak gibi) ihtiyacınız yoktur.

Dolayısıyla , takma ad yerine llbir işlev olarak tanımladıysanız , bunu doğrudan sudo -ikısayoluyla kullanabilirsiniz:

sudo -i ll

Ve daha uzun bir komut satırınız varsa, bağımsız değişkenlerle bunları doğrudan buraya da iletebilirsiniz:

sudo -i ll -C -R /etc

(İle karşılaştır sudo bash -i -c 'll -C -R /etc'.)

İşlevler de çok daha esnek ve bakımı daha kolaydır ... Bir takma adı bir işleve dönüştürmek genellikle kolaydır, tek uyarı her zaman "$@"ekstra argümanların alınmasını beklediğiniz yerlerde kullanmaktır (genellikle ad.)

Örneğin, bu takma ad:

alias ll='ls $LS_OPTIONS -l'

Bu işleve dönüştürülebilir:

ll () {
    ls $LS_OPTIONS -l "$@"
}

Çoğu amaç için eşdeğerdirler. Ve daha önce de belirtildiği gibi, işleve doğrudan erişilebilir olmalıdır sudo -i, bu yüzden bu bir avantajdır.

Umarım bu yanıtı ve açıklamayı yararlı bulursunuz!


DV - Bunun durumu zaten burada olanlardan daha fazla iyileştirdiğini hissetmiyorum.
slm

1
Ben daha önce cevap formunu söz beri cevabım şey ekliyor sizce @slm sudo -i command argumentsçalıştırmak için muktedir fonksiyonları gelen /root/.bashrcve ihraç değişkenler mevcuttur. Ama cevabımın belki de çok uzun olduğunu ve bu bilginin oraya biraz gömüldüğünü görüyorum ... Bu yüzden bir TL ekledim; özetlemek için DR (araştırmanın teknik ayrıntılarını korurken.) Lütfen başka bir göz atın.
filbranden
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.