我的问题是,该参数$0
给出的结果与 相同${0##*/}
,并且在使用 SHC 程序将 x-shellscript 转换为 x-可执行文件之后发生这种情况!
操作系统:Debiab-8.2-jessie SHC 版本:3.8.7 使用的 cmd:shc -f script.bash
编译后的 script.x 驻留在额外的 bin 路径中(sudo 不知道)。 笔记我创建了一个 hello world 程序来打印参数 $0,它总是给我基本名称!
我的脚本文件包含:
#!/bin/bash
((!EUID)) || exec sudo "$0"
# shellcode ...
当我执行它时,我得到这个:
sudo:脚本名称:找不到命令
检查后我发现该参数$0
与 x 可执行文件相同${0##*/}
或$(basename $0)
位于 x 可执行文件内!
如果不在脚本中放置绝对路径,我该如何处理?或者当我使用 SHC 将 shell 编译为 x 可执行文件时,我应该知道什么?
答案1
为什么选择SHC?
首先,考虑到您的“业余爱好者”动机,您为什么要使用 SHC?以下是他们自己的描述的摘录:
执行时,编译后的二进制文件将使用 shell -c 选项解密并执行代码。不幸的是,它不会像真正的 C 程序那样提高速度。
编译后的二进制文件仍将依赖于 shell 代码第一行中指定的 shell(即 #!/bin/sh),因此 shc 不会创建完全独立的二进制文件。
SHC 的主要目的是保护您的 shell 脚本免遭修改或检查。
- 我的想法(我会保持简短):即使您的动机是防止修改的规定“主要目的”,一个意志坚定的人仍然可以恢复(并因此修改)原始脚本! SHC本质上提供了默默无闻的安全,当用作基本的安全手段。如果这听起来没有帮助,那么我建议放弃 SHC 并像大多数其他人一样简单地使用 shell 脚本。如果您的 shell 脚本需要真正的安全性,我建议您询问一个具体问题,而不使用 SHC 或“编译器”。
具体的 $0 问题
我从以下位置下载了 SHC 3.8.9这一页只是为了尝试一下。
我无法在 Ubuntu 14.04 LTS 上重现该问题。
#!/bin/bash
echo "Hello, world. My name is \`$0'"
测试运行
$ ./shc -f my_test.bash
$ ~/path/to/my_test.bash.x
Hello, world. My name is `~/path/to/my_test.bash.x'
因此,很明显,我们的系统有所不同。如果您发布有关您的操作系统、SHC 版本和的更多详细信息,我可以尝试更新此答案具体的shc
你用来“编译”它的shell 脚本和命令行。
为什么需要路径?
为什么你的脚本需要知道它的路径?您是否使用脚本存储文件?如果用户未指定,它是否“默认”对其运行的目录进行操作?这些事情是否是好主意是一个见仁见智的问题,但了解你的动机可能有助于缩小这个答案的范围。
如何获取当前目录
该pwd
命令获取当前目录。在许多情况下,您可以使用以下内容来组装脚本的完整路径(假设它是使用显式相对路径运行的):
realname="`pwd`/$0"
...这会产生如下值:
/path/to/script/./yourscript.bash.x
额外的./
仅意味着“当前目录”,因此虽然它可能在美观上令人遗憾,但它不会对结果产生负面影响。
如果脚本只是在您的 中$PATH
,那么您需要使用which
而不是pwd
,但我们已经超出了原始问题的范围,所以我将简单地提到确定路径名可能是一个棘手的过程,特别是如果您需要以安全的方式这样做,那么最好将其留给另一个问题,并按照这些思路进行具体的问题陈述。
答案2
这似乎是因为 bash (和/或 ld.so)在通过路径搜索查找二进制文件时没有将可执行文件的全名放入 argv[0] 中。如果您在运行时指定目录(而不是依赖路径),它将获得正确的名称。