为什么在将 x-shellscript 转换为 x-可执行文件后,参数 $0 只给出基本名称而不是完整路径?

为什么在将 x-shellscript 转换为 x-可执行文件后,参数 $0 只给出基本名称而不是完整路径?

我的问题是,该参数$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] 中。如果您在运行时指定目录(而不是依赖路径),它将获得正确的名称。

相关内容