我有一个名为的小脚本文件testing.sh
,我要求用户输入其登录名和密码。然后,使用md5sum
命令对密码进行加密,并将结果存储在results.txt
格式为的文件中login:md5password
。但是,当我查看results.txt
文件时,我只得到login:
,加密的密码没有连接。我做错了什么?
文件如下testing.sh
:
#!bin/bash
read -p 'Your login: ' uservar
read -sp 'Your password: ' passvar
var=$passvar|md5sum
echo $uservar:$var > ~/Desktop/results.txt
results.txt
文件:
login:
答案1
var
你以错误的方式完成作业。
var=$passvar|md5sum
您应该将其发送"$passvar"
到md5sum
。它不会|
自行通过管道,因此您需要使用echo
或printf
。这将输出内容到stdout
流中。您可以使用命令替换将其捕获到变量中$(...)
。换句话说,您应该这样做:
var=$( echo "$passvar" | md5sum )
另外,请记住引用变量以保持存储在其中的数据的完整性,并防止单词拆分。
其他事宜:
$ read -sp 'Your password:' passvar
Your password:$ var=$( echo "$passvar" | md5sum )
$ echo "$var"
2b00042f7481c7b056c4b410d28f33cf -
请注意以下两点:"Your password" 后面没有换行符,因此您可能需要echo
在该命令后面添加换行符。其次,请注意md5sum
计算出的 md5 校验和后面的输出文件名,在本例中为-
或stdin
流。您可能需要考虑通过任何允许您删除单词的文本处理实用程序删除该部分,例如awk
:
var=$( echo "$passvar" | md5sum | awk '{print $1}')
或者,您也可以使用bash
read 和 here-string <<<
(请参阅这有关该运算符的更多信息):
$ read var trash <<< $( echo "$passvar" | md5sum )
$ echo "$var"
2b00042f7481c7b056c4b410d28f33cf
最后但同样重要的一点是,您的行之前#!
缺少了- 应该是。/
bin
#!/bin/bash
完整的脚本应该是这样的:
#!/bin/bash
read -p 'Your login: ' uservar
read -sp 'Your password: ' passvar
printf "\n"
read var trash <<< "$(printf "%s" "$passvar" | md5sum)"
printf "%s:%s" "$uservar" "$var" #> ~/results.txt
请注意,我注释掉了重定向到文件,只是为了在终端上查看输出以进行测试。它的工作原理如下:
$ ./testing.sh
Your login: johndoe
Your password:
johndoe:912ec803b2ce49e4a541068d495ab570$
为了便于将来参考,您可以set -x
在之后添加#!/bin/bash
(当然,前提是您已正确定义了该#!
行)来排除脚本故障,并查看实际运行的命令以及可能出现的错误。或者直接使用外壳检查在线工具。
答案2
以下脚本也对我有用。
#!/bin/bash
echo -n 'Your login:'
read uservar
echo -n 'Your password:'
read -s passvar
printf "\n"
encrpt=$(echo "$passvar" | md5sum | awk '{print $1;}')
echo "$uservar":"$encrpt" > /home/bond/result.txt
输出
bond@hp-pc:~$ ./test.sh
Your login:bond
Your password:
bond@hp-pc:~$ cat result.txt
bond:22c291f0335f869c154d8081854d9119