我有一个查找所有证书的脚本。系统上的身份,然后我想再添加一个证书。并删除其余的证书,除了最近添加的。
第一个循环查找我们在系统中有多少个标识并将数组设置为$var1 $var2 $var3
而不是。继续。
然后我再添加一个。
现在,我想在此处删除1个循环数组值以进行循环。但是我的$ DEL变量是var1 var2,而不是我们在第一个循环中设置的实际身份。
#!/bin/bash
DOM=$(/usr/sbin/dsconfigad -show | grep "Active Directory Domain" | awk '{ print $5 }')
MAC=$(/usr/sbin/dsconfigad -show | grep "Computer Account" | awk '{ print $4 }' | tr -d "$")
HOST=$MAC.$DOM
CRT=$(security find-identity -v | grep $HOST | awk '{ print $2}')
set - $CRT; index=0; while [ "$1" ];
do
let index=$index+1;
eval var${index}="$1";
shift;
done
上面的循环结果是:+ set - 02KFKDSF89SFMDFMFS7908934M90DODFSMN78345 K69SKLD04KCM62469933FA60567LLFD730957FA3 489FHDFS93MDF89UY2345905DFSKDDSKFDS9FSEF
echo $var1
echo $var2
回显$ var1为:02KFKDSF89SFMDFMFS7908934M90DODFSMN78345
回显$ var2为:K69SKLD04KCM62469933FA60567LLFD730957FA3
NUMCRT=$index
echo "Number of Certificate is $NUMCRT"
echo "Add of Script part bla bla Start"
echo "ADD one more Cert"
echo "Add of Script part bla bla END"
现在我要删除在第一个循环中找到的数组值。但是$DEL
的价值即将到来var1
var2
var3
,而不是02KFKDSF89SFMDFMFS7908934M90DODFSMN78345
K69SKLD04KCM62469933FA60567LLFD730957FA3
489FHDFS93MDF89UY2345905DFSKDDSKFDS9FSEF
。
for i in $(seq 1 $NUMCRT);
do
let $i;
DEL="var$i"
echo "Delete number $DEL"
done
它应该在第二个echo "Delete number $DEL"
循环值中显示for
,如下所示。
Delete number 02KFKDSF89SFMDFMFS7908934M90DODFSMN78345
Delete number K69SKLD04KCM62469933FA60567LLFD730957FA3
Delete number 489FHDFS93MDF89UY2345905DFSKDDSKFDS9FSEF
答案 0 :(得分:0)
您不需要运行dsconfigad。
domain=''; machine='';
while IFS="=" read key val
do case "$key" in
"Active Directory Domain"*) domain=$( echo $val ) ;; # strip space
"Computer Account"*) machine=$( echo $val ) ;; # strip space
*) if [[ -n "$domain" ]] &&
[[ -n "$machine" ]]
then break
fi;;
esac
done < <( /usr/sbin/dsconfigad -show )
我找不到包含详细选项的security find-identity -v
的好例子,因此我将通过使用您的命令结构来伪造我的方式,尽管我仍然不会使用所有-给vars封顶(不要这样做)。
declare -a crt=( $( security find-identity -v | grep $machine.$domain | awk '{ print $2}' ) )
现在,这些值位于$crt[@]
数组中,并按数字进行索引。
如果您知道要删除的索引的索引,
unset "crt[$num]"
这确实在您的阵列中留下了一个孔...
另外,也可以使用值本身作为键,而不必跟踪索引并在数组中留空。
declare -A crt=()
while read one
do crt[$one]=1
done < <( security find-identity -v | grep $HOST | awk '{ print $2}' ) )
现在您可以使用
将其删除unset "crt[$val]" # assuming $val is the key
或通过
浏览它们for val in "${!crt[@]}"
do : something with the key...
done
有用吗?
一如既往,请大家检查一下。我没有安装这些工具。盲目工作并可能搞砸了一些东西。 :)