这是我的困境,在我用来安装或配置 OpenVPN 和/或仅客户端配置文件的 shell 脚本中,我扩展了脚本以包含 Google Authenticator 的安装。
该脚本pam.d
使用以下方式创建此附加组件的文件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
安装完所有文件后,上面的 pam.d 文件当然是用用户创建的,而不是如下所示的表达式
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
有没有办法将表达式保存${USER}
在文件中?
它将解决此安装后编辑改secret=/etc/google-auth/root
回的问题secret=/etc/google-auth/${USER}
答案1
正如 Kamil 的评论所指出的,如果您想包含文字 ${USER},则可以使用撇号而不是引号。
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
将导致 shell 扩展 ${USER},该变量可以设置为 root。(如果不希望这样,您可能想尝试使用 sudo 的 env_reset 功能保留该变量,或者只是将所需值设置为 sudo 不会覆盖的自定义变量。)
实际上,没有引号也可以达到同样的效果。
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
不过,另一种选择是使用撇号代替引号,如下所示:
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
另一个选择就是不去掉美元符号。
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
美元符号前的反斜杠告诉 shell 将美元符号视为常规字符,而不是变量名的开头。