Warum akzeptiert mein Shell-Skript keine Argumente, wenn es von PATH ausgeführt wird?

Warum akzeptiert mein Shell-Skript keine Argumente, wenn es von PATH ausgeführt wird?

Ich habe gerade den Quellcode für ein Programm namensJohnTheRipper. Wenn ich es derzeit ausführen möchte, johnmuss ich cdin das run/Verzeichnis gehen und es mit ausführen ./john. Mir wäre es jedoch viel lieber, wenn ich den johnBefehl von jedem beliebigen Verzeichnis aus ausführen könnte, als wäre er systemweit installiert. Ich kann dafür keinen Alias ​​erstellen, da ich Parameter an die Binärdatei übergeben können muss. Also habe ich versucht, ein kleines Shell-Skript zu erstellen.

#!/bin/bash

/home/username/tools/JohnTheRipper/run/john $@

Ich habe dieses Skript so platziert, /usr/local/bindass es in meinem Pfad liegt. Dieses Skript funktioniert, aberNURwenn ich es durch Angabe des Pfades ausführe.

$ ls john -la
-rwxr-xr-x 1 root root 56 Mar 20 03:54 john
$ ./john --test
Will run 4 OpenMP threads
Benchmarking: descrypt, traditional crypt(3) [DES 256/256 AVX2-16]... (4xOMP)
...

Es funktioniert nicht, wenn ich versuche, es mithilfe der $PATHUmgebungsvariable auszuführen

$ which john
/usr/local/bin/john
$ john --test
bash: syntax error near unexpected token `--test'

Warum ist das so? Warum werden die Befehlszeilenargumente nicht an mein Shell-Skript übergeben? Und wie kann ich es so einrichten, dass ich den johnBefehl aus jedem beliebigen Verzeichnis ausführen und ihm Argumente übergeben kann?

NotizDie Lösung muss in der Lage sein, relative Pfade zu akzeptieren, wenn Parameter an John übergeben werden. Wenn ich mich beispielsweise im Verzeichnis d/mit einer Datei befinde, wordlist.txtmöchte ich John folgendermaßen ausführen können:

john --wordlist=./wordlist.txt

Antwort1

DerKommentar von Kamil Maciorowskihat mir geholfen, dieses Problem zu lösen. Es war ein Benutzerfehler.

$ type -a john
john is aliased to `(cd ~/tools/JohnTheRipper/run/ && ./john )'
john is /usr/local/bin/john

Oben sehen Sie die Ausgabe von type -a. Ich habe ursprünglich einen Alias ​​erstellt, der ein Subskript verwendet, und als das nicht funktionierte, habe ich versucht, die ausführbare Datei zu verknüpfen, ich habe verschiedene Aliase ausprobiert und ich habe versucht, das oben genannte Skript zu erstellen. Nichts davon hat jedoch funktioniert, da ich jedes Mal, wenn ich eine Änderung an vornahm, Folgendes ausführte .bashrc:

$ source .bashrc

Mir war nicht bewusst, dass sourcemein ursprünglicher johnAlias ​​dadurch nicht überschrieben wird. Da Aliase Vorrang vor der $PATHVariable haben, johnwurde die ganze Zeit dieselbe ursprüngliche Subshell ausgeführt, die keine Argumente akzeptierte. Durch Ausführen von unalias johnfunktioniert jetzt alles.

NOTIZIch stimme zu, dass dies zum Erstellen eines symbolischen Links in /usr/local/bindie bessere Alternative wäre. In dieser Situation funktioniert es jedoch leider nicht, wie Sie der folgenden Ausgabe entnehmen können:

$ ls -la john
lrwxrwxrwx 1 root root 39 Mar 20 12:31 john -> /home/username/tools/JohnTheRipper/run/john
$ john --test
fopen: $JOHN/john.conf: No such file or directory

verwandte Informationen