任何人都可以帮我开发以下脚本吗?
我在/etc/httpd/httpd.conf文件中有以下条目
<VirtualHost 192.168.1.181:80>
DocumentRoot /var/www/html/
ServerName example.com
</VirtualHost>"
如果有人进入输入example.com,我需要从同一个文件/etc/httpd/httpd.conf中完全删除example.com的相同虚拟主机条目。我怎么能这样做?
答案 0 :(得分:1)
这是一个bash脚本,它将删除包含与作为程序第二个参数提供的VirtualHost
匹配的domain
的任何domain
块。脚本使用是:
./scriptname /path/to/httpd.conf somedomain.com
操作很简单。它将通过现有的httpd.conf读取,在/ tmp中创建一个临时的httpd.conf。它读取httpd.conf以查找任何VirtualHost
标记,然后在数组中缓冲与它们关联的所有行。它会测试somedomain.com
块中是否找到VirtualHost
。如果找到,则不会写入新文件。如果未找到,则VirtualHost
块的所有行都将保持不变。与VirtualHost
块无关的任何其他行都只是写入新文件。解析后,通过diff比较新的/旧的httpd.conf文件。如果它们不匹配,则将新的httpd.conf写入系统httpd.conf位置。
脚本在下面评论。如果您还有其他问题,请与我联系:
#!/bin/bash
# this file must be run as root
test "$UID" = 0 || {
printf "\n Error, insufficient privileges. root user required, user '%s' won't work.\n\n" "$USER"
exit 1
}
## declare needed variables and flags
declare -a tmp # temp array to hold lines between <VirtualHost tags
declare -i loop=0 # flag to loop over all line in <VirtualHost blocks
declare -i found=0 # flag indicating domain to delete is found
tmstamp="$(date +%s)" # unique timestamp for backup of httpd.conf
domain="${2:-example.com}" # give domain to find as 2nd arg on command line
htfile="${1:-/etc/httpd/conf/httpd.conf}" # confirm path/filename for your setup
tmpfile="/tmp/httpd.conf.tmp" # temp file to write remaining httpd.conf lines to
:> "$tmpfile" # truncate tmpfile
## backup httpd.conf, exit on err
cp -a "${htfile}" "${htfile}.$tmstamp" || {
printf "\n Error, failed to make backup of httpd.conf.\n\n"
exit 2
}
## NOTE: do not unset IFS, leave at default
# read all lines in httpd.conf
while read -r line || test -n "$line"; do
if test "${line:0:12}" == "<VirtualHost" || test $loop -eq 1 ; then # if <VirtualHost found
loop=1 # set loop flag to 1 to continue looping
tmp+=( "$line" ) # while looping add each line to tmp array
test "${line##* }" == "$domain" && found=1 # if wanted domain found, set found flag=1
if test "$line" == "</VirtualHost>" ; then # if closing </VirtualHost tag found
loop=0 # reset loop to 0
if test "$found" -eq 1 ; then # if 'found', just reset found flag (don't write)
found=0
else # otherwise, write the VirtualHost block to file`
for ((i=0; i<${#tmp[@]}; i++)); do
printf "%s\n" "${tmp[$i]}" >> "$tmpfile"
done
fi
unset tmp # lastly - unset tmp array
fi
else # Not in VirtualHost block, so
printf "%s\n" "$line" >> "$tmpfile" # output all non-interesting lines to tmpfile
fi
done <"$htfile"
## if new and old httpd.conf files differ, copy new to old
diff -qw &>/dev/null "$htfile" "$tmpfile" || cp -a "$tmpfile" "$htfile"
rm "$tmpfile" # remove tmpfile
exit 0
答案 1 :(得分:0)
试试这段代码。
#!/bin/bash
read -p 'Enter the domain' dom
NUM=$(cat -n /etc/httpd/httpd.conf |grep -w $dom|awk '{print $1}')
NUM1=$(($NUM-2))
NUM2=$(($NUM+1))
sed -i -e "$NUM1,$NUM2 d" /etc/httpd/httpd.conf