| waypipe(1) | General Commands Manual | waypipe(1) |
نام (NAME)
waypipe - یک پروکسی شفاف برای برنامههای Wayland
خلاصه دستور (SYNOPSIS)
waypipe [options...] ssh [ssh options] destination command...
waypipe [options...] client
waypipe [options...] server -- command...
waypipe bench
waypipe [--version] [-h, --help]
[options...] = [-c, --compress C] [-d, --debug] [-n, --no-gpu] [-o, --oneshot] [-s, --socket S] [--display D] [--drm-node R] [--remote-node R] [--ssh-bin R] [--remote-bin R] [--remote-socket S] [--login-shell] [--threads T] [--title-prefix P] [--unlink-socket] [--video V] [--vsock] [--secctx S] [--xwls]
توضیحات (DESCRIPTION)
ابزار Waypipe یک پروکسی برای کلاینتهای Wayland است که هدف آن پشتیبانی از رفتاری مشابه با ssh -X میباشد.
افزودن پیشوند به دستور ssh ... برای تبدیل شدن به waypipe ssh ... به طور خودکار waypipe را هم به صورت محلی و هم از راه دور اجرا میکند، و دستور ssh را به گونهای تغییر میدهد که هدایت (forwarding) میان این دو نمونه از waypipe برقرار شود. نمونهٔ دوردست مانند یک کامپوزیتور Wayland عمل خواهد کرد و به برنامههای Wayland که از راه دور اجرا میشوند اجازه میدهد تا در سیستم محلی نمایش داده شوند.
هنگامی که به عنوان waypipe client اجرا شود، یک سوکت (به طور پیشفرض در /tmp/waypipe-client.sock) باز کرده و به کامپوزیتور محلی Wayland متصل میشود و تمامی برنامههای Wayland را که از طریق سوکت توسط یک نمونهٔ متناظر waypipe server متصل شدهاند هدایت میکند.
هنگامی که به عنوان waypipe server اجرا شود، دستوری را که در فراخوانی خط فرمان پس از آن میآید اجرا کرده، سوکت کامپوزیتور Wayland مخصوص خود را راهاندازی میکند و تلاش میکند به سوکت متناظر waypipe client (به طور پیشفرض /tmp/waypipe-server.sock) متصل شود و تمامی کلاینتهای Wayland را که به سوکت کامپوزیتور ساختگی متصل میشوند، به waypipe client متناظر هدایت نماید.
حالت waypipe bench میتواند برای برآورد اینکه کدام گزینههای فشردهسازی برای یک پهنای باند اتصال و تعداد نخ مشخص، کمترین تاخیر (latency) را ایجاد میکنند استفاده شود. این حالت دو تصویر ساختگی را آزمایش میکند؛ یکی به گونهای ساخته شده که فشردهسازی آن تقریباً مشابه تصاویر حاوی متن باشد، و دیگری به گونهای که فشردهسازی آن شبیه به تصاویر حاوی عکس و تصویر واقعی باشد.
گزینهها (OPTIONS)
-c C, --compress C
† مگر اینکه waypipe بدون پشتیبانی از LZ4 ساخته شده باشد، که در این حالت فشردهسازی پیشفرض none خواهد بود.
-d, --debug
-h, --help
-n, --no-gpu
-o, --oneshot
-s S, --socket S
هنگامی که vsock فعال است، از S برای تعیین یک CID و شماره پورت استفاده کنید.
--version
--display D
--drm-node R
--remote-node R
--ssh-bin R
--remote-bin R
--remote-socket R
--login-shell
--threads T
--title-prefix P
--unlink-socket
--video V
h264
vp9
av1
sw, swenc, swdec
hw, hwenc, hwdec
bpf=B
--vsock
--secctx S
--xwls
--control C
--hwvideo
--allow-tiled
مثالها (EXAMPLES)
زیرفرمان waypipe ssh زیر تلاش میکند تا weston-flower را روی سرور exserv اجرا کند و نتیجه را روی سیستم محلی نمایش دهد.
waypipe ssh user@exserv weston-flower
میتوان با اجرای صریح waypipe و ssh به رفتار مشابهی دست یافت:
waypipe --socket /tmp/socket-client client & ssh -R /tmp/socket-server:/tmp/socket-client user@exserv \ waypipe --socket /tmp/socket-server server -- weston-flower kill %1
Waypipe میتواند به صورت محلی و بدون اتصال SSH، از طریق تعیین مسیرهای سوکت مطابق با یکدیگر اجرا شود. برای مثال:
waypipe --socket /tmp/waypipe.sock client & waypipe --socket /tmp/waypipe.sock server weston-simple-dmabuf-egl kill %1 rm /tmp/waypipe.sock
استفاده از روشهای انتقال غیر از SSH کمی پیچیدهتر است. روشی با استفاده از ncat برای اتصال به remote از رایانه local:
$ waypipe --socket /tmp/waypipe-remote.sock client &
$ ncat --ssl -lk 12345 --sh-exec 'ncat -U /tmp/waypipe-remote.sock' &
$ ssh user@remote
> ncat -lkU /tmp/waypipe-local.sock --sh-exec 'ncat --ssl local 12345' &
> waypipe --display wayland-local \
--socket /tmp/waypipe-local.sock server -- sleep inf &
> WAYLAND_DISPLAY=wayland-local application
با داشتن یک فایل گواهی (certificate)، ابزار socat نیز میتواند یک اتصال رمزگذاریشده فراهم کند (برای بررسی گواهیها عبارت 'verify=0' را حذف کنید):
$ waypipe --socket /tmp/waypipe-remote.sock client &
$ socat openssl-listen:12345,reuseaddr,cert=certificate.pem,verify=0,fork \
unix-connect:/tmp/waypipe-remote.sock
$ ssh user@remote
> socat unix-listen:/tmp/waypipe-local.sock,reuseaddr,fork \
openssl-connect:local:12345,verify=0 &
> waypipe --socket /tmp/waypipe-local.sock server -- application
بسیاری از برنامهها برای استفاده از ویلند به جای X11 نیازمند متغیرهای محیطی خاصی هستند. اگر ssh برای پشتیبانی از بارگذاری ~/.ssh/environment یا مجاز کردن تنظیم متغیرهای خاص با استفاده از AcceptEnv/SetEnv پیکربندی نشده باشد، میتوان waypipe ssh را بدون دستور اجرا کرد (و در نتیجه یک پوسته ورود باز نمود)، یا از env برای تنظیم متغیرهای مورد نیاز در هر بار استفاده کرد:
waypipe ssh user@host env XDG_SESSION_TYPE=wayland dolphin
در برخی موارد، ممکن است بخواهید متغیرهای محیطی را برای خودِ فرایند waypipe server تنظیم کنید؛ ترفند بالا با دستور env این کار را انجام نمیدهد، زیرا فرایند env یک فرزند از waypipe server خواهد بود، نه برعکس. در عوض، میتوان از ~/.ssh/environment استفاده کرد، یا با استفاده از گزینه --remote-bin نمونه Waypipe راه دور را به یک اسکریپت شل تغییر داد که محیط را قبل از اجرای برنامه اصلی waypipe تنظیم میکند.
هنگام اجرای waypipe در ماشینهای مجازی روی یک میزبان (host) یکسان، امکان استفاده از vsock برای ارتباط بهینه بین ماشینهای مجازی (inter-vm) وجود دارد. سناریوهای زیر پشتیبانی میشوند:
- •
- اجرای برنامهها روی میزبان از طریق مهمان (guest).
host> waypipe --vsock -s 1234 client guest> waypipe --vsock -s 1234 server weston-terminal
- •
- اجرای برنامهها در یک ماشین مجازی مهمان از طریق میزبان.
guest> waypipe --vsock -s 1234 client host> waypipe --vsock -s 3:1234 server weston-terminal
در این مثال، سرور waypipe به یک ماشین مجازی با CID 3 روی درگاه 1234 متصل میشود.
- •
- اجرای برنامهها در یک ماشین مجازی مهمان از طریق ماشینهای مجازی مهمان دیگر. هنگام اجرای هر دوی کلاینت و سرور در ماشینهای مجازی، امکان فعال کردن پرچم VMADDR_FLAG_TO_HOST برای ارتباط با ماشینهای همتا (sibling) با افزودن پیشوند s به CID وجود دارد:
guest> waypipe --vsock -s 1234 client guest> waypipe --vsock -s s3:1234 server weston-terminal
در این حالت تمام بستهها به میزبان هدایت خواهند شد، جایی که میتوانند با استفاده از یک دستگاه vhost-device-vsock یا ابزاری دیگر به ماشین مجازی دیگری فوروارد شوند.
محیط (ENVIRONMENT)
هنگام اجرا به عنوان سرور، بهطور پیشفرض WAYLAND_DISPLAY برای فرایند فراخوانیشده تنظیم خواهد شد.
اگر پرچم --oneshot تعیین شده باشد، waypipe در عوض WAYLAND_SOCKET را تنظیم کرده و یک توصیفکننده فایل socketpair از پیش متصلشده را به فرایند فراخوانیشده (فرزند) به ارث میدهد. برخی برنامهها در خلال مقداردهی اولیه خود مکرراً یک اتصال Wayland را باز و بسته میکنند و با این پرچم بهدرستی کار نخواهند کرد.
وضعیت خروج (EXIT STATUS)
در صورت مواجهه با خطا، waypipe با کد وضعیت 1 خارج خواهد شد؛ در غیر این صورت، کد وضعیت خروج دستور در حال اجرا (یا 128 بهعلاوه مقدار سیگنال خاتمهدهنده) را، در صورت وجود، بازمیگرداند.
امنیت (SECURITY)
برنامه Waypipe هیچگونه تضمین امنیتی قوی ارائه نمیدهد، و اتصال به سرورهای غیرقابل اعتماد توصیه نمیشود. این برنامه پروتکلهای Wayland ارائهشده توسط کامپوزیتور به کلاینت را فیلتر نمیکند (بهجز چند مورد استثنا برای پروتکلهایی که به توصیفکنندههای فایل نیاز دارند و Waypipe هنوز نمیتواند آنها را مدیریت کند). به عنوان مثال، اگر یک کامپوزیتور Wayland به تمام کلاینتهای خود دسترسی به یک پروتکل اسکرینشات یا lock-screen را بدهد، کلاینتهای پراکسیشده تحت Waypipe نیز میتوانند اسکرینشات بگیرند یا صفحه را قفل کنند.
بهطور کلی، برنامهها در برابر کامپوزیتورهای مخرب بهخوبی آزمایش نشدهاند و کامپوزیتورها نیز در برابر کلاینتهای مخرب آزموده نشدهاند. برنامه Waypipe میتواند این دو را به یکدیگر متصل کند و ممکن است حملات منع سرویس (denial-of-service) و سایر حملات را بدون بررسی فوروارد کند.
خود Waypipe دارای کدهای ناامن (unsafe) فراوانی در زبان Rust است و به کتابخانههای فشردهسازی، گرافیک و ویدیو پیوند (link) میخورد؛ هم خود برنامه و هم این کتابخانهها ممکن است دارای آسیبپذیریهای امنیتی باشند. با ساختن (کامپایل) Waypipe با پشتیبانی غیرفعال از DMABUF، یا اجرای Waypipe با پرچم --no-gpu به نحوی که کتابخانههای گرافیکی را در دسترس قرار ندهد، میتوان از بخشی از این خطرات اجتناب کرد.
دستور waypipe ssh هیچ حفاظت صریحی در برابر حملات زمانبندی (timing attacks) ندارد؛ یک ناظر بر ترافیک شبکه حاصل میتواند با بررسی اندازه و زمانبندی بستهها، اطلاعاتی درباره تعامل کاربر با کلاینت Wayland پراکسیشده از طریق waypipe ssh به دست آورد. به عنوان مثال: عدم فعالیت نشان میدهد که کاربر در حال حاضر از برنامه استفاده نمیکند، در حالی که جریانی متناوب از پیامها از کامپوزیتور به کلاینت ممکن است نشاندهنده حرکت ماوس باشد (یا شاید چیزی دیگر: محتوای پیامها توسط ssh محافظت میشود.).
حافظه مورد استفاده توسط فرایندهای Waypipe ممکن است در هر لحظه شامل پیامهای Wayland حاوی ورودیهای کاربر، و محتوای فریمهای کنونی و اخیر رسمشده برای پنجرههای برنامه باشد. فضای Swap باید رمزنگاری شود تا از نشت این اطلاعات به دیسک جلوگیری به عمل آید.
گزارشهای باگ را در این نشانی ثبت کنید: https://gitlab.freedesktop.org/mstoeckl/waypipe
مشکلات رایج
برخی از برنامهها (از جمله gnome-terminal، firefox، kate) سازوکارهای ویژهای دارند تا اطمینان حاصل شود که در هر زمان تنها یک فرایند در حال اجرا است. اجرای این برنامهها تحت Waypipe در حالی که تحت یک کامپوزیتور Wayland دیگر در حال اجرا هستند، ممکن است بدون هیچ هشداری پنجره یا زبانهای را در نمونهی اصلی برنامه باز کند. چنین برنامههایی ممکن است آرگومان خط فرمانی برای ایجاد یک نمونهی جدید داشته باشند.
دستور waypipe ssh نیازمند آن است که فایل اجرایی ssh از فوروارد کردن سوکت Unix پشتیبانی کند؛ این قابلیت در OpenSSH تنها از نسخه 6.7 (از سال ۲۰۱۴) پشتیبانی میشود و ممکن است به پیکربندی خاصی نیاز داشته باشد. سایر پیادهسازیهای SSH ممکن است قادر به فوروارد کردن سوکتهای Unix نباشند؛ برای نحوه استفاده از روشهای انتقال غیر SSH بخش مثالها را در بالا ببینید.
همچنین ببینید (SEE ALSO)
| 2026-08-31 |