Automatize a entrada textual para um comando a partir de um script bash

2

A minha pergunta é bastante semelhante a outra aqui mas não exatamente o mesmo. Eu tenho uma seqüência de comandos para criar uma chave / chave ssl. E quero ser capaz de criar um padrão automatizado. Estes são os comandos (eles vieram de esta página ):

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

Se cada um deles aceitasse apenas um argumento, então tudo bem e eu faria algo como

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

Mas um deles precisa de até 10 entradas que ele pede sequencialmente.

Eu tentei algo assim, mas não funcionou

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

EDIT: Esta abordagem está realmente funcionando, eu acho, mas não para os argumentos que deveriam ser senhas. Alguém tem uma solução para isso?

Poderia fazer diferença que alguns dos argumentos sejam senhas?

Qual é a maneira mais simples de fazer isso?

    
por Devman 27.11.2015 / 01:35

1 resposta

1

Isso funciona como esperado ... Estive passando heredocs para openssl para criar certs por anos (por exemplo, escrevi o script abaixo em algum momento de 2002, e essa é a "nova" versão do script ... não faço ideia de quando eu escrevi primeiro).

Você precisa fornecer ALL das entradas que o openssl espera, na ordem exata em que ele as espera, mesmo que algumas dessas entradas sejam apenas uma linha em branco (para aceitar o padrão). / p>

Por exemplo, aqui está (uma versão levemente editada de) meu script para gerar certificados auto-assinados para o 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

NOTA: não há verificação de erros aqui, apenas suposições sobre a ordem exata de entrada requerida pelo openssl para esta tarefa em particular. Se você quiser verificar o erro, use expect ou perl Expect.pm ou pexpect de python.

    
por 27.11.2015 / 02:13