自动从 bash 脚本将文本输入到命令

自动从 bash 脚本将文本输入到命令

我的问题和另一个问题很相似这里但又不完全相同。我有一系列命令来创建 ssl 密钥/crt 等。我希望能够创建一个自动的、默认的。这些是命令(它们来自这一页):

openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

如果每个人只接受一个论点,那就没问题,我会做类似的事情

openssl genrsa -des3 -out server.key 2048 <<< arg1

但其中一个需要按顺序请求多达 10 个输入。

我尝试过类似的方法,但没有成功

openssl genrsa -des3 -out server.key 2048 << foo
arg1
arg2
foo

编辑:我认为这种方法实际上是有效的,但不适用于应该是密码的参数。有人有解决方法吗?

某些参数是密码会有所不同吗?

解决这个问题最简单的方法是什么?

答案1

这按预期工作...多年来我一直通过管道将heredocs发送到openssl来创建证书(例如,我在2002年的某个时候编写了下面的脚本,这是该脚本的“新”版本...不知道我第一次写的时候它)。

您需要提供全部openssl 期望的输入,按照它期望的确切顺序,即使其中一些输入只是一个空行(接受默认值)。

例如,这是我的脚本(稍加编辑的版本),用于为 postfix 生成自签名证书:

#! /bin/sh

umask 077

# $site is used for the subdir to hold the certs AND for
# the certificate's Common Name
site="$1"
mkdir -p $site

umask 277

REQ="$site/key.pem"
CERT="$site/cert.pem"
SERV="$site/server.pem"
FING="$site/cert.fingerprint"

# certificate details for herenow script (configurable)
COUNTRY="AU"                # 2 letter country-code
STATE="Victoria"            # state or province name
LOCALITY="Melbourne"        # Locality Name (e.g. city)
ORGNAME="organisation name" # Organization Name (eg, company)
ORGUNIT=""                  # Organizational Unit Name (eg. section)
EMAIL="[email protected]"    # certificate's email address
# optional extra details
CHALLENGE=""                # challenge password
COMPANY=""                  # company name

DAYS="-days 365"

# create the certificate request
cat <<__EOF__ | openssl req -new $DAYS -nodes -keyout $REQ -out $REQ
$COUNTRY
$STATE
$LOCALITY
$ORGNAME
$ORGUNIT
$site
$EMAIL
$CHALLENGE
$COMPANY
__EOF__

# sign it - will ask for demoCA's password
openssl ca $DAYS -policy policy_anything -out $CERT -infiles $REQ

# cert has to be readable by postfix
chmod 644 $CERT

# create server.pem for smtpd by concatenating the certificate (cert.pem) +
# demoCA's public certificate + the host's private key (key.pem)
cat $CERT ./demoCA/cacert.pem $REQ >$SERV

# create fingerprint file
openssl x509 -fingerprint -in $CERT -noout > $FING

注意:这里没有错误检查,只是假设 openssl 对于此特定任务所需的输入的确切顺序。如果您想要错误检查,请使用expectperlExpect.pm或 python 的pexpect.

相关内容