对OS X的钥匙串的命令行访问 - 如何获取与帐户关联的电子邮件地址

时间:2015-04-09 13:46:19

标签: macos bash keychain

我正在编写一个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的变量中?

2 个答案:

答案 0 :(得分:1)

如果您使用多个grepcutsedawk语句,通常可以用一个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}"删除该字符串的第一个和最后一个字符,为我们留下我们正在寻找的干净的电子邮件地址