我有一个用户名和密码的文件,用于我正在制作的VPN网站。它看起来像这样:
#user #server #password #ip
user1 server1 pass1 *
user2 server4 pass67 *
user3 server8 pass32 someip
user9 server1 62pass *
如果我编写了一个简单的shell脚本来将用户附加到表中,并重新启动VPN进程:
#!/bin/sh
echo "Adding user $1 with password $2."
echo "$1 l2tpd $2 *" >> /etc/ppp/chap-secrets
echo "Restarting xl2tpd process."
sudo /etc/init.d/xl2tpd restart
echo "VPN restarted, user added."
现在我要做的是编写一个脚本,允许我从表中删除用户,然后重新启动该过程。为了做到这一点,我必须传递一个参数,即用户名。
如何使用该用户名查找该行,然后将其删除?
答案 0 :(得分:2)
您可以使用sed
:
sed '/^user1/d' filename
会删除以user1
开头的行。要将更改保存到文件,请使用-i
选项。
要使用变量,请确保使用双引号:
sed "/^$1/d" filename
或者,您可以使用grep
:
grep -v "^$1" filename
答案 1 :(得分:1)
虽然像devnull这样的基本sed
脚本可以解决问题,但你应该知道sed会搜索正则表达式,而不是字符串,他的解决方案建议使用原始命令行内容作为sed命令的一部分。
我不会这样做。输入验证很重要,因为即使没有讨厌的人可以访问你的shell,也会发生拼写错误。例如:
#!/bin/bash
if [[ "$1" ~ ^[a-z][a-z0-9]*$ ]]; then
if sed -i.bak -e "/^$1 /d" /etc/ppp/chap-secrets; then
echo "delete user $1"
fi
else
echo "ERROR: Invalid characters. Please try again." >&2
exit 1
fi
请注意,我们正在测试以确保用户遵循没有特殊字符的安全格式,并且我们还确保删除用户“foo”也不会通过在后面添加空格来删除用户“foobar” sed脚本中的$1
范围。
我建议保留-i.bak
,以防万一发生不幸事件。
答案 2 :(得分:0)
如果你有使用-i选项的gnu sed。
#!/bin/sh
echo "deleting user $1."
sed -i "/^$1/d" /etc/ppp/chap-secrets
echo "Restarting xl2tpd process."
sudo /etc/init.d/xl2tpd restart
echo "VPN restarted, user deleted."
如果没有,请用以下命令替换sed -i
命令:
sed "/^$1/d" /etc/ppp/chap-secrets > temp
mv temp /etc/ppp/chap-secrets