我必须获取多个域名的用户输入,直到用户完成输入。输入可以是一个域名,也可以是多个域名。并且域名应该用逗号分隔,
。
如何将域名传递给以下命令。请帮助我。
keytool -genkey -keystore tc_keystore.jks -keysize 2048 -keypass password -storepass password -keyalg RSA \
-dname "CN=domain1.com,OU=Devteam,O=Softech,L=Chicago,ST=IL,C=US" \
-alias domain1.com -ext san=dns:domain2,domain3,domain4,domain5,domain6,domain7
由于我是 shell 脚本的新手,我正在读取单个用户输入并将其存储在变量中并调用该变量。就像下面这个一样。但是当涉及到应该用逗号分隔的多个用户输入时,我陷入了困境。
keytool -genkey -keystore $keystore -keysize 2048 -keypass $password -storepass $password -keyalg RSA \
-dname "CN=$domain1,OU=Devteam,O=Softech,L=Chicago,ST=IL,C=US" \
-alias $domain1 -ext san=dns:domain2,domain3,domain4,domain5,domain6,domain7
答案1
让用户向脚本提供数据的常见方法是通过其命令行参数。例如,在这种情况下,使用域名列表调用脚本会很方便。由于用户需要提供密码和其他一些与密钥相关的参数,因此我们可以开发一个包含两个选项和一个域列表的脚本。
./script -p 'password' -k 'keystore' domain1 domain2 domain3 ...
我不知道keytool
您正在使用的实用程序,但似乎用户必须提供至少两个域的列表,而不仅仅是一个域。第一个域名与-dname
和选项一起使用-alias
,而该-ext
选项在其值中采用第二个域名和任何其他域名。
以下代码使用惯用的方式解析命令行选项并验证 和keystore
变量password
是否具有值。然后,它keytool
使用用户提供的数据调用该实用程序。
#!/bin/sh
unset -v keystore password
while getopts k:p: opt; do
case $opt in
k)
keystore=$OPTARG
;;
p)
password=$OPTARG
;;
*)
echo 'Error' >&2
exit 1
esac
done
shift "$(( OPTIND - 1 ))"
if [ -z "$keystore" ] || [ -z "$password" ]; then
echo 'Missing keystore (-k) and/or password (-p)' >&2
exit 1
fi
if [ "$#" -lt 2 ]; then
echo 'Expecting at least two domain names' >&2
echo '(a main one, and one for the -ext option)' >&2
exit 1
fi
domain1=$1
shift
IFS=,
keytool -genkey \
-keystore "$keystore" \
-keysize 2048 \
-keypass "$password" \
-storepass "$password" \
-keyalg RSA \
-dname "CN=$domain1,OU=Devteam,O=Softech,L=Chicago,ST=IL,C=US" \
-alias "$domain1" \
-ext "san=dns:$*"
在第一个shift
语句之后,第一个域名将在 中$1
,其他域名将在$2
, $3
, 中,依此类推。我们分配$1
给domain1
变量并调用shift
.在第二个之后shift
,我们可以使用"$*"
withIFS
设置为逗号来生成其余域名的逗号分隔字符串。我们在选项的值中使用它-ext
。