Odmowa pozwolenia
Aby uruchomić skrypt, plik musi mieć ustawiony wykonywalny bit uprawnień .
Aby w pełni zrozumieć uprawnienia do plików w systemie Linux , możesz zapoznać się z dokumentacją chmod
polecenia. chmod , skrót od zmiany trybu , to polecenie używane do zmiany ustawień uprawnień pliku.
Aby przeczytać dokumentację chmod dla systemu lokalnego, uruchom man chmod
lub info chmod
z wiersza poleceń. Po przeczytaniu i zrozumieniu powinieneś być w stanie zrozumieć wynik działania ...
ls -l foo.sh
... która wyświetli uprawnienia do odczytu, zapisu i wykonania dla właściciela pliku, właściciela grupy i wszystkich innych, którzy nie są właścicielem pliku lub członkiem grupy, do której należy plik (ta ostatnia grupa uprawnień jest czasami nazywana jako „świat” lub „inny”)
Oto podsumowanie sposobów rozwiązywania problemów z błędem odmowy uprawnień w Twoim przypadku.
$ 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
Właściciel ma prawa odczytu i zapisu rw, ale - wskazuje, że brakuje uprawnienia do pliku wykonywalnego
Te chmod
poprawki Polecenie to. (Grupa i inne mają tylko uprawnienia do odczytu pliku, nie mogą do niego pisać ani go wykonywać)
$ 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
^ ^ ^
Jeśli chodzi o Linuksa, foo.sh jest teraz wykonywalny.
Korzystanie z wyników sudo w poleceniu nie znaleziono
Kiedy uruchamiasz polecenie za pomocą sudo , skutecznie uruchamiasz je jako superużytkownik lub root.
Przyczyną, dla której użytkownik root nie może znaleźć polecenia, jest prawdopodobnie to, że PATH
zmienna środowiskowa dla użytkownika root nie zawiera katalogu, w którym foo.sh
się znajduje . Dlatego polecenie nie zostało znalezione.
Zmienna środowiskowa PATH zawiera listę katalogów, w których wyszukiwane są polecenia. Każdy użytkownik ustawia własną zmienną PATH zgodnie ze swoimi potrzebami. Aby zobaczyć, co ma działać
env | grep ^PATH
Oto przykładowe wyniki uruchomienia powyższego env
polecenia najpierw jako zwykły użytkownik, a następnie jako użytkownik root za pomocą sudo
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
Zauważ, że chociaż podobne, w tym przypadku katalogi zawarte w PATH dla nieuprzywilejowanego użytkownika (rkielty) i superużytkownika nie są tym samym .
Katalog, w którym foo.sh
rezyduje, nie jest obecny w zmiennej PATH użytkownika root, dlatego polecenie nie zostało znalezione .
sudo
, by byłPATH
taki sam jak użytkownik?Inne rozwiązania, które tu widziałem, opierają się na niektórych definicjach systemowych, ale w rzeczywistości możliwe jest
sudo
użycie bieżącegoPATH
(za pomocąenv
polecenia) i / lub reszty środowiska (z-E
opcją) po prostu wywołując je prawidłowo :W rzeczywistości można z tego zrobić alias:
(Możliwe jest również nazwanie samego aliasu
sudo
, zastępując oryginałsudo
).źródło
command not found
problemów występujących w dystrybucji Ubuntu. Dzięki../bashrc
aby zapisać go między sesjamiSprawdź secure_path w sudo
Jeśli
$PATH
jest zastępowany, użyjvisudo
i edytuj/etc/sudoers
źródło
chmod +x foo.sh
#!/bin/sh
lub coś takiego.sudo pwd
źródło
Możesz również utworzyć miękki link do swojego skryptu w jednym z katalogów (
/usr/local/bin
na przykład) w superużytkowniku PATH. Będzie wtedy dostępny dla sudo.Spójrz na tę odpowiedź, aby mieć pojęcie, w którym katalogu umieścić miękki link.
źródło
Wygląda na to, że linux powie „polecenie nie znaleziono”, nawet jeśli wyraźnie podasz ścieżkę do pliku.
Jest to nieco mylący błąd, ale prawdopodobnie technicznie poprawny. Plik nie jest poleceniem, dopóki nie jest wykonywalny, więc nie można go znaleźć.
źródło
Ok, to jest moje rozwiązanie: w ~ / .bash_aliases po prostu dodaj:
Voila! Teraz możesz wykonywać własne skrypty za pomocą sudo lub ustawić jako ROOT bez konieczności wykonywania eksportu PATH = $ PATH: / home / your_user / bin za każdym razem.
Zauważ, że muszę być wyraźny podczas dodawania mojej PATH, ponieważ HOME dla superużytkownika to / root
źródło
Spróbuj
chmod u+x foo.sh
zamiast tego,chmod +x foo.sh
jeśli masz problemy z powyższymi przewodnikami. To zadziałało dla mnie, gdy inne rozwiązania nie.źródło
Powyżej znajdują się doskonałe odpowiedzi. Jeśli po ich wypróbowaniu nadal możesz
command not found
spróbować ponownie z całą ścieżką pliku:źródło