| REGEXP_TABLE(5) | File Formats Manual | REGEXP_TABLE(5) |
نام (NAME)
regexp_table - قالب جدولهای عبارات باقاعده در Postfix
خلاصه دستور (SYNOPSIS)
postmap -q "string" regexp:/etc/postfix/filename postmap -q - regexp:/etc/postfix/filename <inputfile
توضیحات (DESCRIPTION)
سیستم ایمیل Postfix از جدولهای اختیاری برای بازنویسی نشانیها یا مسیریابی نامهها استفاده میکند. این جدولها معمولاً در قالبهای lmdb:، cdb:، hash:، یا dbm: هستند.
بهعنوان جایگزین، جدولهای جستجو میتوانند در قالب عبارات باقاعده POSIX مشخص شوند. در این حالت، هر ورودی با فهرستی از الگوها مقایسه میشود. هنگام یافتن تطابق، نتیجه متناظر بازگردانده میشود و جستجو خاتمه مییابد.
برای آگاهی از انواع جدولهای جستجوی پشتیبانیشده در سیستم Postfix خود، از دستور "postconf -m" استفاده کنید.
برای آزمودن جدولهای جستجو، از دستور "postmap -q" مطابق آنچه در خلاصه دستور در بالا آمده استفاده کنید. از "postmap -hmq - <file" برای الگوهای header_checks(5)، و از "postmap -bmq - <file" برای body_checks(5) (در Postfix نسخه 2.6 و بالاتر) استفاده کنید.
سازگاری (COMPATIBILITY)
در نسخه 2.2 و پیشین Postfix، گزینه "postmap -fq" را برای پرسوجو از جدولی شامل الگوهای حساس به حروف بزرگ و کوچک مشخص کنید. الگوها بهطور پیشفرض به بزرگی و کوچکی حروف حساس نیستند.
قالب جدول (TABLE FORMAT)
شکل کلی یک جدول عبارت باقاعده Postfix به صورت زیر است:
- /pattern/flags result
- هنگامی که pattern با رشته ورودی مطابقت داشته باشد، مقدار متناظر result را استفاده کن.
- !/pattern/flags result
- هنگامی که pattern با رشته ورودی مطابقت نداشته باشد، مقدار متناظر result را استفاده کن.
- if /pattern/flags
- endif
- اگر رشته
ورودی با /pattern/
مطابقت
داشته
باشد، آن
رشته ورودی
را با
الگوهای
میان if و endif
مقایسه کن.
بلوکهای
if..endif
میتوانند
تودرتو
باشند.
نکته: در الگوهای داخل if..endif فاصله خالی در ابتدا اضافه نکنید.
این قابلیت در Postfix نسخه 2.1 و بالاتر در دسترس است.
- if !/pattern/flags
- endif
- اگر رشته
ورودی با /pattern/
مطابقت
نداشته
باشد، آن
رشته ورودی
را با
الگوهای
میان if و endif
مقایسه کن.
بلوکهای
if..endif
میتوانند
تودرتو
باشند.
نکته: در الگوهای داخل if..endif فاصله خالی در ابتدا اضافه نکنید.
این قابلیت در Postfix نسخه 2.1 و بالاتر در دسترس است.
- خطوط خالی و توضیحات
- خطوط خالی و خطوطی که فقط حاوی فاصله سفید هستند نادیده گرفته میشوند، همچنین خطوطی که نخستین نویسه غیرفاصله آنها `#' باشد.
- متن چندخطی
- یک خط منطقی با متنی غیر از فاصله سفید آغاز میشود. خطی که با فاصله سفید آغاز گردد، خط منطقی قبلی را ادامه میدهد.
هر الگو یک عبارت باقاعده POSIX است که در میان دو نویسه جداکننده قرار میگیرد. نحو عبارات باقاعده در re_format(7) در 4.4BSD، در regex(5) در Solaris، و در regex(7) در Linux مستند شده است. سیستمهای دیگر ممکن است از نامهای اسناد دیگری استفاده کنند.
جداکننده عبارت میتواند هر نویسه غیرالفبایی-عددی باشد، بهجز فاصله سفید یا نویسههایی با معنای خاص (بهطور سنتی از اسلش استفاده میشود). عبارت باقاعده میتواند حاوی فاصله سفید باشد.
بهطور پیشفرض، تطابق به بزرگی و کوچکی حروف حساس نیست و خطوط جدید بهعنوان نویسههای خاص تلقی نمیشوند. این رفتار توسط فلگها کنترل میشود که با افزودن یک یا چند مورد از نویسههای زیر پس از الگو تغییر مییابند:
- i (پیشفرض: روشن)
- فلگ حساسیت به بزرگی و کوچکی حروف را تغییر میدهد. بهطور پیشفرض، تطابق حساس به حروف نیست.
- m (پیشفرض: خاموش)
- فلگ حالت چندخطی را تغییر میدهد. هنگام روشن بودن این فلگ، نویسههای خاص ^ و $ علاوه بر تطابق در ابتدا و انتهای رشته ورودی، بهترتیب بلافاصله پس از و بلافاصله پیش از یک نویسه خط جدید نیز مطابقت مییابند.
- x (پیشفرض: روشن)
- فلگ نحو عبارات گسترده را تغییر میدهد. بهطور پیشفرض، پشتیبانی از نحو عبارات گسترده فعال است.
ترتیب جستجوی جدول (TABLE SEARCH ORDER)
الگوها به ترتیبی که در جدول مشخص شدهاند اعمال میشوند، تا زمانی که الگویی منطبق با رشته ورودی پیدا شود.
هر الگو روی کل رشته ورودی اعمال میشود. بسته به کاربرد، این رشته کل نام میزبان کلاینت، کل نشانی IP کلاینت، یا کل نشانی ایمیل است. بنابراین، هیچ جستجویی در دامنه والد یا شبکه والد انجام نمیشود، و نشانیهای ایمیل user@domain به بخشهای تشکیلدهنده user و domain تجزیه نمیشوند، و همچنین user+foo به user و foo تفکیک نمیگردد.
جایگزینی متن (TEXT SUBSTITUTION)
جایگزینی زیررشتهها (متنی که با الگوهای درون "()" مطابقت دارد) از عبارت منطبقشده در رشته نتیجه با $1، $2 و غیره درخواست میشود؛ برای تولید نویسه $ در خروجی، $$ را مشخص کنید. اگر ماکروها در رشته نتیجه با فاصله سفید دنبال نشوند، ممکن است نیاز باشد بهصورت ${n} یا $(n) نوشته شوند.
نکته: از آنجا که الگوهای نفیشده (آنهایی که پیش از آنها ! قرار دارد) زمانی که عبارت تطابق ندارد نتیجه را بازمیگردانند، جایگزینیها برای الگوهای نفیشده در دسترس نیستند.
مشخصسازی درونخطی (INLINE SPECIFICATION)
محتوای یک جدول ممکن است در نام جدول مشخص شود (در Postfix نسخه 3.7 و بالاتر). نحو پایه عبارت است از:
main.cf:
parameter = .. regexp:{ { rule-1 }, { rule-2 } .. } ..
master.cf:
.. -o { parameter = .. regexp:{ { rule-1 }, { rule-2 } .. } .. } ..
نرمافزار Postfix بهطور بازگشتی نمونههای $parametername در مقدار پارامتر فوق را بسط میدهد، فاصلههای خالی بعد از '{' و قبل از '}' را نادیده میگیرد، و هر rule را بهعنوان یک خط متنی در یک فایل درونحافظه مینویسد:
in-memory file:
rule-1
rule-2
..
سپس Postfix نتیجه را طوری تجزیه میکند که گویی فایلی در /etc/postfix است.
هشدارهای مشخصسازی درونخطی (INLINE SPECIFICATION CAVEATS)
- از استفاده از $parametername در داخل یک الگوی درونخطی :regexp خودداری کنید. این الگو در صورت وجود نویسههای خاص مانند '.' در بسط $parametername ممکن است تطابقهای غیرمنتظرهای ایجاد کند. برای جلوگیری از تطابقهای غیرمنتظره، از یک جدول :pcre استفاده کرده و \Q$parametername\E را مشخص کنید.
- هنگامی که یک قاعده درونخطی باید شامل $ باشد، $$ را مشخص کنید تا مانع از تلاش Postfix برای انجام بسط $name هنگام ارزیابی مقدار پارامتر شود. برای بررسی یک پیکربندی درونخطی، از گزینه "postconf -x" بهصورت زیر استفاده کنید:
- هنگامی که تنظیم "parametername = value" در main.cf شامل یک جدول درونخطی :regexp باشد، از دستور "postconf -x parametername" استفاده کنید. بررسی کنید که هیچ هشدار "undefined parameter" وجود نداشته باشد، و خروجی دارای نحوی باشد که در یک فایل :regexp غیردرونخطی Postfix استفاده میشود.
- هنگامی که بازنویسی "-o { parametername = value }" در master.cf شامل یک جدول درونخطی :regexp باشد، از دستور "postconf -Px '*/*/parametername' " استفاده کنید. بررسی کنید که هیچ هشدار "undefined parameter" وجود نداشته باشد، و خروجی دارای نحوی باشد که در یک فایل :regexp غیردرونخطی Postfix استفاده میشود.
مثال نگاشت دسترسی SMTPD (EXAMPLE SMTPD ACCESS MAP)
# عدم اجازه به مسیریابی مشخصشده توسط فرستنده. در صورت رله ایمیل
# برای دامنههای دیگر، این مورد الزامی است.
/[%!@].*[%!@]/ 550 Sender-specified routing rejected
# نشانی postmaster مشکلی ندارد، تا بتوانند درباره نحوه رفع
# مشکل خود با ما گفتگو کنند.
/^postmaster@/ OK
# محافظت از گسترشدهندههای majordomo خروجی شما
if !/^owner-/
/^(.*)-outgoing@(.*)$/ 550 Use ${1}@${2} instead
endif
مثال نگاشت فیلتر سرایند (EXAMPLE HEADER FILTER MAP)
# این موارد زمانی در ایمیلهای هرزنامه رایج بودند. /^Subject: make money fast/ REJECT /^To: friend@public\.com/ REJECT
مثال نگاشت فیلتر بدنه (EXAMPLE BODY FILTER MAP)
# ابتدا متن کدگذاریشده base 64 را برای صرفهجویی در چرخههای CPU نادیده بگیرید.
~^[[:alnum:]+/]{60,}$~ OK
# الگوهای بدنه خود را اینجا قرار دهید.
همچنین ببینید (SEE ALSO)
postmap(1), Postfix lookup table manager pcre_table(5), format of PCRE tables cidr_table(5), format of CIDR tables
فایلهای README (README FILES)
از "postconf readme_directory" یا "postconf html_directory" برای یافتن مکان این اطلاعات استفاده کنید.
DATABASE_README, Postfix lookup table overview
نویسندگان (AUTHOR(S))
کد جستجوی جدول regexp در ابتدا توسط: LaMont Jones lamont@hp.com نوشته شده است. آن کد بر پایه دیکشنری PCRE اهدایی از طرف: Andrew McNamara andrewm@connect.com.au connect.com.au Pty. Ltd. Level 3, 213 Miller St North Sydney, NSW, Australia بوده است. پذیرفتهشده و انطباقیافته توسط: Wietse Venema IBM T.J. Watson Research P.O. Box 704 Yorktown Heights, NY 10598, USA Wietse Venema Google, Inc. 111 8th Avenue New York, NY 10011, USA