Heim > Java > Hauptteil

Die Verwendung von Zeichenfolgenparametern im Bash-Skript schlägt fehl

WBOY
Freigeben: 2024-02-22 12:37:21
nach vorne
756 Leute haben es durchsucht

在bash脚本中使用字符串参数可能出现问题。php小编柚子为您解决这个java问答:在bash脚本中使用字符串参数失败的疑惑。本文将带您深入了解问题根源,并提供解决方案,让您轻松解决这一常见问题。

问题内容

我需要创建一些证书,并想为此编写一个小型 bash 脚本。

首先,我在创建自己的 bash 脚本方面没有太多经验。

我想将最重要的值(例如计算机名称和密码)作为参数传递。不幸的是我收到错误:

keytool错误:java.io.ioexception:ava格式不正确

该错误表明命令中的字符串未正确解释。 我认为问题是我没有正确使用字符串,但我不明白到底出了什么问题。

如果我在终端中输入这样的命令,它就可以正常工作

#!/bin/bash

echo "$1" # servername
echo "$2" # domain
echo "$3" # password
echo

keytool -noprompt -keystore $1.$2.truststore.jks -alias CARoot -import -file ca.cert -storetype jks -storepass $3 -keypass $3

keytool -genkey -noprompt -keyalg RSA -storetype pkcs12 -alias $1.$2 -dname $1'.'$2',O=COMPANY,OU=COMPANY,L=NY,ST=NY,C=us' \
      -ext 'SAN=DNS:example1.com,DNS:example2.com'
      -keystore $1.$2'.keystore2.jks' -storepass $3 -keypass $3
Nach dem Login kopieren

你能告诉我我做错了什么吗?

解决方法

尝试一下,使用正确的引用、正确的行尾转义,并将缺少的 cn= 添加到 -dname 选项字符串中。:

keytool -genkey -noprompt -keyalg rsa -storetype pkcs12 -alias "$1.$2" \
      -dname "cn=$1.$2,o=company,ou=company,l=ny,st=ny,c=us" \
      -ext 'san=dns:example1.com,dns:example2.com' \
      -keystore "$1.$2.keystore2.jks" -storepass "$3" -keypass "$3"
Nach dem Login kopieren

下面的调查细节和观察结果...

您告诉我们 in a comment 这有效:

server_name="$1"
domain="$2"
password="$3"

keytool -noprompt -keystore "$server_name.$domain.truststore.jks" -alias caroot -import -file ca.cert -storetype jks -storepass "$password" -keypass "$password"
Nach dem Login kopieren

you tell us in another comment 认为这有效:

keytool -genkey -noprompt \
-keyalg rsa \
-storetype pkcs12 \
-alias server.example.com \
-dname 'cn=server.example.com,o=company,ou=company,l=ny,st=ny,c=us' \
-ext "san=dns:example.com, dns:example2.com" \
-keystore server.example.com.keystore.jks \
-storepass 'passwort!#' \
-keypass 'passwort!#'
Nach dem Login kopieren

如果上面带有硬编码值的第二个脚本有效,那么使用变量作为我们稍后从脚本参数填充的选项的脚本也必须有效:

#!/usr/bin/env bash

the_alias='server.example.com'
the_dname='cn=server.example.com,o=company,ou=company,l=ny,st=ny,c=us'
the_keystore='server.example.com.keystore.jks'
the_pass='passwort!#'

keytool -genkey -noprompt \
-keyalg rsa \
-storetype pkcs12 \
-alias "$the_alias" \
-dname "$the_dname" \
-ext 'san=dns:example.com, dns:example2.com' \
-keystore "$the_keystore" \
-storepass "$the_pass" \
-keypass "$the_pass"
Nach dem Login kopieren

如果可行,那么我们只需要映射在不起作用的命令中用作选项的值(从您的问题复制并每行列出一个值,以便与我正在使用的其他脚本和缺少转义已修复):

keytool -genkey -noprompt \
-keyalg rsa \
-storetype pkcs12 \
-alias $1.$2 \
-dname $1'.'$2',o=company,ou=company,l=ny,st=ny,c=us' \
-ext 'san=dns:example1.com,dns:example2.com' \
-keystore $1.$2'.keystore2.jks' \
-storepass $3 \
-keypass $3
Nach dem Login kopieren

填充我们从传递给脚本的参数中引入的变量,而不是对它们进行硬编码,然后这必须起作用:

#!/usr/bin/env bash

the_alias="$1.$2"
the_dname="cn=${the_alias},o=company,ou=company,l=ny,st=ny,c=us"
the_keystore="${the_alias}.keystore.jks"
the_pass="$3"

keytool -genkey -noprompt \
-keyalg rsa \
-storetype pkcs12 \
-alias "$the_alias" \
-dname "$the_dname" \
-ext 'san=dns:example.com, dns:example2.com' \
-keystore "$the_keystore" \
-storepass "$the_pass" \
-keypass "$the_pass"
Nach dem Login kopieren

您将上述内容称为:

./the_script 'server' 'example.com' 'passwort!#'
Nach dem Login kopieren

那么——这有效吗?如果没有,我提供的上述 2 个脚本中哪一个失败了?

在进行编码时,我注意到,除了失败脚本中 -ext 行末尾缺少引号和反斜杠之外:

  • 您所说的有效代码版本使用 keystore.jks,而您所说无效的版本则使用 keystore2.jks(请注意 2
  • 类似地,对于 san=dns:example.comsan=dns:example1.com (注意 1)。
  • , 之后的空白字符仅出现在工作 -ext 中 选项字符串。
  • 工作脚本中的 -dname 选项启动 与 cn= 而在失败的情况下则不然。

这些有问题吗?

这是您处理空格和连接字符串的方式。在脚本中传递参数时,需要正确引用变量以处理值包含空格的情况。

尝试修改脚本的版本:

#!/bin/bash
server_name="$1"
domain="$2"
password="$3"
echo "$server_name"
echo "$domain"
echo "$password"
keytool -noprompt -keystore "$server_name.$domain.truststore.jks" -alias CARoot -import -file ca.cert -storetype jks -storepass "$password" -keypass "$password"
keytool -genkey -noprompt -keyalg RSA -storetype pkcs12 -alias "$server_name.$domain" -dname "$server_name.$domain,O=COMPANY,OU=COMPANY,L=NY,ST=NY,C=us" \
      -ext "SAN=DNS:example1.com,DNS:example2.com" -keystore "$server_name.$domain.keystore2.jks" -storepass "$password" -keypass "$password"
Nach dem Login kopieren

此脚本正确引用变量并确保正确处理带空格的文件名和值。一定要尝试一下!

Das obige ist der detaillierte Inhalt vonDie Verwendung von Zeichenfolgenparametern im Bash-Skript schlägt fehl. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!