linux 挑战性:忽略bash脚本中的特殊字符

iqxoj9l9  于 2023-08-03  发布在  Linux
关注(0)|答案(2)|浏览(161)

我有一个非常简单的脚本,它会在屏幕上显示第一个参数传递给它的内容,字符串总是出错,问题是这个脚本是从另一个程序调用的,并将一个变量作为第一个参数传递给那个脚本,所以我没有办法改变字符串本身,只能改变它被调用或传递的方式。
例如,在

var string=test@$134!'
ssh user@server ./echo_string.sh #string#

字符串

string#是我将变量传递给shell脚本的方式,它被替换为test@$134!',但它不会显示在日志中,也不会被打印出来。

当我用./echo_string.sh #string#调用脚本时,我要查找的输出是test@$134!'
请注意,前面的只是一个例子,字符串可以在任何位置有任何特殊字符

6tdlim6h

6tdlim6h1#

那么,另一个程序只是调用popen("yourscript.sh test@$134!'")或类似的使用单个字符串的API调用吗?
如果是这种情况,那么应用程序必须更加努力地转义test@$134!'-它需要转义$'!,也许还有@和某些其他字符,如果它们存在于执行解释的popen shell中。即调用popen("yourscript.sh test\@\$134\!\'")。根据语言的不同,您可能必须对这些字符进行双转义,以确保语言字符串处理器不会使用反斜杠:popen("yourscript.sh test\\@\\$134\\!\\'")-如果调用者是C或C++,您将需要它。
在许多情况下,简单地在参数周围使用显式双引号就足够了,因为这会导致许多shell转义不会被尝试-但是因为您的字符串包含美元符号($),一些或所有短语可能被解释为shell变量。在短语周围使用单引号是一个更强大的反处理器,但是字符串中的单引号是一个问题。也许使用引号 Package 器可以减少需要转义的符号数量(singlequote用于singlequote,而doublequote用于doublequote)
如果调用者程序使用的是一个参数数组API,比如exec({"yourscript.sh", "test@$134!'"}),并且文档中说调用是直接的,没有shell,那么参数在到达脚本之前就没有被解释的风险,但是你可能想直接从调用者程序调用脚本解释器:exec({"/bin/bash", "yourscript.sh", "test@$134!'"})
问题可能出在你的剧本里。您需要确保每当使用$1时,都将其引用为“$1”,以确保它不会扩展。如果你将$1复制到一个命名变量,那么记住总是要引用它。
您可能需要同时进行这两种修复。
如果您担心参数可能被解释为命令选项,那么您需要检查正在使用的命令的语法。许多命令支持特殊的--选项,该选项禁止选项处理器。但有些人没有。我不确定是否有法律的的方法将字符串“-E”作为单个命令进行echo。虽然echo确实尝试慷慨,并打印整个单词,如果它看到任何字符不是选项,所以echo -End工作正常(在bash)。Bash还支持printf命令,所以你可以使用它:printf "%s\n" "-e"-任何选项都必须在格式字符串之前,所以注入不会被误解。

a8jjtwal

a8jjtwal2#

试试这个pls:

var string='test@$134!'"'"

字符串
1.我在逃跑!“带单引号
1.我在末尾加上一个单引号
在我的shell中,变量可以完全按照您的要求打印。

相关问题