我已经创建了一个脚本,可以轻松设置多个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
计划是在文件中包含大量这些内容,然后使用每个数据行运行整个脚本(见下文)
new1, 1.1.1.1, myweb.com
new2, 2.2.2.2, myweb2.com
目前由,
分隔,但我可以将其设置为任何内容
我该怎么做?
答案 0 :(得分:1)
将数据文件中的分隔符设置为空格。您通常可以避免使用逗号 - 它们在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
可以完成这项工作。
答案 1 :(得分:0)
您可以使用read
:
while IFS=', ' read -r new ip domain ; do
./your_script "$new" "$ip" "$domain"
done < input.file
答案 2 :(得分:0)
您需要在运行之前将变量导出到脚本中,如:
-p
或者使用hek2mgl的方法将值作为参数传递并将其添加到脚本的开头:
while IFS=', ' read -r new ip domain ; do
export new ip domain
./your_script
done < input.file