我正在编写一个Bash命令行工具,用于访问钥匙串,以模拟Web浏览器与网页进行通信。
从那里获取存储在钥匙串中的密码非常简单:
PASSWORD=`security find-internet-password -gs accounts.google.com -w`
但是提取电子邮件地址有点棘手,因为你得到的最具体的命令会返回很多信息:
$security find-internet-password -gs accounts.google.com
/Users/me/Library/Keychains/login.keychain"
class: "inet"
attributes:
0x00000007 <blob>="accounts.google.com"
0x00000008 <blob>=<NULL>
"acct"<blob>="my-email-address@gmail.com"
"atyp"<blob>="form"
"cdat"<timedate>=0x32303135303333303134333533315A00 "20150330143531Z\000"
"crtr"<uint32>="rimZ"
"cusi"<sint32>=<NULL>
"desc"<blob>=<NULL>
"icmt"<blob>=<NULL>
"invi"<sint32>=<NULL>
"mdat"<timedate>=0x32303135303333303134333533315A00 "20150330143531Z\000"
"nega"<sint32>=<NULL>
"path"<blob>="/ServiceLogin"
"port"<uint32>=0x00000000
"prot"<blob>=<NULL>
"ptcl"<uint32>="htps"
"scrp"<sint32>=<NULL>
"sdmn"<blob>=<NULL>
"srvr"<blob>="accounts.google.com"
"type"<uint32>=<NULL>
password: "my-password"
如何从"acct"<blob>=
开始的行中提取帐户电子邮件地址,并将其存储到名为EMAIL
的变量中?
答案 0 :(得分:1)
如果您使用多个grep
,cut
,sed
和awk
语句,通常可以用一个awk
替换它们。< / p>
PASSWORD=$(security find-internet-password -gs accounts.google.com -w)
EMAIL=$(awk -F\" '/acct"<blob>/ {print $4}'<<<$PASSWORD)
这在单行上可能更容易,但我无法使用security
命令打印出与您类似的输出以进行测试。另外,在StackOverflow上显示它有点长:
EMAIL=$(security find-internet-password -gs accounts.google.com -w | awk -F\" '/acct"<blob>/ {print $4}')
/acct"<blob>/
是正则表达式。此特定awk
命令行将过滤掉与此正则表达式匹配的行。 -F\"
将输出除以给定的字段。在您的行中,字段变为:
acct
<blob>
my-email-address@gmail.com
{print $4}
表示打印出第四个字段。
顺便说一句,通常最好在Shell脚本中使用$(....)
而不是后退。 $( ... )
更容易看到,您可以将子命令括在主命令之前执行:
foo=$(ls $(find . -name "*.txt"))
答案 1 :(得分:0)
EMAIL=`security find-internet-password -s accounts.google.com | grep acct | cut -d "=" -f 2`
EMAIL="${EMAIL:1:${#EMAIL}-2}" # remove the brackets
说明:
grep acct
仅保留包含字符串&#34; acct&#34; cut -d "=" -f 2
根据分隔符&#34; =&#34;解析该行。并保留第二部分,即&#34; =&#34;之后的部分; sign,括号内的电子邮件地址EMAIL="${EMAIL:1:${#EMAIL}-2}"
删除该字符串的第一个和最后一个字符,为我们留下我们正在寻找的干净的电子邮件地址