基础知识:我有一个.crt文件(认证授权文件),他由许多字段组成,但在一行中恢复这个问题,我有这个:
Certificate:
...(alot of stuff before)...
Subject: C=US, ST=Maryland, L=Pasadena, O=Brent Baccala,
OU=FreeSoft, CN=www.freesoft.org/emailAddress=baccala@freesoft.org
Subject Public Key Info:
...(alot of stuff after)
我需要解析文件以填充.csv文件,我已经完成了我需要帮助的问题,我需要得到该字段:
CN=www.fresoft.org
但是当我得到这种CN = ...(值而不是......)时有很多斜杠我在解析中遇到错误,就像原始字符串一样:
CN=foo/bar/the/hell/emailAddress=blablabla
我只需要:
foo/bar/the/hell
有一会儿我在正确的列中得到了它,但是当我没有使用emailAddress时,我的解析失败了,然后我在CN .csv列中输入了错误的信息,而不是
|CN|
foo/bar/the/hell
我得到:
|CN|
OU=FreeSoft, foo/bar/the/hell.
我有这个代码进行CN解析:
#!/bin/bash
subject_line=$(echo $cert | grep -o "Subject:.*Subject Public Key Info")
cn=$(echo $subject_line | grep -o "CN=.*" )
if [ $(echo $cn | grep -c ".*email.*") -gt 0 ]; then
end_cn=$(echo $cn | grep -b -o emailAddress)
end_cn_idx=$(echo $end_cn | grep -o .*:)
final_end_cn=${end_cn_idx:0:-1}
common_name=${cn:3:$final_end_cn-4}
echo $common_name
else
end_cn=$(echo $cn | grep -b -o "Subject Public Key Info")
end_cn_idx=$(echo $end_cn | grep -o .*:)
final_end_cn=${end_cn_idx:0:-1}
common_name=${cn:3:$final_end_cn-5}
echo $common_name
fi
答案 0 :(得分:0)
这样的事可能有用:
CN=$(openssl x509 -in /path/to/your.crt -noout -subject |
sed -r 's|.*CN=(.*)|\1|; s|/[^/]*=.*$||')
在Perl中执行此操作会更容易,因为与sed
不同,Perl可以执行非贪婪的匹配:
CN=$(openssl x509 -in /path/to/your.crt -noout -subject |
perl -ne 'print "$1" if m|.*CN=(.*?)(?:/[^/]*?=.*)?$|')