gpt4 book ai didi

Bash- 在没有 shell 解释参数扩展字符的情况下传递输入

转载 作者:行者123 更新时间:2023-12-05 03:14:11 26 4
gpt4 key购买 nike

所以我有一个脚本,我在其中键入 script.sh,然后输入一组 if-else 语句。像这样:

    script.sh fnSw38h$?2

输出最终呼应了输入。

但我注意到 $?被解释为 0/1 所以输出将回显:

    fnSw38h12

如何阻止shell扩展字符并取其面值?

我查看了 opt noglob 之类的东西或类似的东西,但它们没有用。当我这样说时:

    script.sh 'fnSw38h$?2'

它有效。但是,当我不能像 Var='$1' 那样在其中声明变量时,如何在单引号 ('') 中捕获它

请帮忙!

最佳答案

如何将密码传递给脚本

我从评论中得知此脚本的真正目的是验证密码。 如果这是一个重要或敏感的应用程序,您确实应该使用专业的安全工具。如果此应用程序不敏感或这只是一个学习练习,请继续阅读以了解问题的初步介绍。

首先,不要这样做:

script.sh fnSw38h$?2

此密码将出现在 ps 中,并且系统上的任何用户都可以看到纯文本

相反,让用户键入密码作为脚本的输入,例如:

#!/bin/sh
IFS= read -r var

这里,read 将收集来自键盘的输入,不受 shell 干扰,它不会出现在 ps 输出中。

var 将有密码供您验证,但您真的不应该将纯文本密码保存在任何地方供您验证。最好通过单向散列来放置密码,然后将散列与您保存在文件中的内容进行比较。例如:

var=$(head -n1 | md5sum)

在这里,head 将读取一行(密码)并将其传递给 md5sum,后者会将其转换为哈希值。可以将该散列值与该用户密码的已知正确散列值进行比较。 head 返回的文本将正是用户键入的内容,不会被 shell 破坏。

其实,对于一个已知的哈希算法,可以对常用的密码做一个反查表。因此,解决方案是创建一个名为 salt 的变量,它具有一些用户相关信息:

var=$( { head -n1; echo "$salt"; } | md5sum)

盐不必保密。它只是让查找表更难计算。

然而,md5sum 算法被发现有一些弱点。因此,它应该被更新的哈希算法所取代。正如我所写,这可能是一个 sha-2 变体。

同样,如果这是一个敏感的应用程序,请不要使用自制工具

原始问题的答案

how do I capture that within single quotes ('') when I can't state variables inside it like Var='$1'

答案是您不需要。例如,考虑这个脚本:

#!/bin/sh
var=$1
echo $var

首先,注意 $$$? 都是 shell 变量:

$ echo $$ $? 
28712 0

现在,让我们试试我们的脚本:

$ bash ./script.sh '$$ $?'
$$ $?

这些变量没有展开是因为 (1) 当它们出现在命令行时,它们被单引号括起来,并且 (2) 在脚本中,它们被分配给变量,而 bash 确实不要递归扩展变量。换句话说,在 echo $var 行上,bash 将扩展 $var 以获得 $$ $?但它停在那里。它不会扩展 var 中的内容。

关于Bash- 在没有 shell 解释参数扩展字符的情况下传递输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26330359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com