密码包含反引号时,bash脚本失败

时间:2015-06-19 01:55:12

标签: linux bash

一位同事写了一个脚本,作为远程​​执行其他脚本的包装器。它设置为要求输入密码,然后将echo设置为远程系统,以便在sudo中使用。

相关代码*:

read -s pw
....
${SSH_tt} ${HOST} "echo ${pw} | ${SUDO_S} ./${SCRIPT_NAME} > ${HOME}/${HOST_OUTPUT}" 2> /dev/null

*请忽略所有大写变量。

如果我输入包含反引号的密码,我会收到以下错误:

bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file

如果我将密码更改为不包含反引号的密码,则脚本运行正常。我想这会发生在包含单引号和双引号的密码中。

虽然更改我的密码是一个选项,但由于我们平台的大小(我们不使用集中身份验证),这是不可取的。我想知道是否有办法消毒或以其他方式逃避反引号,以便shell不会在本地或远程解释它。

1 个答案:

答案 0 :(得分:4)

您可以在执行最后一行之前转义密码。

在bash中:

escaped_pw=`printf "%q" ${pw}`

然后使用escaped_pw代替pw

${SSH_tt} ${HOST} "echo ${escaped_pw} | ${SUDO_S} ./${SCRIPT_NAME} > ${HOME}/${HOST_OUTPUT}" 2> /dev/null

以下是一个例子:

$ read -s pw
$ echo $pw
ronak`gandhi
$ escaped_pw=`printf "%q" ${pw}`
$ echo $escaped_pw
ronak\`gandhi
$ ssh myhost "echo ${escaped_pw} - `date`"
ronak`gandhi - Thu Jun 18 19:28:47 PDT 2015