700 izne sahip ve bana ait değilse, 'cd' komutunu içeren bir dizine nasıl girilir?


86

Kullanmaya çalıştım sudo cd name_of_dirama hata mesajı alıyorum:

sudo: cd: command not found

700 izne sahip başka bir kullanıcının sahip olduğu bir dizine girmenin başka bir yolu var mı?


2
lütfen ls -ldizinin kendisini ekleyin .
Rinzwind

7
Ve lütfen buradaki geçerli cevaplara niçin olumsuz yorumlar bıraktığınızı açıklayınız. Daha iyi bir yol olduğunu (veya olması gerektiğini) düşünüyorsanız, lütfen ne olabileceğini bize bildirin.
Oli

1
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dirMutlu olacağın tek cevap gibi görünüyor.
Marco Ceppi

3
Burada verilen cevaplar doğru, ancak onları oy kullanıyor ve yanlış olduklarını söylüyorsunuz. Gördüğün başka bir şey yüzünden söylenenleri reddetme.
Richard Holloway

3
Bu komik ... sudo cdçalışmak istiyor , ancak sudo veya su kullanarak çözümleri oyluyor. Kök olarak çalışmak istemediğini, ancak hala sahip olmadığı bir doğrudan erişmek istediğini söylüyor. Bana bir troll gibi geliyor ...
MestreLion

Yanıtlar:


110

sudo cdçalışmayacak çünkü cdkomut kabuğun içine yerleştirilmiş. Diyelim ki kök ol ve bu komutu çalıştır. Kök olursunuz ve sudo'dan sonraki komut aranır, ancak cdbulunacak bir komut yoktur .

Kullanılacak yöntem, dizinin sahibi olan kullanıcıya geçmek. İzin 700"sahibi okuyabilir, yazabilir ve uygulayabilir" anlamına gelir.

Kök dizinin sahibi ise sudo -i, şifre ve sonra cd {dir}tek doğru yöntemdir. Eğer bir başkası dizinin sahibi ise, 1. yöntemi kullanabilir, ancak o kullanıcı ile değiştirebilir su {username}ve daha sonra cdo kullanıcı olarak kullanabilirsiniz .


Yan soru: sahibi olmasa bile root 700 dir girebilir mi?
MestreLion

3
evet MestreLion, 700 kökün girmesini engellemeyecek. İzinler '000', kullanıcının kendisine girmesini durduracaktır (evet, kullanıcı kendisi giremeyeceği bir dizin oluşturabilir ...) ancak yine de kök o girebilir.
Rinzwind

1
echo bir kabuk oluşturma komutudur, neden "sudo echo" komutunu çalıştırabilirim ama "sudo cd" yi çalıştıramıyorum?
shoujs,

Üzgünüz, aynı kurallar için de geçerli sudo echo: echo 'deb {text}' | sudo tee --append {file}sudo ile echo kullanmak ve bir dosyayı değiştirmek gibi bir şeye ihtiyacınız var .
Rinzwind

1
Yine cdde neden mevcut komutların içinde mevcut değil sudo?
Aaron Franke

44

sudo -i

"kök konsol" u açmak için

cd /path/to/directory

( cdbir kabuk yerleşik komutudur, bu yüzden sudo hedefi olamaz)


18

Bir kök dizini açmak için bir kök kabuğu çalıştırabiliriz, örneğin:

sudo su
# cd /root

3
Kök olarak çalışmak istemem. ASLA!!! Ayrıca uzmanlar asla root olarak giriş yapmamalarını önermektedir. -1
11:11

8
İşte bu yüzden kök dizinlerini açmak için izin istemiyorsun, değil mi?
Takkat

10
Kök moduna girmek yanlış bir şey yoktur. Uzmanlar, gerektiğinde her zaman kök salmasını önerecektir.
Rinzwind

2
Eğer root tarafından sahip olunan şeylerle çalışıyorsanız, bazen sudo suing (veya başka bir yöntem) pratik veya hatta mümkün olan tek yöntemdir. "Uzmanlar" size yalnızca kök alışkanlık olarak kullanmamanızı söyler - gerçekten ihtiyacınız olduğunda sorun değil. Ve @ Vojtech, hiçbir şey imkansız değildir ...
Oli

2
@Bakhtiyor: çalışma root olarak bütün zaman gerçekten tavsiye edilmez. Ancak, bunu tek bir (veya birkaç) komut için vermek kabul edilebilir. Özellikle , kullanıcınızın izin vermediği bir dizini girmeye çalışıyorsanız . Yani sahibi ya da kökü olmanız gerekir .
MestreLion

10

Diğerlerinin de belirttiği gibi - kabuğunda yerleşiktir:

~ % which cd
cd: shell built-in command

Öyleyse, neden kabuğun kendinden geçmiyorsun?

~ % sudo $SHELL -c "cd name_of_dir"

5
Sudo bash -c fikri için +1 ... ve bir öneri: kullanmaktan kaçının which. Bu sadece bir senaryo ve tüm olasılıkları (ikili, yerleşik, takma adlar, vb.) İşlemeyecek. Yerine typekullanın. Çok daha güvenli, güçlü ve taşınabilir. Ve type -pçalıştırılabilir bir yol için.
MestreLion

1
Eh, bağlıdır ;-) type [ -wfpams ] name ... Equivalent to whence -v., which [ -wpams ] name ... Equivalent to whence -c.(erkek zshbuiltins)
Daniel Bauke

1
Bağımlı değil . whenceolduğunu zsh-sadece ... o yok değil bash çalışmak, hatta ubuntu varsayılan olarak yüklü değildir. POSIX olsa typeda , herhangi bir modern kabukta çalışacağı anlamına gelir ... bash, csh, ksh .. ve hatta zsh.
MestreLion

Tabi, bu yüzden ve bu yüzden yorumunuzu çıktığı anda iptal ettim, ama bahsettiğim şunun aslında bir komut dosyası olmadığını ve typeher ikisinin de aynı komuta takma adları olduğu gibi benzer sonuçlar vermesiydi .
Daniel Bauke

Şimdi anlıyorum. Eh, ama bu içeride zsh. Ubuntu'daki varsayılan (ve genellikle sadece) terminal kabuğu olan bash'te whichyerleşik değil ... bu yüzden type(veya type -p) tercih edilir.
MestreLion

4

Kendinizi root kullanıcısına yükselterek ayrıca:

sudo -s

Ardından, normal kullanıcının beğenmesine izin vermeyen herhangi bir dizine cd koyabilirsiniz:

cd /root

Veya

cd /var/lib/

Sonra orada yazdıktan sonra yazın:

exit

Kök kullanıcı ayrıcalıklarından çıkmak.

Kendinizi root olarak yükseltmek için, iki komutu &&aşağıdaki gibi operatör tarafından da birleştirebilirsiniz , bu operatör aynı zamanda yürütme sırasını korur, geçerli komut başarılı bir şekilde yürütülürse ve yalnızca bir sonraki komutun çalıştırılmasına izin verilir:

sudo -s && cd /var/lib

Veya

sudo -s && cd /root

2

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 directorybashsudosudo

Diğer yanıtlar sunulduğu gibi, çoğu kullanıcı olacak değil bunu yaparken rahatsız etmek istiyorum, ama bunun yerine isteyeceksiniz:

  1. Çalıştırın sudo -sveya sudo -ibir giriş kabuğu istiyorsanız (bunun bir etkisinin sudo -isizi kök dizininde başlatmak olduğunu unutmayın) veya seçenekleri kabuğa sudo bashzorlamak bashveya iletmek isteyip istemediğinizi unutmayın .
  2. Yeni kabukta koş .cd directory
  3. Yeni kabukta kök olarak yapılması gereken (başka) eylemleri gerçekleştirin.
  4. 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, sudotakip eder cdve sadece çalışır sudonormalde 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 exitiş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 sudoolmadan -s, -iya 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 sudoiçin sadece zaman zaman etkinleştirmek isteyebileceğiniz kadar tuhaf bir yoldur . Bu durumda, kendi dosyasına koymak daha iyidir. Bu sudo.bashdizinde ana dizininizde adı verilen bir dosya oluşturursanız , sudoiş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.bashile ç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 sudoanda 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. sudoKabuk 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 sudoiş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 directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo 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 /rootNormal davranan dikkat edin . Yalnızca cdbir dizine girmeye çalıştığımda, sudoyeni 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 cdhatta 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 -ksudosudo

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


0

Tartışılacak suveya sutartışılmayacak kadar aptalca olduğunu düşünüyorum. suUbuntu dinine karşı ve dikkatsizce yapacak bir şey değil. rm -rf *Kök olsan bir adamın neler yapabileceği şaşırtıcı . Ancak, komut satırı arayüzü (CLI) ile rahatsanız ve sistem düzeyinde yapılacak işler varsa, kullanmamanız için hiçbir neden yoktur su. Kimsenin kullanmadığı bile olsa, birkaç dağıtım kullandım sudo. Ne tür bir iş yaptığınız ve hangi yöntemle en rahat olduğunuzla ilgili. İkisini de kullanırım.


1
"Bash ve sudoben kubuntu lucid ile var, sudo cdşimdi çalışıyor - herhangi bir geçici çözüm olmadan." Kısa böyle bir şey ben varsayılan olarak Ubuntu olmamıştı eminim, nasıl görmüyorum. (Ayrıca, 10.04 kullandım; bunu yapmadım.) Bunu gönderdiğinizden bu yana yıllar geçti, ama ayrıntıları hatırlıyor musunuz? sudo cdHala senin için çalışıyor mu ? type -a sudoÇalıştığı yerde kabuğun çıktısı nedir ? Anlayamayacağınızı anlıyorum - ve cevabınızın ikinci kısmı konuyla ilgili kalıyor - ancak yaparsanız, bu konuda düzenleme yapabilirsiniz .
Eliah Kagan

@EliahKagan Şu an kesinlikle benim için 16.10'da çalışmıyor ve o zaman ne yaptığımı hatırlamıyorum. Mevcut temel komutları değiştirmek benim dinime aykırı, bu yüzden bunu yapmam pek mümkün değil. Her durumda, işe yatsaydı bile, herkes buna kötü bir alışkanlık diyecekti, çünkü genel olarak işe yaramazdı.
Joe
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.