如何将密码传递给脚本
我从 cmets 获悉,此脚本的真正目的是验证密码。 如果这是一个重要或敏感的应用程序,您确实应该使用专业的安全工具。如果此应用程序不敏感或者这只是一个学习练习,那么请继续阅读以了解这些问题的初步介绍。
首先,不要这样做:
script.sh fnSw38h$?2
此密码将出现在ps 中,并且系统上的任何用户都可以看到纯文本。
相反,让用户输入密码作为脚本的输入,例如:
#!/bin/sh
IFS= read -r var
在这里,read 将从键盘收集输入,不受外壳干扰,并且不会出现在 ps 输出中。
var 将有密码供您验证,但您确实不应该将纯文本密码保存在任何地方供您验证。最好将密码放入单向散列,然后将散列与您保存在文件中的内容进行比较。例如:
var=$(head -n1 | md5sum)
在这里,head 将读取一行(密码)并将其传递给md5sum,md5sum 会将其转换为哈希。该散列可以与该用户密码的已知正确散列进行比较。 head 返回的文本将与用户键入的内容完全相同,不会被 shell 破坏。
其实对于一个已知的hash算法,可以对常用密码做一个反向查表。因此,解决方案是创建一个名为salt 的变量,其中包含一些用户相关信息:
var=$( { head -n1; echo "$salt"; } | md5sum)
盐不必保密。它只是让查找表更难计算。
然而,md5sum 算法被发现有一些弱点。因此,它应该被更新的哈希算法所取代。在我写的时候,这可能是一个sha-2 变体。
同样,如果这是一个敏感的应用程序,请不要使用自制工具
回答原问题
当我不能像 Var='$1' 这样在其中声明变量时,如何在单引号 ('') 中捕获它
答案是你不需要。例如,考虑这个脚本:
#!/bin/sh
var=$1
echo $var
首先,注意$$和$?都是shell变量:
$ echo $$ $?
28712 0
现在,让我们试试我们的脚本:
$ bash ./script.sh '$$ $?'
$$ $?
这些变量没有展开是因为(1)它们出现在命令行时,它们是单引号,(2)在脚本中,它们被分配给变量并且bash没有展开变量递归地。换句话说,在echo $var 行上,bash 将扩展$var 以得到$$ $?,但它停止了。它不会扩展 var 中的内容。