Odmowa dostępu do skryptu Bash & Zły interpreter

Korzystam z 64-bitowego systemu Kali Linux.

Stworzyłem skrypt w Pythonie, który zaczyna się od 2 argumentów.Nie chcę wpisywać za każdym razem dokładnie tych samych ścieżek ani przeszukiwać historii poleceń, których użyłem w terminalu. Postanowiłem więc stworzyć prosty skrypt, który wywołuje skrypt w języku Python wraz z jego argumentami.

#! /bin bash python CreateDB.py ./WtfPath ./NoWtfPath/NewSystem/ 

Jest to dokładnie to samo polecenie, którego użyłbym w terminalu. Jednak pojawia się komunikat o błędzie, gdy próbuję uruchomić plik skryptu.

bash: ./wtf.sh: /bin: bad interpreter: Permission denied 

wtf.sh ma prawa do wykonywania.

Co się stało?

Odpowiedź

Masz tutaj spację zamiast ukośnika:

 #! /bin bash  

Powinien być:

 #! /bin/bash  

lub po prostu

 #!/bin/bash  

(pierwsza spacja jest opcjonalna). Po shebang (#!) powinna następować ścieżka do pliku wykonywalnego , po której może następować jeden argument , np.

 #!/usr/bin/env sh  

W tym przypadku /usr/bin/env to plik wykonywalny; zobacz man env, aby uzyskać szczegółowe informacje.

Po prostu /bin odnosi się do katalogu.

Komentarze

  • cholera, głupia ja! Dzięki! Czy nie ' nie widziałem …
  • Możesz przyzwyczaić się do używania #!/bin/sh (zamiast z #!/bin/bash), chyba że wiesz, że używasz funkcji bash.
  • @ G-Man Dzięki za wyczyszczenie tego trochę w górę. WRT bash vs. sh, po prostu podążałem za wzorem z pytania (chociaż mam tendencję do używania sh tylko wtedy, gdy wiem, że ' m nie przy użyciu funkcji basha).
  • W terminalu Ubuntu pomocne jest which bash. To zwraca /bin/bash. U góry mojego skryptu Bash dodaję #!/bin/bash. Następnie, gdy chcę uruchomić skrypt Bash, wpisuję bash foo.sh. Dlatego which sh jest używane w ten sam sposób. sh foo.sh
  • @ G-Man, w świecie pracy jest niefortunna liczba ludzi, którzy nie ' t wiedzieć , czy używają funkcji Bash, czy nie. W wielu przypadkach ' lepiej jest mieć skrypt nie uruchamiany w ogóle (ponieważ Bash jest określony w shebang, ale go brakuje) niż uruchamiać i wykonywać coś nieoczekiwanego (ponieważ /bin/sh to coś innego niż Bash, aw skrypcie są niezauważone Bashizmy). Zobacz tutaj.

Odpowiedź

Warto zauważyć, że jeśli punkt montowania, w którym znajduje się twój skrypt, ma atrybut „noexec”, możesz wbić wszystko, co chcesz, a to nadal nie zadziała, ale wywołanie interpretera ze skryptem jako argumentem będzie (o ile to z kolei nie próbuje uruchomić innego skryptu na montowaniu noexec).

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *