当 shell 脚本创建需要表达式与表达式输出的文件时,如何保留表达式 ${USER}

当 shell 脚本创建需要表达式与表达式输出的文件时,如何保留表达式 ${USER}

这是我的困境,在我用来安装或配置 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 将美元符号视为常规字符,而不是变量名的开头。

相关内容