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

时间:2014-05-27 05:23:22

标签: linux bash unix passwords

我正在寻找在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

提前谢谢!

2 个答案:

答案 0 :(得分:1)

通过命令行参数将期望和脚本密码发送到expect脚本。正如现在所做的那样,双引号会让人产生混淆,因为here-to文档在发送到期望的stdin之前被完全插值。

像&#39; hej&#34;&#39;没有单引号会导致发送命令,期望看起来像这样:

发送&#34; hej&#34; \ r&#34;

期望不会那样享受。

你可以通过argv访问参数,小心引用。不要将你的用户名和密码公开给那些做&#34; ps&#34;如果你在命令行上将它们作为参数传递给期望,则在该框上。但是你在问题中调用脚本时已经这样做了......

答案 1 :(得分:1)

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