一位同事写了一个脚本,作为远程执行其他脚本的包装器。它设置为要求输入密码,然后将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不会在本地或远程解释它。
答案 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