Linux 将带有特殊字符的变量作为密码传递会中断bash脚本。如何清理bash中的特殊字符?

Linux 将带有特殊字符的变量作为密码传递会中断bash脚本。如何清理bash中的特殊字符?,linux,bash,unix,passwords,Linux,Bash,Unix,Passwords,我正在寻找一种解决方案来清理bash密码更改脚本中的变量 下面的脚本正在运行,但是我发现一些“特殊角色”会破坏我的脚本。我现在无法控制正在传递的角色。我要么希望在传递变量之前对其进行清理,要么将变量作为一个整体推送而不受影响。我曾尝试使用${PASS}代替${PASS},但在这种情况下,脚本无法完成 我希望任何人能提供任何建议。在发布之前,我已经尝试过搜索这个问题的答案,但是没有找到任何相关的答案,所以如果这个问题在其他地方得到了回答,我很抱歉 #!/bin/bash # Two variab

我正在寻找一种解决方案来清理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
#/bin/bash
#传递两个变量:用户名和新密码。
用户名=$1
通行证=2美元

expect通过命令行参数将用户名和密码发送到expect脚本。正如现在所做的那样,双引号将混淆expect,因为hereto文档在发送到expect的stdin之前被完全插入

像“hej”这样没有单引号的密码将导致expect的send命令如下所示:

发送“hej”\r“

我不喜欢这样


您可以通过argv访问参数,注意引用。不要担心,如果您将用户名和密码作为参数在命令行中传递,您将向在该框上执行“ps”操作的任何人公开用户名和密码。但是在调用问题中的脚本时,您已经这样做了…

为什么不直接使用
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

什么“特殊人物”+1用于使用
设置密码。我在使用
Perl
Expect
时遇到了这个问题。旁注:我一直使用
autoexpect
生成的脚本,并根据需要对它们进行编辑。这种做法让我经历了很多问题,可能也有类似的问题。下面是一个${PASS}特殊字符的极端情况的例子:billy$@%^443&%&^fe!!对于我来说,我想使用
chpasswd
在脚本中更改密码。您可以这样使用它:
echo“$USERNAME:$PASS”| chpasswd
。但是我不确定它能否解决特殊字符引起的问题。你是说“特殊字符”不是正确的密码吗?或者确切的错误是什么?如果密码不能包含“特殊字符”,也许你可以在发送密码前进行评估。因为这正是问题所在。我不明白为什么人们在
bash
中使用
herdoc
运行
expect
,expect是一个shell,应该作为一个shell使用。谢谢,但最好的解决方案是您的,@MattGreen:)更少的fork/exec,只需要担心一个级别的字符串插值。我给它一个+1。我仍然有通过特殊字符的问题。下面是一些我快速浏览过的示例:Billy2-Works Billy2$-Works Billy2不工作计费2!@-错误消息:-bash:!@:事件未找到Billy2%$&^^-不工作:Billy2%$&^^变为Billy2%$并推出^^:命令未找到您能否使用
解释器运行它显式:
expect SCRIPTNAME.exp user password
,您的变量将被插入,仍然不应该出现在上述的
expect
shell中。仍然不能使用以下组合:Billy2%$&^^,Billy2%$&,Billy2!@。我也试过Billy2!234wf显示以下内容:-bash:!234:未找到事件