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}
Jawaban:
Seperti komentar komentar Kamil, jika Anda ingin memasukkan teks literal $ {USER}, Anda bisa menggunakan tanda kutip alih-alih tanda kutip.
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.
Namun, opsi lain adalah menggunakan tanda kutip alih-alih di mana Anda memiliki tanda kutip, sebagai berikut:
Pilihan lain adalah keluar dari tanda dolar.
Garis miring terbalik sebelum tanda dolar memberi tahu shell untuk hanya memperlakukan tanda dolar sebagai karakter biasa, bukan sebagai awal dari nama variabel.
sumber
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-tibacommand not found
atau perilaku lain yang tidak mereka harapkan. Saya ingin membatalkan jawaban tetapi saya tidak akan melakukannya kecuali jika sudah diperbaiki.