Gerçekten çalışmak istiyorsanız, bu şekilde çalıştırıldığında yeni bir kök kabuğu çalıştıran ve yalnızca normal komutu çalıştıran bir kabuk işlevi tanımlayabilirsiniz .sudo cd directory
bash
sudo
sudo
Diğer yanıtlar sunulduğu gibi, çoğu kullanıcı olacak değil bunu yaparken rahatsız etmek istiyorum, ama bunun yerine isteyeceksiniz:
- Çalıştırın
sudo -s
veya sudo -i
bir giriş kabuğu istiyorsanız (bunun bir etkisinin sudo -i
sizi kök dizininde başlatmak olduğunu unutmayın) veya seçenekleri kabuğa sudo bash
zorlamak bash
veya iletmek isteyip istemediğinizi unutmayın .
- Yeni kabukta koş .
cd directory
- Yeni kabukta kök olarak yapılması gereken (başka) eylemleri gerçekleştirin.
- Bittiğinde
exit
, yeni kabuğu terk etmek için koş . Bunu unutmamak önemlidir, çünkü düşündüğünüzden daha köklü eylemler yapmak istemezsiniz!
Eğer, o zaman bu eylemlerin ilk ikisini gerçekleştiren bir kabuk fonksiyonunu (veya bir komut dosyası) yazabilirsiniz istiyorsanız Yani, sudo
takip eder cd
ve sadece çalışır sudo
normalde aksi. Lütfen bunu neden sudo cd
başka türlü başarılı olamadığını öğrenmenin bir alternatifi olarak kullanmayın , çünkü neler olup bittiğini anlamadıysanız, yeni bir kabuğun içinde kalarak kafanız çok karışacaktır (ve herhangi bir hata mesajını anlayamayabilirsiniz). bu gerçekleşir).
İşte size böyle yeni bir kabuk işlevi yazmanın bir yolu, bu da size yeni bir kabukta olduğunuzu ve exit
işiniz bittiğinde bunun dışında kalmanız gerektiğini hatırlatıyor . (Yani hatırlatma kullanıcıları için yararlı olması muhtemeldir herhangi bir kimse çalıştırıldığında yeni bir kabuk içinde olmasının genellikle alışık olmadığı için, beceri seviyesine sudo
olmadan -s
, -i
ya da bir argüman olarak gerçek bir kabuk adı.)
# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
sudo bash -c '
if cd -- "$2"; then # When cd fails, its own message is enough.
printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
exec bash # Replace this bash shell with an interactive one.
fi
' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
else
command sudo "$@"
fi
}
Bunu içine koyabilirsiniz ~/.bashrc
, ancak bu kullanmak sudo
için sadece zaman zaman etkinleştirmek isteyebileceğiniz kadar tuhaf bir yoldur . Bu durumda, kendi dosyasına koymak daha iyidir. Bu sudo.bash
dizinde ana dizininizde adı verilen bir dosya oluşturursanız , sudo
işlevi çalıştırarak sudo
- normal komut yerine çalışacak şekilde çalıştırabilirsiniz - çalışarak . ~/sudo.bash
. Bu, mevcut kabukta ve onun çocuk kabuklarında etkili olur, ancak diğerlerini değil. Bunun gibi dosyalar .bashrc
çalıştırılabilir olmama nedeni sudo.bash
ile çalıştırılabilir olarak işaretlemeyin chmod
. Bu gerçekten bağımsız bir kabuk betiğinden ziyade bir kütüphanedir. Eğer yaptıysanBir kabuk betiği olarak çalıştırın, işlevi tanımlar ... ... ancak yalnızca betiği koyan kabukta, arayan olarak sizin için değil. (Tabii ki, olabilir , sadece burada atmış yaklaşım olduğu olmamasını, bunun için bir senaryo yazmak.)
Şu sudo
anda bir kabuk işlevi olarak tanımlanmış olup olmadığını kontrol etmek ve görmek ve mevcutsa tanımını görmek için çalıştırın type sudo
. Fonksiyonu tanımlandıktan sonra devre dışı bırakmak (yani tanımlamamak) için, çalıştır unset -f sudo
. sudo
Kabuk işlevi tanımlanmış olsa bile normal komutu doğrudan elle çalıştırmak için , çalıştırın command sudo
. Bununla birlikte, bunu yapmak zorunda olmadığınızı unutmayın , çünkü bu sudo
işlev aslında kendisine verilen iki argümandan daha az veya daha az olduğunda veya kendisine geçen ilk argüman başka bir şey olduğunda kendini yapar cd
. Bu yüzden hala insanların normal şekilde kullanabiliyorsunuz sudo
.
Yukarıda gösterilen kabuk işlevi hala başka argümanlar geçmesine izin vermez da unutmayın sudo
, ancak bu tedavi engelleyecektir cd
özel . Özellikle koşmak desteklenmiyor, ancak bu durumu desteklemek için shell işlevini genişletebilirsiniz. Ne de . Yarattığı kabuk, aldığınıza benzer . Kod aslında çalışmaz , ancak kullanır , böylece seçenek düzgün çalışır. Geçtiğinizde iki kez çalışır ve ona bir dizin argümanı (ve aksi halde sıfır kez). Çalıştırdığınızda , ilk önce işlevi çalıştırdığınızdan ayrı bir bash kabuğu çıkarır ve dizini değiştirir. Bu başarılı olursa, yerini alır.sudo -u user cd directory
sudo -i cd directory
sudo -s
sudo -s
sudo bash
-c
bash
cd
sudo cd directory
sudo
Bu bash kabuğunu, kullanabileceğiniz yeni, etkileşimli bir kabukla değiştirin.
İşte bu kabuk fonksiyonunun otomatik olarak "doğru olanı yaptığını" gösteren bir örnek. sudo ls -A /root
Normal davranan dikkat edin . Yalnızca cd
bir dizine girmeye çalıştığımda, sudo
yeni bir kabuk oluşturulur ve neler olup bittiğini açıkça hatırlatırım.
ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude .bashrc .config .emacs.d .nano .rpmdb
.bash_history .cache .dbus .local .profile
ek@Io:~$ sudo -k # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$
Eğer denerseniz sudo cd
hatta olarak köküne değiştiremezsiniz bir dizine, o zaman sadece bir hata mesajı alırsınız:
ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$
Dizini değiştirmeyi denemeden öncesudo -k
sizi kök olarak doğruladığını göstermek için yukarıdaki örneklerde yapılan çağrılar arasında kullandım . Ama aslında kendini çalıştırmak zorunda değilsin . Çünkü kabuk işlevi gerçek sadece ince bir sarıcı komutu , kimlik bilgilerinizi ve diğer yaygın önbelleğe alma davranışları hala normal şekilde çalışır.sudo -k
sudo
sudo
Her ne kadar iyi çalışıyor ve düzgün olsa da sudo
, aynı adı taşıyan bir fonksiyonla gerçek komutu gölgelendirmenin çok garip olduğunu itiraf ediyorum . Çoğu kullanıcı muhtemelen sadece adımları gerçekleştirmek isteyecektir sudo -s
, kendilerini. Ancak herhangi birinin bunu istemesi durumunda - ve bunun mümkün olduğunu göstermek için - işte orada.cd directory
ls -l
dizinin kendisini ekleyin .