我正在寻找在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
提前谢谢!
答案 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