【问题标题】:Passing Variable with Special characters as password breaks bash script. How do I Sanitize special characters in bash?使用特殊字符作为密码传递变量会破坏 bash 脚本。如何清理 bash 中的特殊字符?
【发布时间】:2014-07-15 21:40:35
【问题描述】:

我正在寻找一种解决方案来清理我的 bash 密码更改脚本中的变量。

下面的脚本正在运行,但是我发现一些“特殊字符”会破坏我的脚本。我目前无法控制正在传递的角色。我要么希望在传递变量之前对其进行清理,要么将变量作为一个整体保持不变。我尝试使用 '${PASS}' 代替 "${PASS}" 但是在这种情况下脚本不会完成。

如果有人能提供任何建议,我将不胜感激。在发布之前,我曾尝试搜索此问题的答案,但没有找到任何相关内容,因此如果在其他地方得到解答,我很抱歉。

#!/bin/bash

# Two variables are passed, Username and new Password. 

USERNAME=$1
PASS=$2

expect << EOF
spawn passwd ${USERNAME}
expect "Enter new UNIX password:"
send "${PASS}\r"
expect "Retype new UNIX password:"
send "${PASS}\r"
expect eof;
EOF

expect << EOF
spawn htdigest /.passwd "Authenticated Users" ${USERNAME}
expect "New password:"
send "${PASS}\r"
expect "Re-type new password:"
send "${PASS}\r"
expect eof;
EOF

expect << EOF
spawn htpasswd /squiddb ${USERNAME}
expect "New password:"
send "${PASS}\r"
expect "Re-type new password:"
send "${PASS}\r"
expect eof;
EOF

提前感谢您!

【问题讨论】:

  • 什么“特殊字符”? +1 使用expect 设置密码。我在PerlExpect 遇到了这个问题。
  • 旁注:我一直使用autoexpect 生成的脚本并根据需要对其进行编辑。这种做法帮助我解决了许多问题,可能也像这样。
  • 这里是 ${PASS} 特殊字符的极端情况示例:billy$@%^443&%&^fe!!
  • 对我来说,我想使用chpasswd 在脚本中更改密码。你可以这样使用它:echo "$USERNAME:$PASS"|chpasswd。但我不确定它是否能解决特殊字符引起的问题。
  • 您的意思是“特殊字符”不是正确的密码吗?或者确切的错误是什么?如果密码不能包含“特殊字符”,也许您可​​以在发送密码之前进行评估。

标签: linux bash unix passwords


【解决方案1】:

改为通过命令行参数将用户名和密码发送到 expect 脚本。正如现在所做的那样,双引号会混淆 expect,因为 here-to 文档在发送到 expect 的标准输入之前已完全插入。

像 'hej"' 这样不带单引号的密码会导致发送命令为 expect 看起来像这样:

发送“hej”\r“

预计不会喜欢的。

您可以通过 argv 访问参数,请注意引用。如果您将用户名和密码作为期望的命令行参数传递,请不要将用户名和密码暴露给在该框中执行“ps”的任何人。但是您在调用问题中的脚本时已经这样做了...

【讨论】:

  • +1 因为那是确切的问题。我不明白为什么人们在bash 中使用heredoc 运行expect,expect 是一个shell,应该用作一个。
  • 谢谢,但最好的解决方案是你的,@MattGreen :) 更少的 fork/exec,只需担心一级字符串插值。我给了它一个 +1。
【解决方案2】:

为什么不直接使用Expect shell 来执行此操作。

#!/usr/bin/expect

set timeout 20
set user [lindex $argv 0]
set password [lindex $argv 1]

spawn passwd $user
expect "Enter new UNIX password:"
send "$password\r";
expect "Retype new UNIX password:"
send "$password\r";
wait 1

spawn htdigest /.passwd "Authenticated Users" $user
expect "New password:"
send "$password\r"
expect "Re-type new password:"
send "$password\r"
wait 1

spawn htpasswd /squiddb $user
expect "New password:"
send "$password\r"
expect "Re-type new password:"
send "$password\r"

exit 0

像上面一样执行

./SCRIPTNAME.exp user password

【讨论】:

  • 我在传递特殊字符时仍然遇到问题。以下是我快速浏览的一些示例:Billy2 - Works Billy2$ - Works Billy2! - 不起作用 Billy2!@ - 错误消息:-bash: !@: event not found Billy2%$&^^ - 不起作用:Billy2%$&^^ 变成 Billy2%$ 并推出 ^^: command not found
  • 你能用interpreter 明确地运行它吗:expect SCRIPTNAME.exp user password,你的变量正在被插值,这仍然不应该出现在expect shell 中。
  • 以下组合仍然不行:Billy2%$&^^, Billy2%$&, Billy2!@。我还尝试了 Billy2!234wf,它显示以下内容:-bash: !234: event not found
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
相关资源
最近更新 更多