我已经创建了一个脚本,可以轻松地设置多个Postfix并分配一些内容。
例如有些是
postmulti -e init
postmulti -I postfix-$new -e create
echo "mydomain = $domain" >> /etc/postfix-$new/main.cf
echo "queue_directory = /var/spool/postfix-$new" >> /etc/postfix-$new/main.cf
echo "smtp_bind_address = $ip" >> /etc/postfix-$new/main.cf
sed -i "s/oldip/$ip/g" /etc/postfix-$new/main.cf
echo "/n*@$domain default._domainkey.$domain" >> /etc/opendkim/SigningTable
sed -i "s/cyberciti.com/$domain/g" /etc/postfix-$new/main.cf
此脚本有三个要求
$new
$ip
和$domain
计划是在一个文件中包含很多这样的内容,并对每个数据行运行的整个脚本进行bash(见下文)
new1, 1.1.1.1, myweb.com
new2, 2.2.2.2, myweb2.com
当前被
,
分隔,但我可以将其设置为任何我该怎么做?
最佳答案
将数据文件中的分隔符设置为空格。您通常可以避免使用逗号—它们在Unix系统中很少有用。调用文件new_postfix_domains
(为了具体讨论)。
大致按照以下几行写剧本:
while read new ip domain
do
config="/etc/postfix-$new/main.cf"
postmulti -e init
postmulti -I postfix-$new -e create
echo "/n*@$domain default._domainkey.$domain" >> /etc/opendkim/SigningTable
{
echo "mydomain = $domain"
echo "queue_directory = /var/spool/postfix-$new"
echo "smtp_bind_address = $ip"
} >> "$config"
sed -i -e "s/oldip/$ip/g" \
-e "s/cyberciti.com/$domain/g" "$config"
done
运行脚本:
bash add_new_postfix_domains.sh < new_postfix_domains
注意事项:
该脚本使用
{ … } > "$config"
符号将配置文件的多个输出组合成一个操作序列。注意{
和}
有一些特殊的语法要求。{
必须是一个单独的单词(由空格包围),并且}
必须是一个单独的单词,命令可以在其中启动(例如,在一行的开头或分号之后)。您只需要使用
sed
编辑一次文件。我假设postmulti … create
步骤使用需要编辑的模板创建了配置文件。否则,sed
命令没有任何意义。使用变量一次捕获配置文件名;然后使用变量引用文件。
您应该考虑各种形式的数据验证。例如,这将接受数据中的空行,并为各个组件创建一个带有空格的条目。也许你应该稍微验证一下IP地址,也许还有域名。如果数据文件可能出错,您可能需要在
read
中捕获并忽略(或在忽略行之前报告)垃圾邮件的read new ip domain junk
:$junk
中添加额外的“列”。你可能想报告你在做什么。
会有人认为你应该使用
read -r
而不是仅仅使用read
以便以不同的方式处理螺旋球输入。我不认为这是相关的-GIGO是合理的,如果人们谁将使用脚本应该是理智的,最好是知识渊博的。如果选择,可以预先验证输入数据。例如,您可以使用sed
对输入进行预处理,弹出任何与“三个字段不匹配的行,中间字段是IPv4地址,最后一个是合理的域名,第一个是没有不适当标点符号要求的标识符”。您可以修改脚本以从文件名参数列表中读取,或者从标准输入(如果命令行中未提供名称)中读取。如果预先过滤输入,这将是很简单的:
sed -e '…editing script…' "$@" | while read new ip domain
将完成这项工作。关于linux - 读取文件“$”数据和bash脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31205455/