| PCRE_TABLE(5) | File Formats Manual | PCRE_TABLE(5) |
نام (NAME)
pcre_table - قالب جدولهای PCRE در Postfix
خلاصه دستور (SYNOPSIS)
postmap -q "string" pcre:/etc/postfix/filename postmap -q - pcre:/etc/postfix/filename <inputfile postmap -hmq - pcre:/etc/postfix/filename <inputfile postmap -bmq - pcre:/etc/postfix/filename <inputfile
توضیحات (DESCRIPTION)
سیستم ایمیل Postfix از جدولهای اختیاری برای بازنویسی آدرس (address rewriting) یا مسیریابی ایمیل (mail routing) استفاده میکند. این جدولها معمولاً در قالبهای lmdb:، cdb:، hash: یا dbm: هستند.
به عنوان جایگزین، جدولهای جستجو را میتوان در قالب عبارتهای باقاعده سازگار با پرل (Perl Compatible Regular Expression یا PCRE) مشخص کرد. در این حالت، هر ورودی با فهرستی از الگوها مقایسه میشود. هنگامی که یک تطابق یافت شد، نتیجه مربوطه بازگردانده شده و جستجو پایان مییابد.
برای آگاهی از اینکه سیستم Postfix شما از چه نوع جدولهای جستجویی پشتیبانی میکند، از دستور «postconf -m» استفاده کنید.
برای آزمایش جدولهای جستجو، از دستور «postmap -q» همانطور که در بخش خلاصه دستور در بالا شرح داده شد، استفاده کنید. از «postmap -hmq - <file» برای الگوهای header_checks(5) و از «postmap -bmq - <file» برای body_checks(5) (در Postfix نسخه ۲.۶ و بالاتر) استفاده کنید.
این درایور را میتوان با کتابخانه pcre2 (در Postfix نسخه ۳.۷ و بالاتر) یا با کتابخانه قدیمی pcre (تمام نسخههای Postfix) ساخت.
سازگاری (COMPATIBILITY)
در Postfix نسخه ۲.۲ و قدیمیتر، برای پرسوجو از جدولی که شامل الگوهای حساس به حروف کوچک و بزرگ است، «postmap -fq» را مشخص کنید. الگوها بهطور پیشفرض به بزرگی و کوچکی حروف حساس نیستند.
قالب جدول (TABLE FORMAT)
قالب کلی یک جدول PCRE به صورت زیر است:
- /pattern/flags result
- هنگامی که pattern با رشته ورودی مطابقت داشته باشد، از مقدار result مربوطه استفاده میشود.
- !/pattern/flags result
- هنگامی که pattern با رشته ورودی مطابقت نداشته باشد، از مقدار result مربوطه استفاده میشود.
- if /pattern/flags
- endif
- اگر رشته
ورودی با /pattern/
مطابقت
داشته
باشد، آن
رشته ورودی
با الگوهای
بین if و endif
مقایسه
میشود.
بلوکهای
if..endif
میتوانند
تو در تو
باشند.
نکته: در ابتدای الگوهای داخل if..endif از نویسههای فاصله (whitespace) استفاده نکنید.
این ویژگی در Postfix نسخه ۲.۱ و بالاتر در دسترس است.
- if !/pattern/flags
- endif
- اگر رشته
ورودی با /pattern/
مطابقت
نداشته
باشد، آن
رشته ورودی
با الگوهای
بین if و endif
مقایسه
میشود.
بلوکهای
if..endif
میتوانند
تو در تو
باشند.
نکته: در ابتدای الگوهای داخل if..endif از نویسههای فاصله (whitespace) استفاده نکنید.
این ویژگی در Postfix نسخه ۲.۱ و بالاتر در دسترس است.
- خطوط خالی و کامنتها
- خطوط خالی و خطوطی که فقط حاوی نویسههای فاصله هستند نادیده گرفته میشوند، همانطور که خطوطی که اولین نویسه غیرفاصلهای آنها «#» است نادیده گرفته میشوند.
- متن چندخطی
- یک خط منطقی با متنی غیر از نویسههای فاصله آغاز میشود. خطی که با نویسه فاصله آغاز شود ادامهدهنده خط منطقی است.
هر الگو یک عبارت باقاعده شبیه به perl است. جداکننده عبارت (delimiter) میتواند هر نویسه غیرحرفی-عددی به جز نویسههای فاصله یا نویسههای دارای معنای خاص باشد (بهطور سنتی از اسلش «/» استفاده میشود). عبارت باقاعده میتواند شامل نویسههای فاصله باشد.
بهطور پیشفرض، تطابق بدون حساسیت به بزرگی و کوچکی حروف است و خطوط جدید به عنوان نویسههای خاص در نظر گرفته نمیشوند. این رفتار توسط پرچمها (flags) کنترل میشود که با افزودن یک یا چند مورد از نویسههای زیر به انتهای الگو فعال یا غیرفعال میشوند:
- i (پیشفرض: روشن)
- تغییر وضعیت پرچم حساسیت به بزرگی و کوچکی حروف. بهطور پیشفرض، تطابق به بزرگی و کوچکی حروف حساس نیست.
- m (پیشفرض: خاموش)
- تغییر وضعیت پرچم MULTILINE در pcre. هنگامی که این پرچم روشن است، فرانَویسههای (metacharacters) ^ و $ علاوه بر تطابق در ابتدا و انتهای رشته مورد نظر، به ترتیب بلافاصله پس از و بلافاصله قبل از یک نویسه خط جدید (newline) نیز تطابق مییابند.
- s (پیشفرض: روشن)
- تغییر وضعیت پرچم DOTALL در pcre. هنگامی که این پرچم روشن است، فرانَویسه . با نویسه خط جدید نیز تطابق مییابد. در نسخههای قبل از ۲.۰ نرمافزار Postfix، این پرچم بهطور پیشفرض خاموش بود که برای تطابق سرآیندهای پیامهای چندخطی نامناسب بود.
- x (پیشفرض: خاموش)
- تغییر
وضعیت پرچم
extended در pcre.
هنگامی که
این پرچم
روشن است،
نویسههای
فاصله در
الگو (به جز
درون یک
کلاس نویسه)
نادیده
گرفته
میشوند.
برای
گنجاندن یک
نویسه
فاصله به
عنوان بخشی
از الگو، آن
را با
بکاسلش
گریز دهید (escape
کنید).
نکته: بعد از الگوها از #comment استفاده نکنید.
- A (پیشفرض: خاموش)
- تغییر وضعیت پرچم ANCHORED در pcre. هنگامی که این پرچم روشن است، الگو مجبور میشود «مهار» شود، یعنی فقط در ابتدای رشتهای که مورد جستجو قرار میگیرد («رشته هدف») تطابق یابد. این اثر را میتوان با ساختارهای مناسب در خود الگو نیز به دست آورد.
- E (پیشفرض: خاموش)
- تغییر وضعیت پرچم DOLLAR_ENDONLY در pcre. هنگامی که این پرچم روشن است، فرانَویسه $ در الگو فقط در انتهای رشته هدف تطابق مییابد. بدون این پرچم، اگر نویسه پایانی یک نویسه خط جدید باشد، علامت دلار بلافاصله قبل از آن نیز تطابق مییابد (اما قبل از سایر نویسههای خط جدید تطابق نمییابد). اگر پرچم MULTILINE تنظیم شده باشد، این پرچم نادیده گرفته میشود.
- U (پیشفرض: خاموش)
- تغییر وضعیت پرچم UNGREEDY در pcre. هنگامی که این پرچم روشن است، موتور تطابق الگو «طمعورزی» (greediness) کمیتسنجها را معکوس میکند، به طوری که بهطور پیشفرض حریصانه نباشند، اما اگر بعد از آنها «?» بیاید حریصانه شوند. این پرچم را میتوان با تغییردهنده (?U) در داخل الگو نیز تنظیم کرد.
- X (پیشفرض: خاموش)
- تغییر
وضعیت پرچم
EXTRA در pcre.
هنگامی که
این پرچم
روشن است،
هر بکاسلش
در الگو که
پس از آن
حرفی بدون
معنای خاص
قرار گیرد
باعث ایجاد
خطا
میشود؛
بدین ترتیب
این
ترکیبها
برای
استفادههای
آینده رزرو
میشوند.
این ویژگی در PCRE2 پشتیبانی نمیشود.
ترتیب جستجو (SEARCH ORDER)
الگوها به ترتیبی که در جدول مشخص شدهاند اعمال میشوند، تا زمانی که الگویی پیدا شود که با رشته ورودی مطابقت داشته باشد.
هر الگو روی کل رشته ورودی اعمال میشود. بسته به کاربرد، آن رشته ممکن است کل نام میزبان سرویسگیرنده، کل آدرس IP سرویسگیرنده یا کل یک آدرس ایمیل باشد. بنابراین، هیچ جستجویی در دامنه والد یا شبکه والد انجام نمیشود و آدرسهای ایمیل user@domain به بخشهای تشکیلدهنده user و domain تفکیک نمیشوند، و همچنین user+foo به user و foo تجزیه نمیشود.
جایگزینی متن (TEXT SUBSTITUTION)
جایگزینی زیررشتهها (متنی که با الگوهای داخل «()» تطابق دارد) از عبارت تطابقیافته در رشته نتیجه با $1، $2 و غیره درخواست میشود؛ برای تولید نویسه $ در خروجی، $$ را مشخص کنید. اگر پس از ماکروها در رشته نتیجه، نویسه فاصله نیاید، ممکن است لازم باشد به صورت ${n} یا $(n) نوشته شوند. این ویژگی از نامهای زیررشته در pcre2 پشتیبانی نمیکند.
نکته: از آنجا که الگوهای نفیشده (آنهایی که با ! شروع میشوند) زمانی نتیجه را برمیگردانند که عبارت تطابق نداشته باشد، امکان جایگزینی برای الگوهای نفیشده وجود ندارد.
تعریف درونخطی (INLINE SPECIFICATION)
محتویات یک جدول را میتوان در نام جدول مشخص کرد (در Postfix نسخه ۳.۷ و بالاتر). نحو پایه عبارت است از:
main.cf:
parameter = .. pcre:{ { rule-1 }, { rule-2 } .. } ..
master.cf:
.. -o { parameter = .. pcre:{ { rule-1 }, { rule-2 } .. } .. } ..
نرمافزار Postfix بهطور بازگشتی تمام نمونههای $parametername را در مقدار پارامتر بالا بسط میدهد، فاصلههای بعد از «{» و قبل از «}» را نادیده میگیرد و هر rule را به صورت یک خط متنی در یک فایل درونحافظهای مینویسد:
in-memory file:
rule-1
rule-2
..
سپس Postfix نتیجه را به گونهای پردازش میکند که گویی فایلی در مسیر /etc/postfix است.
هشدارهای تعریف درونخطی (INLINE SPECIFICATION CAVEATS)
- هنگام استفاده از $parametername در داخل یک الگوی درونخطی، از \Q$parametername\E برای غیرفعال کردن فرانَویسههایی مانند «.» در بسط $parametername استفاده کنید. در غیر این صورت، الگو ممکن است تطابقهای غیرمنتظرهای داشته باشد.
- هنگامی که یک قاعده درونخطی باید شامل $ باشد، $$ را مشخص کنید تا از تلاش Postfix برای بسط دادن $name در حین ارزیابی مقدار پارامتر جلوگیری شود. برای بررسی یک پیکربندی درونخطی، از گزینه «postconf -x» همانطور که در زیر نشان داده شده است استفاده کنید:
- هنگامی که یک مقدار «parametername = value» در main.cf شامل یک جدول درونخطی :pcre است، از دستور «postconf -x parametername» استفاده کنید. بررسی کنید که هیچ هشدار "undefined parameter" وجود نداشته باشد و خروجی دارای نحوی باشد که در یک فایل غیردرونخطی :pcre در Postfix استفاده میشود.
- هنگامی که یک بازنویسی به صورت «-o { parametername = value }» در master.cf شامل یک جدول درونخطی :pcre است، از دستور «postconf -Px '*/*/parametername' » استفاده کنید. بررسی کنید که هیچ هشدار "undefined parameter" وجود نداشته باشد و خروجی دارای نحوی باشد که در یک فایل غیردرونخطی :pcre در Postfix استفاده میشود.
مثال نگاشت دسترسی SMTPD (EXAMPLE SMTPD ACCESS MAP)
# محافظت از exploderهای خروجی majordomo شما
/^(?!owner-)(.*)-outgoing@(.*)/ 550 Use ${1}@${2} instead
# بازگرداندن friend@whatever، به جز زمانی که whatever دامنه خودمان باشد
/^(friend@(?!my\.domain$).*)$/ 550 Stick this in your pipe $1
# یک ورودی چندخطی. متن به صورت یک خط ارسال میشود.
#
/^noddy@my\.domain$/
550 This user is a funny one. You really don't want to send mail to
them as it only makes their head spin.
مثال نگاشت فیلتر سرآیند (EXAMPLE HEADER FILTER MAP)
/^Subject: make money fast/ REJECT /^To: friend@public\.com/ REJECT
مثال نگاشت فیلتر بدنه (EXAMPLE BODY FILTER MAP)
# ابتدا متن کدگذاریشده با base 64 را برای صرفهجویی در چرخههای پردازنده رد کنید.
# نیازمند PCRE نسخه ۳ است.
~^[[:alnum:]+/]{60,}$~ OK
# الگوهای بدنه خود را در اینجا قرار دهید.
همچنین ببینید (SEE ALSO)
postmap(1), مدیر جدولهای جستجوی Postfix postconf(5), پارامترهای پیکربندی regexp_table(5), قالب جدولهای عبارت باقاعده POSIX
فایلهای راهنما (README FILES)
برای یافتن این اطلاعات از «postconf readme_directory» یا «postconf html_directory» استفاده کنید.
DATABASE_README, بررسی اجمالی جدولهای جستجوی Postfix
نویسندگان (AUTHORS)
کد جستجوی جدول 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