为什么我的 shell 脚本从 PATH 运行时不接受参数?

为什么我的 shell 脚本从 PATH 运行时不接受参数?

我刚刚编译了一个名为开膛手约翰。目前,如果我想运行,john我必须cd进入run/目录并使用 执行它./john。但是,我更希望能够john从任何目录运行该命令,就好像它是在系统范围内安装的一样。我无法为此创建别名,因为我需要能够将参数传递给二进制文件。所以我尝试制作一个小的 shell 脚本。

#!/bin/bash

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

我把这个脚本放入/usr/local/bin我的路径中。这个脚本可以工作,但是仅有的如果我通过指定路径来运行它。

$ 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)
...

$PATH如果我尝试使用环境变量运行它,它将不起作用

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

为什么会出现这种情况?为什么命令行参数没有传递给我的 shell 脚本?我该如何设置才能john从任何目录运行该命令,并允许我向其传递参数?

笔记解决方案在向 john 传递参数时必须能够接受相对路径。例如,如果我在d/包含文件的目录中wordlist.txt,我希望能够按如下方式运行 john:

john --wordlist=./wordlist.txt

答案1

Kamil Maciorowski 的评论帮我解决了这个问题。这是用户错误。

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

在上面你可以看到 的输出type -a。我最初创建了一个使用下标的别名,当它不起作用时,我尝试符号链接可执行文件,我尝试了不同的别名,并尝试创建上述脚本。然而,这些都不起作用,因为每次我对 进行更改时,.bashrc我都会运行

$ source .bashrc

我不知道这source不会覆盖我原来的john别名...由于别名优先于$PATH变量,所以整个过程中john都在执行相同的原始子 shell,该子 shell 不会接受参数。通过运行unalias john,现在一切都正常了。

笔记当谈到在 中创建符号链接时/usr/local/bin,我同意这将是一个更好的选择,但不幸的是它在这种情况下不起作用,正如您从以下输出中看到的那样:

$ 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

相关内容