Sudo kullanılırken komut bulunamadı


146

foo.shAna klasörümde bir komut dosyası var .

Bu klasöre gidip girdiğimde ./foo.sh,

-bash: ./foo.sh: Permission denied.

Kullandığımda sudo ./foo.sh,

sudo: foo.sh: command not found.

Bu neden oluyor ve nasıl düzeltebilirim?

Yanıtlar:


151

İzin reddedildi

Bir komut dosyasını çalıştırmak için dosyanın yürütülebilir izin biti ayarlanmış olması gerekir .

Linux dosya izinlerini tam olarak anlamak için chmodkomutun belgelerini inceleyebilirsiniz . Değişiklik modunun kısaltması olan chmod , bir dosyanın izin ayarlarını değiştirmek için kullanılan komuttur.

Yerel sisteminizin chmod belgelerini okumak için man chmodveya info chmodkomut satırından çalıştırın . Okuduktan ve anladıktan sonra koşmanın çıktısını anlayabilmelisiniz ...

ls -l foo.sh

... dosya sahibi, grup sahibi ve dosya sahibi veya dosyanın ait olduğu grubun üyesi olmayan herkes için READ, WRITE ve EXECUTE izinlerini listeleyecektir (son izin grubuna bazen atıfta bulunulur) "dünya" veya "diğer" olarak)

Durumunuzda İzin Reddedildi hatasının nasıl giderileceği hakkında bir özet .

$ ls -l foo.sh                    # Check file permissions of foo
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh 
    ^^^ 
 ^^^ | ^^^   ^^^^^^^ ^^^^^
  |  |  |       |       | 
Owner| World    |       |
     |          |    Name of
   Group        |     Group
             Name of 
              Owner 

Sahibi okuma ve yazma erişimi rw var ama - yürütülebilir izin eksik olduğunu gösterir

chmodKomut giderdiği. (Grup ve diğerleri yalnızca dosyada okuma iznine sahiptir, dosyaya yazamaz veya yürütemezler)

$ chmod +x foo.sh               # The owner can set the executable permission on foo.sh
$ ls -l foo.sh                  # Now we see an x after the rw 
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
   ^  ^  ^

foo.sh artık Linux konusunda yürütülebilir.

Komutta sudo sonuçlarını kullanma bulunamadı

Sudo kullanarak bir komut çalıştırdığınızda , etkin bir şekilde süper kullanıcı veya kök olarak çalıştırırsınız.

Kök kullanıcı komutu bulma olmadığını nedeni olasıdır PATHroot için ortam değişkeni içermez dizini foo.shyer almaktadır . Bu nedenle komut bulunamadı.

PATH ortam değişkeni, komutlar için aranan dizinlerin bir listesini içerir. Her kullanıcı kendi PATH değişkenini ihtiyaçlarına göre ayarlar. Neyin çalıştırıldığını görmek için

env | grep ^PATH

Yukarıdaki envkomutu önce sıradan bir kullanıcı olarak ve ardından sudo kullanan kök kullanıcı olarak çalıştırmanın bazı örnek çıktısı

rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

rkielty@rkielty-laptop:~$ sudo env | grep ^PATH
[sudo] password for rkielty: 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Benzer olmasına rağmen, bu durumda PATH'de bulunan dizinlerin ayrıcalıksız kullanıcı (rkielty) ve süper kullanıcının aynı olmadığını unutmayın .

foo.shKök kullanıcının PATH değişkeninde ikamet ettiği dizin bu nedenle komut bulunamadı hatası.


1
@Nakilon, tüm ayrıntıları içeren bir soruya koyarsanız, sizin için daha fazla sorun giderebilmem gerekir. Sorun büyük olasılıkla hangi kabuğun (ilk komut kabuğunuz veya sudo tarafından başlatılan kabuk) $ PWD
Rob Kielty

6
@Rob: öyleyse nasıl bir marka yok sudo's PATHkullanıcının aynı?
Tom

1
@Rob: Bu arada bir yol buldum (aşağıdaki cevabıma bakın).
Tom

1
Açıklamanı sevdim! Teşekkürler :)
Kasparov92

1
@Tom / etc / sudoers içindeki secure_path dosyasını değiştirebilirsiniz
DennisLi

98

Burada şimdiye kadar gördüğüm diğer çözümler bazı sistem tanımlarına dayanıyor, ama aslında sudoakımı PATH( envkomutla) ve / veya ortamın geri kalanını ( -Eseçenekle) doğru şekilde çağırarak kullanmak mümkün. :

sudo -E env "PATH=$PATH" <command> [arguments]

Aslında, bundan bir takma ad yapılabilir:

alias mysudo='sudo -E env "PATH=$PATH"'

( sudoOrijinali değiştirerek takma adı da adlandırmak mümkündür sudo.)


3
Bu çözümü seviyorum Tom, çünkü bilinçli olarak farklı bir sudo invokasyonu ile çalışıyorsunuz. Ne şekilde kurulursa kurulsun (ve çoktur) PATH değişkeninin her zaman kullanımda olduğuna dikkat etmek önemlidir.
Rob Kielty

4
Bunun command not foundUbuntu dağıtımında karşılaşılan sorun için doğru ve en standart çözüm olduğuna inanıyorum . Teşekkürler dostum.
Omar Tariq

./bashrcoturumlar arasında kaydetmek için takma adı ekleyebilirsiniz
George

19

Sudo üzerinde secure_path olup olmadığını kontrol edin

[root@host ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin

Eğer $PATHgeçersiz kılınan kullanımını ediliyor visudove düzenle/etc/sudoers

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

Teşekkürler! Bu, sudo'nun komutları çalıştıramama gizemini çözmeye yardımcı oldu.
Evgeny Goldin

7
  1. Komut dosyasında yürütme izniniz olup olmadığını kontrol edin. yanichmod +x foo.sh
  2. Bu komut dosyasının ilk satırının #!/bin/shveya bunun gibi bir şey olup olmadığını kontrol edin .
  3. Sudo için yanlış dizindesiniz. ile kontrol etsudo pwd

5

Ayrıca /usr/local/bin, süper kullanıcı PATH'indeki dizinlerden birinde ( örneğin) komut dosyasına yumuşak bir bağlantı da oluşturabilirsiniz . Daha sonra sudo tarafından kullanılabilir.

chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo

Yumuşak bağlantıyı hangi dizine koyacağınıza dair bir fikir edinmek için bu cevaba bir göz atın .


2

Görünüşe göre, dosya yolunu açıkça verseniz bile linux "komut bulunamadı" diyecektir.

[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
sudo: /tmp/uid.sh: command not found
1
[veeam@jsandbox ~]$ chmod +x /tmp/uid.sh
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
0

Bu biraz yanıltıcı bir hata, ancak muhtemelen teknik olarak doğru. Bir dosya yürütülebilir olana kadar bir komut değildir ve bu nedenle bulunamaz.


1

Tamam bu benim çözüm: ~ / .bash_aliases sadece aşağıdakileri ekleyin:

# ADDS MY PATH WHEN SET AS ROOT
if [ $(id -u) = "0" ]; then
   export PATH=$PATH:/home/your_user/bin 
fi

İşte bu kadar! Artık kendi komut dosyalarınızı sudo ile yürütebilir veya bir dışa aktarma yapmak zorunda kalmadan ROOT olarak ayarlayabilirsiniz. PATH = $ PATH: / home / your_user / bin her seferinde.

Süper kullanıcı için HOME / root olduğundan PATH'ımı eklerken açık olmam gerektiğine dikkat edin


1

Yukarıdaki kılavuzlarla ilgili sorun yaşıyorsanız chmod u+x foo.shbunun yerine deneyin chmod +x foo.sh. Diğer çözümler işe yaramadığında bu benim için çalıştı.


1

Yukarıda mükemmel cevaplar var. Bunları denedikten sonra, command not foundyine de tüm dosya yolunu tekrar deneyebilirsiniz:

sudo /home/user/path/to/foo.sh
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.