Bash에서 파일 생성 및 변수 바꾸기

Bash에서 파일 생성 및 변수 바꾸기

배경: 저는 VPN 서비스를 직접 만들었습니다. 나는 자유 시간이 많고 스스로 포트폴리오를 만들 수 있도록 "비즈니스 같은" 서비스를 만드는 도전을 즐깁니다. OpenVPN용 클라이언트 구성 파일을 생성하기 위해 이 스크립트를 만들었고 이를 정리하고 싶습니다. 엉성하지만 이제는 제대로 작동하고 정리하는 중입니다.

내 질문: 클라이언트가 사용할 미리 결정된 파일을 만들고 싶습니다. 이 데이터 중 일부는 이전 변수를 기반으로 추가되어야 합니다.

현재 스크립트:

#!/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/*

cat > $OVPN/$USER.ovpn << EOFStreamlined를 만드는 데 사용한 USER.ovpn. $BASECRT등 은 $BASEKEYbase64로 인코딩된 해당 파일로 대체되었습니다.

내 스크립트에서 이 거대한 텍스트 블록을 제거하고 싶습니다. 나는 사용해 보았지만 이것은 변수를 대체하지 않고 변수 등과 같은 cat < shellfile > Newfile새 파일에 추가합니다 .$BASECRT

지금 나는할 수 있다'sed'를 사용하여 클라이언트 파일로 출력되는 첫 번째 라인 세트를 읽고, 클라이언트 파일에 cat을 추가한 다음, 다음 몇 라인을 sed하고, 완전한 클라이언트 파일을 얻을 때까지 이 프로세스를 반복합니다.

하지만 이를 수행하려면 더 쉽고 깔끔한 방법이 있어야 합니다. 이렇게 긴 파일을 만든 적이 없습니다. 감사해요. :)

답변1

source명령을 사용할 수 있습니다.간소화된 옵션 파일 만들기명령을 별도의 파일로 저장하고원천사용된 모든 변수가 할당되면 기본 스크립트로 이동합니다.

# 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

그러면 기본 스크립트가 다음을 수행할 수 있습니다.

#!/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 

관련 정보