OpenWrt 라우터에서 WireGuard를 자동화하려고 하는데 구성 파일을 생성할 때 중첩 변수와 관련된 몇 가지 문제가 발생합니다. 내가 설정한 변수는 다음과 같습니다.
export LAN="guest"
export interface="10.0.5"
export DDNS="my-ddns.no-ip.com"
export WG_${LAN}_server_port="51820"
export WG_${LAN}_server_IP="10.0.5.1/24"
export WG_${LAN}_server_firewall_zone="${LAN}"
마지막 세 변수는 다음과 같이 확장됩니다.
export WG_guest_server_port="51820"
export WG_guest_server_IP="10.0.5.1/24"
export WG_guest_server_firewall_zone="guest"
conf 파일에서 정의하려고했습니다.끝변수를 확장하여 매개변수
cat <<EOF > "/etc/wireguard/peer.conf"
Endpoint = ${DDNS}:${WG_${LAN}_server_port}
EOF
불행하게도 나는 얻었다-ash: 구문 오류: 잘못된 대체
변수가 포함된 변수를 어떻게 호출하나요? $LAN 변수를 확장하고 첫 번째 $LAN 변수에 종속되는 $WG_guest_server_port도 확장해야 합니다.
NB Ash는 일반적으로 Busybox와 함께 제공되는 Bash의 경량 버전입니다. 저는 OpenWrt 커뮤니티 위키용 스크립트를 작성 중이므로 ash(Busybox)가 모든 OpenWrt 버전에 포함되어 있습니다.
답변1
${WG_${LAN}_server_port}
내가 아는 어떤 쉘에서도 작동하지 않습니다. Ksh, Bash 또는 Zsh에서는 간접 참조를 취하고 다른 변수 내에 명명된 변수를 참조할 수 있습니다.
하지만 당신은 OpenWrt와 ash에 대해 이야기하고 있으므로 아마도 POSIX 기능만 노출했을 것입니다.
eval
이 경우에는 있는 그대로 돌아가고 싶을 수도 있습니다 .
비슷한 작업을 수행할 수 있습니다. 먼저 WG_guest_server_port
의 내용을 다른 변수에 간접적으로 로드한 다음 여기 문서에서 이를 사용합니다.
eval "serverport=\${WG_${LAN}_server_port}"
cat <<EOF > "/etc/wireguard/peer.conf"
Endpoint = ${DDNS}:${serverport}
EOF
이는 내용이 ${LAN}
한 줄의 일부가 된다는 것을 의미합니다.암호. 악의적인 사용자는 스크립트가 임의의 명령을 실행하도록 하는 특수 값을 형성할 수 있습니다. 따라서 $LAN
신뢰할 수 없는 데이터가 포함된 경우에는 이 작업을 수행하지 마세요.