带循环的Bash脚本

带循环的Bash脚本,bash,shell,loops,Bash,Shell,Loops,我正在尝试创建bash脚本,以便在一个具有不同参数的循环中通过openssl生成证书。 当然,用不同的参数编写多行代码很容易,比如: #!/bin/bash openssl req -x509 -sha256 -nodes -days 1 -newkey rsa:1024 -keyout private1024_1.key -out RSA_1024_1_SHA256.crt -subj "/C=XX/ST=XXX/L=XXX /O=xxx/OU=xxx/CN=xx.xx/emailAddres

我正在尝试创建bash脚本,以便在一个具有不同参数的循环中通过openssl生成证书。 当然,用不同的参数编写多行代码很容易,比如:

#!/bin/bash
openssl req -x509 -sha256 -nodes -days 1 -newkey rsa:1024 -keyout private1024_1.key -out RSA_1024_1_SHA256.crt -subj "/C=XX/ST=XXX/L=XXX /O=xxx/OU=xxx/CN=xx.xx/emailAddress=xx@xx.xx"
openssl req -x509 -sha256 -nodes -days 3 -newkey rsa:1024 -keyout private1024_3.key -out RSA_1024_3_SHA256.crt -subj "/C=XX/ST=XXX/L=XXX /O=xxx/OU=xxx/CN=xx.xx/emailAddress=xx@xx.xx"
但我认为这不是一个好的做法。 因此,我想创建一些带有变量的循环,我可以在其中设置:

  • 天数
  • rsa类型(1024/2048/4096)
  • 根据rsa类型和日数确定的私钥名称
  • 根据rsa类型和日期编号确定的证书名称
关于-subj,我认为只需制作一个单独的变量表,并在需要时进行更改。我对编码不太熟悉,但希望有可能通过循环实现这个想法

如果有任何提示或模式,我将不胜感激

实现下一步(它正在工作):

#/bin/bash
#证书详情;用您自己的信息替换尖括号中的项目
subc=”
C=XX
ST=XXX
O=XXXX
LocationName=XXX-xx
commonName=xxx.xx
organizationalUnitName=xxx xx
电子邮件地址=test@xxx.xx
"
声明-a天=(1 3 5 10 15 30 365)
声明-a rsatype=(1024 2048 4096)
声明-a sha=(sha1 md5 sha256 sha512)
dd=7
rst=3
shat=4
对于((i=0;i
对于天数和rsa类型,您可以使用两个数组,而私钥的名称和证书的名称是根据这两个数组的数据确定的。然后在数组元素上迭代一个循环。 例如:

#/bin/bash
声明-a天=(13)
声明-a rsatype=(1024 2048)
tot=2
对于((i=0;i
  • 第一:创建一个函数,将所有更改的参数作为参数:

    myCreateX509() {
        local keylen keyexp crtnam keyname
        keylen=${1:-1024}  # Key length as 1st arg,default to 1024
        keyexp=${2:-1}     # Key expire as 2nd arg default to 1
        printf -v crtnam 'RSA_%d_%d_SHA256.crt' $keylen $keyexp
        printf -v keynam 'private%d_%d.key' $keylen $keyexp
        openssl req -x509 -sha256 -nodes -days $keyexp  -newkey rsa:$keylen \
            -keyout $keynam -out $crtnam -subj \
             "/C=XX/ST=XXX/L=XXX /O=xxx/OU=xxx/CN=xx.xx/emailAddress=xx@xx.xx"
    }
    
  • 然后创建循环

    printf -v EndLess "2932896-%(%s)T/86400" -1
    EndLess=$((EndLess))
    
    while read klen kexp;do
        myCreateX509 $klen $kexp
    done <<eof
    1024 1
    1024 2
    2048 3
    ...
    4096 $EndLess
    eof
    
    这将生成
    3个密钥长度x 6过期时间=18个文件


这将只生成两个文件:
1:1024
3:2048
。您必须封装两个循环,以便在每个
数组上进行迭代
。第2行和第4行可以分组为
declare-a days=(13)
,如第3行和第5行:
declare-a rsatype=(1024 2048)
。Syntax<代码>用于((i=0;i@F.Hauri感谢您的评论,我更新了答案。关于循环:我将问题解释为需要days/rsa类型的特定组合,因此是单循环。当然,要生成所有组合,需要两个嵌套循环。不幸的是,这不起作用…openssl在将其参数键入和输出时出现问题。请尝试查看通过echo$keyout获取的内容,看起来一切正常,但openssl显示:private1024_1.key未知选项req[options]输出选项所在的文件are@MaximShyrokyy尝试使用
bash-x
运行脚本,该脚本将准确打印出所有被调用的命令。它应该让您知道选项不正确的位置。两种不同的方法:1:迭代想要的列表或2:迭代两个数组Try实现您的解决方案,但得到语法错误:意外结束当然,我试图找到如何修复它,但没有找到有效的解决方案。。。
myCreateX509() {
    local keylen keyexp crtnam keyname
    keylen=${1:-1024}  # Key length as 1st arg,default to 1024
    keyexp=${2:-1}     # Key expire as 2nd arg default to 1
    printf -v crtnam 'RSA_%d_%d_SHA256.crt' $keylen $keyexp
    printf -v keynam 'private%d_%d.key' $keylen $keyexp
    openssl req -x509 -sha256 -nodes -days $keyexp  -newkey rsa:$keylen \
        -keyout $keynam -out $crtnam -subj \
         "/C=XX/ST=XXX/L=XXX /O=xxx/OU=xxx/CN=xx.xx/emailAddress=xx@xx.xx"
}
printf -v EndLess "2932896-%(%s)T/86400" -1
EndLess=$((EndLess))

while read klen kexp;do
    myCreateX509 $klen $kexp
done <<eof
1024 1
1024 2
2048 3
...
4096 $EndLess
eof
printf -v EndLess "2932896-%(%s)T/86400" -1
EndLess=$((EndLess))

for kl in 1024 2048 4096;do
    for ke in 1 2 3 10 3650 $EndLess;do
        myCreateX509 $kl $ke
    done
done