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}"
最後の3つの変数は次のように拡張されます。
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 Community Wiki用のスクリプトを書いているので、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
これは、内容が1${LAN}
行の一部になることを意味します。パスワード。悪意のあるユーザーは、スクリプトに任意のコマンドを実行させる特別な値を形成する可能性があります。したがって、$LAN
信頼できないデータが含まれている場合はこれを実行しないでください。