rmid(1) Remote Method Invocation (RMI) Tools rmid(1)

rmid - دیمن سیستم فعال‌سازی را راه‌اندازی می‌کند که امکان ثبت و فعال‌سازی اشیاء را در یک ماشین مجازی جاوا (JVM) فراهم می‌سازد.

rmid [options]
گزینه‌های خط فرمان. بخش گزینه‌ها را ببینید.

دستور rmid دیمن سیستم فعال‌سازی (activation system daemon) را راه‌اندازی می‌کند. دیمن سیستم فعال‌سازی باید پیش از آنکه اشیای قابل‌فعال‌سازی بتوانند در سیستم فعال‌سازی ثبت یا در یک JVM فعال شوند، راه‌اندازی شود. برای جزئیات در مورد نحوه نوشتن برنامه‌هایی که از اشیای قابل‌فعال‌سازی استفاده می‌کنند، به آموزش Using Activation در نشانی http://docs.oracle.com/javase/8/docs/technotes/guides/rmi/activation/overview.html مراجعه کنید.

با اجرای دستور rmid و مشخص کردن یک فایل خط‌مشی امنیتی (security policy file)، دیمن را به صورت زیر راه‌اندازی کنید:

rmid -J-Djava.security.policy=rmid.policy

هنگامی که پیاده‌سازی اوراکل از دستور rmid را اجرا می‌کنید، به‌طور پیش‌فرض باید یک فایل خط‌مشی امنیتی مشخص کنید تا دستور rmid بتواند بررسی کند که آیا اطلاعات موجود در هر ActivationGroupDesc مجاز به استفاده برای راه‌اندازی JVM برای یک گروه فعال‌سازی است یا خیر. به‌طور خاص، دستور و گزینه‌های مشخص‌شده توسط CommandEnvironment و هر ویژگی که به سازنده ActivationGroupDesc ارسال می‌شود، اکنون باید صراحتاً در فایل خط‌مشی امنیتی برای دستور rmid مجاز شمرده شوند. مقدار ویژگی sun.rmi.activation.execPolicy خط‌مشی مورد استفاده دستور rmid را تعیین می‌کند تا مشخص شود که آیا اطلاعات موجود در یک ActivationGroupDesc می‌تواند برای شروع یک JVM برای گروه فعال‌سازی به کار رود یا خیر. برای اطلاعات بیشتر به توضیحات گزینه -J-Dsun.rmi.activation.execPolicy=policy مراجعه کنید.

اجرای دستور rmid، فعال‌ساز (Activator) و یک رجیستری داخلی را روی پورت پیش‌فرض 1098 راه‌اندازی می‌کند و یک ActivationSystem را به نام java.rmi.activation.ActivationSystem در این رجیستری داخلی پیوند می‌دهد.

برای مشخص کردن یک پورت جایگزین برای رجیستری، هنگام اجرای دستور rmid باید گزینه -port را مشخص کنید. برای مثال، دستور زیر دیمن سیستم فعال‌سازی و یک رجیستری را روی پورت پیش‌فرض رجیستری (1099) راه‌اندازی می‌کند:

rmid -J-Djava.security.policy=rmid.policy -port 1099

یک روش جایگزین برای راه‌اندازی rmid از خط فرمان، پیکربندی inetd (در Oracle Solaris) یا xinetd (در لینوکس) است تا rmid را در صورت تقاضا (on demand) راه‌اندازی کند.

هنگامی که RMID شروع به کار می‌کند، تلاش می‌کند تا با فراخوانی متد System.inheritedChannel یک کانال موروثی (به‌ارث‌رسیده از inetd/xinetd) به دست آورد. اگر کانال موروثی null باشد یا نمونه‌ای از java.nio.channels.ServerSocketChannel نباشد، RMID فرض می‌کند که توسط inetd/xinetd راه‌اندازی نشده است و همان‌طور که پیش‌تر شرح داده شد شروع به کار می‌کند.

اگر کانال موروثی نمونه‌ای از ServerSocketChannel باشد، RMID از java.net.ServerSocket به‌دست‌آمده از ServerSocketChannel به عنوان سوکت سروری استفاده می‌کند که درخواست‌های اشیای دوردست صادرشده خود را می‌پذیرد: رجیستری که java.rmi.activation.ActivationSystem در آن مقید شده است و شیء دوردست java.rmi.activation.Activator. در این حالت، رفتار RMID مشابه زمانی است که از خط فرمان راه‌اندازی می‌شود، مگر در موارد زیر:

•
خروجی چاپ‌شده در System.err به یک فایل هدایت می‌شود. این فایل در دایرکتوری مشخص‌شده توسط ویژگی سیستمی java.io.tmpdir (معمولاً /var/tmp یا /tmp) با پیشوند rmid-err و پسوند tmp قرار می‌گیرد.
•
گزینه -port مجاز نیست. اگر این گزینه مشخص شود، RMID با یک پیام خطا خارج می‌شود.
•
گزینه -log الزامی است. اگر این گزینه مشخص نشود، RMID با یک پیام خطا خارج می‌شود.

برای جزئیات در مورد نحوه پیکربندی سرویس‌ها جهت راه‌اندازی بر حسب تقاضا، به صفحات راهنمای inetd (در Oracle Solaris) یا xinetd (در لینوکس) مراجعه کنید.


گزینه‌ای را مشخص می‌کند که هنگام ایجاد هر پردازش فرزند (گروه فعال‌سازی) توسط دستور rmid، به عنوان آرگومان خط فرمان به آن پردازش ارسال می‌شود. به عنوان مثال، می‌توانید یک ویژگی را به هر ماشین مجازی ایجادشده توسط دیمن سیستم فعال‌سازی ارسال کنید:
rmid -C-Dsome.property=value

این قابلیت برای ارسال آرگومان‌های خط فرمان به پردازش‌های فرزند می‌تواند برای اشکال‌زدایی مفید باشد. برای نمونه، دستور زیر ثبت وقایع فراخوانی سرور (server-call logging) را در تمام JVMهای فرزند فعال می‌کند:

rmid -C-Djava.rmi.server.logCalls=true

گزینه‌ای را مشخص می‌کند که به مفسر جاوا که در حال اجرای RMID است ارسال می‌شود. به عنوان مثال، برای مشخص کردن اینکه دستور rmid از یک فایل خط‌مشی به نام rmid.policy استفاده کند، گزینه -J می‌تواند برای تعریف ویژگی java.security.policy در خط فرمان rmid استفاده شود، برای نمونه:
rmid -J-Djava.security.policy=rmid.policy

خط‌مشی‌ای را مشخص می‌کند که RMID برای بررسی دستورات و گزینه‌های خط فرمان به کار گرفته‌شده جهت راه‌اندازی JVM که یک گروه فعال‌سازی در آن اجرا می‌شود، به کار می‌برد. لطفاً توجه داشته باشید که این گزینه فقط در پیاده‌سازی دیمن فعال‌سازی Java RMI اوراکل وجود دارد. اگر این ویژگی در خط فرمان مشخص نشود، نتیجه همانند حالتی است که -J-Dsun.rmi.activation.execPolicy=default مشخص شده باشد. مقادیر ممکن برای policy می‌تواند default، policyClassName یا none باشد.
•
default

مقدار default یا تعیین‌نشده برای execPolicy به دستور rmid اجازه می‌دهد دستورات را با گزینه‌های خط فرمان خاص تنها در صورتی اجرا کند که به دستور rmid در فایل خط‌مشی امنیتی مورد استفاده آن، مجوز اجرای آن دستورات و گزینه‌ها اعطا شده باشد. تنها پیاده‌سازی پیش‌فرض گروه فعال‌سازی می‌تواند با خط‌مشی اجرای پیش‌فرض استفاده شود.

دستور rmid یک JVM را برای یک گروه فعال‌سازی با اطلاعات موجود در توصیف‌گر گروه فعال‌سازی ثبت‌شده گروه، یعنی ActivationGroupDesc راه‌اندازی می‌کند. توصیف‌گر گروه یک ActivationGroupDesc.CommandEnvironment اختیاری را مشخص می‌کند که شامل دستوری برای اجرا جهت راه‌اندازی گروه فعال‌سازی و هرگونه گزینه خط فرمان برای افزودن به خط فرمان است. به‌طور پیش‌فرض، دستور rmid از دستور java موجود در java.home استفاده می‌کند. توصیف‌گر گروه همچنین شامل بازنویسی‌های ویژگی‌ها است که به صورت گزینه‌هایی تعریف‌شده به خط فرمان اضافه می‌شوند: -D<property>=<value>. مجوز com.sun.rmi.rmid.ExecPermission به دستور rmid اجازه می‌دهد تا دستوری را که در CommandEnvironment توصیف‌گر گروه برای راه‌اندازی گروه فعال‌سازی مشخص شده است، اجرا کند. مجوز com.sun.rmi.rmid.ExecOptionPermission به دستور rmid امکان می‌دهد از گزینه‌های خط فرمان مشخص‌شده به عنوان بازنویسی‌های ویژگی‌ها در توصیف‌گر گروه یا به عنوان گزینه‌هایی در CommandEnvironment در هنگام راه‌اندازی گروه فعال‌سازی استفاده کند. هنگام اعطای مجوز به دستور rmid برای اجرای دستورات و گزینه‌های مختلف، مجوزهای ExecPermission و ExecOptionPermission باید به تمام منابع کد اعطا شوند.

ExecPermission

کلاس ExecPermission نشان‌دهنده مجوز برای دستور rmid جهت اجرای یک دستور خاص برای راه‌اندازی گروه فعال‌سازی است.

نحو (Syntax): نام یک ExecPermission، نام مسیر یک دستور است تا به دستور rmid مجوز اجرای آن اعطا شود. نام مسیری که به یک اسلش (/) و یک ستاره (*) ختم می‌شود نشان می‌دهد که تمام فایل‌های موجود در آن دایرکتوری در نظر گرفته می‌شوند که در آن اسلش کاراکتر جداکننده فایل، یعنی File.separatorChar است. نام مسیری که به یک اسلش (/) و یک علامت منها (-) ختم می‌شود تمام فایل‌ها و زیردایرکتوری‌های موجود در آن دایرکتوری را (به‌صورت بازگشتی) نشان می‌دهد. نام مسیری که از نشانه خاص <<ALL FILES>> تشکیل شده است با هر فایلی مطابقت دارد.

نام مسیری که از یک ستاره (*) تشکیل شده باشد، تمام فایل‌های موجود در دایرکتوری جاری را نشان می‌دهد. نام مسیری که از یک علامت منها (-) تشکیل شده باشد، تمام فایل‌های موجود در دایرکتوری جاری و (به‌صورت بازگشتی) تمام فایل‌ها و زیردایرکتوری‌های موجود در دایرکتوری جاری را نشان می‌دهد.

ExecOptionPermission

کلاس ExecOptionPermission نشان‌دهنده مجوز برای دستور rmid جهت استفاده از یک گزینه خط فرمان خاص هنگام راه‌اندازی یک گروه فعال‌سازی است. نام یک ExecOptionPermission مقدار یک گزینه خط فرمان است.

نحو (Syntax): گزینه‌ها از یک طرح نویسه عام (wildcard) محدود پشتیبانی می‌کنند. یک ستاره نشانه تطابق عام است و می‌تواند به عنوان خود نام گزینه ظاهر شود (با هر گزینه‌ای مطابقت دارد)، یا یک ستاره (*) تنها زمانی می‌تواند در انتهای نام گزینه ظاهر شود که ستاره (*) بعد از یک نقطه (.) یا علامت مساوی (=) بیاید.

برای مثال: * یا -Dmydir.* یا -Da.b.c=* معتبر است، اما *mydir یا -Da*b یا ab* معتبر نیست.

فایل خط‌مشی برای rmid (Policy file for rmid)

هنگامی که به دستور rmid مجوز اجرای دستورات و گزینه‌های مختلف را اعطا می‌کنید، مجوزهای ExecPermission و ExecOptionPermission باید به تمام منابع کد اعطا شوند (به‌طور سراسری). اعطای این مجوزها به‌طور سراسری ایمن است زیرا فقط دستور rmid این مجوزها را بررسی می‌کند.

یک نمونه فایل خط‌مشی که مجوزهای مختلف اجرا را به دستور rmid اعطا می‌کند عبارت است از:

grant {
    permission com.sun.rmi.rmid.ExecPermission
        "/files/apps/java/jdk1.7.0/solaris/bin/java";

    permission com.sun.rmi.rmid.ExecPermission
        "/files/apps/rmidcmds/*";

    permission com.sun.rmi.rmid.ExecOptionPermission
        "-Djava.security.policy=/files/policies/group.policy";

    permission com.sun.rmi.rmid.ExecOptionPermission
        "-Djava.security.debug=*";

    permission com.sun.rmi.rmid.ExecOptionPermission
        "-Dsun.rmi.*";
};

نخستین مجوز اعطاشده به دستور rmid امکان می‌دهد تا نسخه 1.7.0 دستور java را که با نام مسیر صریح آن مشخص شده است اجرا کند. به‌طور پیش‌فرض، نسخه دستور java موجود در java.home استفاده می‌شود (همان نسخه‌ای که دستور rmid استفاده می‌کند) و نیازی به مشخص شدن در فایل خط‌مشی ندارد. دومین مجوز به دستور rmid اجازه می‌دهد هر دستوری را در دایرکتوری /files/apps/rmidcmds اجرا کند.

سومین مجوز اعطاشده، یعنی یک ExecOptionPermission، به دستور rmid اجازه می‌دهد یک گروه فعال‌سازی را راه‌اندازی کند که فایل خط‌مشی امنیتی را برابر با /files/policies/group.policy تعریف می‌کند. مجوز بعدی اجازه می‌دهد تا ویژگی java.security.debug توسط یک گروه فعال‌سازی استفاده شود. آخرین مجوز به هر ویژگی در سلسله‌مراتب نام ویژگی‌های sun.rmi اجازه می‌دهد توسط گروه‌های فعال‌سازی استفاده شود.

برای راه‌اندازی دستور rmid با یک فایل خط‌مشی، ویژگی java.security.policy باید در خط فرمان rmid مشخص شود، برای مثال:

rmid -J-Djava.security.policy=rmid.policy.

•
<policyClassName>

اگر رفتار پیش‌فرض به اندازه کافی انعطاف‌پذیر نباشد، یک مدیر سیستم می‌تواند هنگام راه‌اندازی دستور rmid، نام کلاسی را ارائه دهد که متد checkExecCommand آن برای بررسی دستورات اجراشونده توسط دستور rmid فراخوانی شود.

مقدار policyClassName یک کلاس عمومی (public) با یک سازنده عمومی بدون آرگومان و پیاده‌سازی متد checkExecCommand زیر را مشخص می‌کند:

 public void checkExecCommand(ActivationGroupDesc desc, String[] command)
        throws SecurityException;

پیش از راه‌اندازی یک گروه فعال‌سازی، دستور rmid متد checkExecCommand مربوط به خط‌مشی را فراخوانی کرده و توصیف‌گر گروه فعال‌سازی و آرایه‌ای حاوی دستور کامل برای راه‌اندازی گروه فعال‌سازی را به آن ارسال می‌کند. اگر checkExecCommand یک SecurityException پرتاب کند، دستور rmid گروه فعال‌سازی را راه‌اندازی نمی‌کند و یک ActivationException به فراخواننده‌ای که در حال تلاش برای فعال‌سازی شیء است پرتاب می‌شود.

•
none

اگر مقدار ویژگی sun.rmi.activation.execPolicy برابر با none باشد، دستور rmid هیچ‌گونه اعتبارسنجی روی دستورات راه‌اندازی گروه‌های فعال‌سازی انجام نمی‌دهد.


نام دایرکتوری‌ای را مشخص می‌کند که دیمن سیستم فعال‌سازی برای نوشتن پایگاه‌داده و اطلاعات مرتبط خود استفاده می‌کند. دایرکتوری لاگ به‌طور پیش‌فرض اقدام به ایجاد لاگ در دایرکتوری‌ای می‌کند که دستور rmid در آن اجرا شده است.

پورتی را که رجیستری استفاده می‌کند مشخص می‌نماید. دیمن سیستم فعال‌سازی شیء ActivationSystem را با نام java.rmi.activation.ActivationSystem در این رجیستری مقید می‌کند. شیء ActivationSystem در دستگاه محلی را می‌توان با فراخوانی متد Naming.lookup زیر به دست آورد:
import java.rmi.*; 
    import java.rmi.activation.*;
    ActivationSystem system; system = (ActivationSystem)
    Naming.lookup("//:port/java.rmi.activation.ActivationSystem");

فراخوانی جاری دستور rmid را برای پورت مشخص‌شده توسط گزینه -port متوقف می‌کند. اگر هیچ پورتی مشخص نشود، این گزینه فراخوانی rmid در حال اجرا روی پورت 1098 را متوقف می‌کند.

برای ارائه مسیری به کلاس‌های تعریف‌شده توسط کاربر به سیستم استفاده می‌شود. دایرکتوری‌ها با دونقطه (:) از هم جدا می‌شوند، برای مثال: .:/usr/local/java/classes.

•
java(1)
•
راهنمای تنظیم مسیر کلاس (Setting the Class Path)
21 November 2013 JDK 8