Bagaimana cara mempertahankan ekspresi $ {USER} ketika skrip shell membuat file yang diinginkan ekspresi vs ekspresi

1

Inilah dilema saya, dalam skrip shell yang saya gunakan untuk menginstal atau mengkonfigurasi OpenVPN dan / atau hanya file konfigurasi klien, saya telah memperluas skrip untuk memasukkan instalasi Google Authenticator.

Script menciptakan pam.d file untuk add ini saat menggunakan echo...

echo "auth requisite /lib/security/pam_google_authenticator.so secret=/etc/google-auth/${USER} user=openvpn account required  pam_permit.so">> /etc/pam.d/openvpn

Setelah semua diinstal, dan file tersebut dibuat, file pam.d di atas tentu saja dibuat dengan pengguna alih-alih ekspresi seperti yang ditunjukkan di bawah

echo "auth requisite /lib/security/pam_google_authenticator.so secret=/etc/google-auth/root user=openvpn account required pam_permit.so">> /etc/pam.d/openvpn

Apakah ada cara untuk mempertahankan ekspresi sebagai ${USER} dalam file?

Ini akan menyelesaikan perubahan instalasi posting perubahan ini secret=/etc/google-auth/root kembali ke secret=/etc/google-auth/${USER}

kcurry0210
sumber

Jawaban:

1

Seperti komentar komentar Kamil, jika Anda ingin memasukkan teks literal $ {USER}, Anda bisa menggunakan tanda kutip alih-alih tanda kutip.

echo "auth requisite /lib/security/pam_google_authenticator.so secret=/etc/google-auth/${USER} user=openvpn account required  pam_permit.so">> /etc/pam.d/openvpn

akan menyebabkan shell memperluas $ {USER}, yang dapat disetel ke root. (Jika itu tidak diinginkan, Anda mungkin ingin mencoba mempertahankan variabel itu dengan kemampuan sudo env_reset, atau hanya menetapkan nilai yang diinginkan ke variabel khusus yang tidak akan ditimpa oleh sudo.)

Sebenarnya, Anda mendapatkan efek yang sama tanpa tanda kutip.

echo auth requisite /lib/security/pam_google_authenticator.so secret=/etc/google-auth/${USER} user=openvpn account required  pam_permit.so>> /etc/pam.d/openvpn

Namun, opsi lain adalah menggunakan tanda kutip alih-alih di mana Anda memiliki tanda kutip, sebagai berikut:

echo 'auth requisite /lib/security/pam_google_authenticator.so secret=/etc/google-auth/${USER} user=openvpn account required  pam_permit.so'>> /etc/pam.d/openvpn

Pilihan lain adalah keluar dari tanda dolar.

echo auth requisite /lib/security/pam_google_authenticator.so secret=/etc/google-auth/\${USER} user=openvpn account required pam_permit.so>> /etc/pam.d/openvpn

Garis miring terbalik sebelum tanda dolar memberi tahu shell untuk hanya memperlakukan tanda dolar sebagai karakter biasa, bukan sebagai awal dari nama variabel.

TOOGAM
sumber
Terima kasih TOOGAM !! yang berhasil .... Saya akhirnya menggunakan pengganti tanda kutip vs tanda kutip ....
kcurry0210
"Anda mendapatkan efek yang sama tanpa tanda kutip" - Dengan echo mungkin berfungsi dalam banyak kasus tetapi ini adalah praktik yang sangat buruk secara umum . Bagaimana kalau ada | dalam sebuah string yang ingin digaungkan? atau bom fork? atau ;rm -rf ~/*;? Anda tidak dapat mengharapkan pengguna yang membutuhkan bantuan dengan kutipan mereka untuk menemukan kelemahan seperti itu. Bahkan jika mereka tidak melakukan kerusakan permanen, mereka akan bingung dengan tiba-tiba command not found atau perilaku lain yang tidak mereka harapkan. Saya ingin membatalkan jawaban tetapi saya tidak akan melakukannya kecuali jika sudah diperbaiki.
Kamil Maciorowski
Saat ini saya berencana untuk meninggalkan jawaban saya apa adanya, karena langsung menjawab pertanyaan yang diajukan (di mana teks gema terlihat agak spesifik). Namun, saya mengakui kekhawatiran keamanan yang dibuat @KamilMaciorowski, dan terutama menghargai hukuman setelah tanda tanya Kamil. Ketika berhadapan dengan input yang tidak diketahui atau tidak dapat dipercaya, masalah keamanan semacam itu sepadan dengan usaha, tetapi untuk kasus khusus ini, saya tidak menganggap kekhawatiran yang mungkin seperti layak membuat jawaban secara substansial lebih lama. Kemudian lagi, saya tidak cenderung secara membabi buta menempel perintah atau referensi variabel yang tidak diketahui.
TOOGAM