Criando um arquivo e substituindo variáveis no bash

1

Antecedentes: Eu criei um serviço de VPN para mim. Eu tenho muito tempo em mãos e gosto do desafio de criar serviços "como negócios", para que eu possa criar um portfólio para mim. Eu criei este script para criar um perfil de cliente para o OpenVPN e quero limpá-lo. É desleixado, mas estou trabalhando para limpá-lo agora que funciona.

Minha pergunta: Eu quero criar um arquivo pré-determinado para um cliente usar. Alguns dados devem ser adicionados a ele, com base em variáveis anteriores.

O script atual:

#!/bin/bash

### Set PATH ###
BACKUP=/var/BACKUPS
OVPN=/etc/openvpn/
CA=/etc/openvpn/ca.crt
RSA=/etc/openvpn/easy-rsa
KEYS=/etc/openvpn/easy-rsa/keys
HTML=/var/dir/for/user/dl

### Move to working directory ###
cd $RSA

### Trial/30 day/90 day/365 day ###
PS3='What kind of subscriber is being created?: '
options=("7 Day Trial" "30 Day Subscriber" "90 Day Subscriber" "1 Year Subscriber" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "7 Day Trial")
            echo -e "You have selected 7 day trial.\nUsing vars7."
            source ./vars7
            break
            ;;
        "30 Day Subscriber")
            echo -e "You have selected 30 day subscriber.\nUsing vars30."
            source ./vars30
            break
            ;;
        "90 Day Subscriber")
            echo -e "You have selected 90 day subscriber.\nUsing vars90."
            source ./vars90
            break
            ;;
        "1 Year Subscriber")
            echo -e "You have selected 1 year subscriber.\nUsing vars365."
            source ./vars365
            break
            ;;
        "Quit")
            break
            ;;
        *) echo invalid option;;
    esac
done

### Catch input for user and build/sign keys and certificates ###
echo "Please enter the user's name:"
read USER
echo "Starting process now..." 
./build-key $USER

### Set new PATHs ###
BASECRT=$(sed -n 68,97p $KEYS/$USER.crt)
BASECA=$(cat $CA)
BASEKEY=$(cat $KEYS/$USER.key)

### create stream-lined option file ###
cat > $OVPN/$USER.ovpn <<EOF
client
;dev tap
dev tun
;proto tcp
proto udp
remote SERVER 1194
remote SERVER 1194
remote-random
resolv-retry infinite
nobind
;user nobody
;group nogroup
persist-key
persist-tun
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
;mute-replay-warnings
ca ca.crt
cert $USER.crt
key $USER.key
ns-cert-type server
;tls-auth ta.key 1
;cipher x
comp-lzo
verb 3
;mute 20
<ca>
$BASECA
</ca>
<cert>
$BASECRT
</cert>
<key>
$BASEKEY
</key>

EOF

### Make Directories needed ###
mkdir $HTML/$USER
mkdir $BACKUP/$USER
mkdir $HTML/$USER/keys

### Store Backups ###
cp $KEYS/$USER.* $BACKUP/$USER
cp $OVPN/$USER.ovpn $BACKUP/$USER
tar -czvf $BACKUP/$USER.tar.gz $BACKUP/$USER

### Move keys and options to user's directory for download ###
cp $KEYS/$USER.* $HTML/$USER/keys
cp $OVPN/$USER.ovpn $HTML/$USER
cp $CA $HTML/$USER/keys
chmod 755 $HTML/$USER/*

Eu usei cat > $OVPN/$USER.ovpn << EOF para criar o USER.ovpn com fluxo. $BASECRT , $BASEKEY , etc são substituídos por seus respectivos arquivos codificados em base64.

Eu quero me livrar desse enorme bloco de texto do meu script. Brinquei com o uso de cat < shellfile > Newfile - mas isso não substitui as variáveis e, em vez disso, as adiciona ao novo arquivo como $BASECRT , etc

Agora, eu poderia usar 'sed' para ler o primeiro grupo de linhas geradas no arquivo do cliente, cat acrescentar ao arquivo do cliente, depois sed as próximas linhas, repetir esse processo até que eu obtenha o arquivo do cliente concluído.

Mas tem que haver uma maneira mais fácil e mais limpa de fazer isso. Eu nunca tive que criar um arquivo longo como este. Obrigado. :)

    
por a b 31.03.2017 / 15:25

1 resposta

1

Você poderia usar o comando source , colocar os comandos criar arquivo de opções em linha de fluxo em um arquivo separado, e fonte no script principal quando todos os as variáveis utilizadas foram atribuídas,

# USER.ovpn 

### create stream-lined option file ###
cat > $OVPN/$USER.ovpn <<EOF
client
;dev tap
dev tun
;proto tcp
proto udp
remote SERVER 1194
remote SERVER 1194
remote-random
resolv-retry infinite
nobind
;user nobody
;group nogroup
persist-key
persist-tun
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
;mute-replay-warnings
ca ca.crt
cert $USER.crt
key $USER.key
ns-cert-type server
;tls-auth ta.key 1
;cipher x
comp-lzo
verb 3
;mute 20
<ca>
$BASECA
</ca>
<cert>
$BASECRT
</cert>
<key>
$BASEKEY
</key>

EOF

Seu script principal poderia ser feito,

#!/bin/bash

### Set PATH ###
BACKUP=/var/BACKUPS
OVPN=/etc/openvpn/
CA=/etc/openvpn/ca.crt
RSA=/etc/openvpn/easy-rsa
KEYS=/etc/openvpn/easy-rsa/keys
HTML=/var/dir/for/user/dl

### Move to working directory ###
cd $RSA

### Trial/30 day/90 day/365 day ###
PS3='What kind of subscriber is being created?: '
options=("7 Day Trial" "30 Day Subscriber" "90 Day Subscriber" "1 Year Subscriber" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "7 Day Trial")
            echo -e "You have selected 7 day trial.\nUsing vars7."
            source ./vars7
            break
            ;;
        "30 Day Subscriber")
            echo -e "You have selected 30 day subscriber.\nUsing vars30."
            source ./vars30
            break
            ;;
        "90 Day Subscriber")
            echo -e "You have selected 90 day subscriber.\nUsing vars90."
            source ./vars90
            break
            ;;
        "1 Year Subscriber")
            echo -e "You have selected 1 year subscriber.\nUsing vars365."
            source ./vars365
            break
            ;;
        "Quit")
            break
            ;;
        *) echo invalid option;;
    esac
done

### Catch input for user and build/sign keys and certificates ###
echo "Please enter the user's name:"
read USER
echo "Starting process now..." 
./build-key $USER

### Set new PATHs ###
BASECRT=$(sed -n 68,97p $KEYS/$USER.crt)
BASECA=$(cat $CA)
BASEKEY=$(cat $KEYS/$USER.key)

### create stream-lined option file ###

source USER.ovpn     # ". USER.ovpn" also works

### Make Directories needed ###
mkdir $HTML/$USER
mkdir $BACKUP/$USER
mkdir $HTML/$USER/keys

### Store Backups ###
cp $KEYS/$USER.* $BACKUP/$USER
cp $OVPN/$USER.ovpn $BACKUP/$USER
tar -czvf $BACKUP/$USER.tar.gz $BACKUP/$USER

### Move keys and options to user's directory for download ###
cp $KEYS/$USER.* $HTML/$USER/keys
cp $OVPN/$USER.ovpn $HTML/$USER
cp $CA $HTML/$USER/keys
chmod 755 $HTML/$USER/*
I had used cat > $OVPN/$USER.ovpn 
    
por 01.04.2017 / 00:27