تنظیمات ابزار VPN: محیط هنگام اجرا یا خروجی در قلاب؟
قلاب فرزندان خودش را اجرا میکند، نه پوستهای را که از قبل باز کردهاید. محیط هنگام اجرا نقطه پایانی خصوصی را فقط در همان یک فرمانی نگه میدارد که به آن نیاز دارد.
قلاب VPN که یک نقطه پایانی API را خروجی میدهد، محیط فرایندهایی را که اجرا میکند تغییر میدهد، نه محیط پایانهای را که هنگام بالا آمدن تونل از قبل باز بود. همین یک تفاوت بیشتر گزارشهای «ابزار هنوز نقطه پایانی عمومی را صدا میزند» را توضیح میدهد. دو جای قابل استفاده برای گذاشتن تنظیم وجود دارد، و انتخاب به این بستگی دارد که چه کسی آن را مصرف میکند و هر چند وقت تغییر میکند. پیش از افزودن اسکریپت راهاندازی دیگر، آن دو را مقایسه کنید.
دو جا که تنظیم میتواند در آن زندگی کند
گزینه یک پیشوند روی خود فرمان است: مقدار فقط برای همان یک فراخوان وجود دارد و با آن از بین میرود. گزینه دو خروجی درون قلاب اتصال است که به هر فرایندی میرسد که قلاب پس از آن نقطه اجرا کند. این دو در دامنه و طول عمر تفاوت دارند، نه در نحو، و همان تفاوت بیشتر شکستها را رقم میزند.
| Property | Prefix on the command | Export from the hook |
|---|---|---|
| Who receives it | That invocation only | Children the hook starts |
| Lifetime | Until the process exits | Until the hook's own session ends |
| Leakage | Scoped to one command | Applies to later commands in that session |
| Repeat cost | Every invocation | Once per connection |
| Works for an open editor | No, unless the editor is started with it | No |
جدول قلاب را ارزان نشان میدهد و صورتحساب واقعی را پنهان میکند: برای فرمانهایی هم که هیچ ارتباطی با کار ندارند نقطه پایانی خصوصی انتخاب میکند. هر سطر را به عنوان یک محدودیت بخوانید، نه یک ترجیح. اگر نقطه پایانی از کاری به کار دیگر تغییر کند، پیشوند در دقت برنده است، حتی اگر یک فشار کلید هزینه داشته باشد.
چرا قلاب نمیتواند به پوستهای که از قبل باز است برسد
متغیرهای محیطی هنگام ساخته شدن تصویر فرایند به آن تحویل داده میشوند. پوستهای که پیش از اتصال آغاز شده نسخهای را که گرفته نگه میدارد، و خروجیای که درون قلاب اجرا میشود پخش به همه فرایندهای ماشین نیست. فقط فرزندان خود قلاب آن را به ارث میبرند. فرزندان خود پوسته هرچه پوسته در لحظه آغازشان دارد برمیدارند، و به همین دلیل یک فرمان میتواند در یک پایانه کار کند و در پایانه دیگر شکست بخورد.
همین موضوع برای ویرایشگر گرافیکی هم صادق است. میزبان افزونهها، پایانه یکپارچه و سرور زبان پسزمینه آن هنگام اجرا جدا شدهاند و نسخههای خودشان را نگه میدارند. باز کردن دوباره یک پوشه لزوماً آن فرزندان را دوباره راهاندازی نمیکند، پس تنظیمی که افزودهاید همچنان هرگز نمیرسد.
ارزانترین آزمون آن است که متغیر را از جایی چاپ کنید که شکست میخورد، نه از پوستهای که کار میکند. اگر فرایند شکستخورده پیش از تونل آغاز شده باشد، خروجی هرگز شانسی نداشته است.
شکل به ازای هر فرمان، نوشتهشده
پیشوند انتخاب را در همان فرمانی که از آن استفاده میکند دیدنی نگه میدارد، و این وقتی کمک میکند که نقطه پایانی بین کارها تغییر کند:
env INTERNAL_API='https://internal-api.example.net:8443' my-work-tool
فرمان فقط نمونه است: my-work-tool یک جاینگهدار است و INTERNAL_API استاندارد VPN نیست، پس تنظیم مستند برنامهای را که واقعاً اجرا میکنید و میزبان تأییدشده خود را جای آن بگذارید. نشانه یا گذرواژه را در همان خط نگذارید، چون در تاریخچه پوسته میماند.
وقتی چند فرمان به یک کار تعلق دارند، یک اسکریپت پوششی کوتاه و بازبینیشده متغیرها را تنظیم میکند و سپس آنها را اجرا میکند. این کار یک تعریف واحد نگه میدارد بدون آنکه مقدار را برای هر فرمان آینده در پایانه عمومی کند.
دوباره بارگذاری کنید، دوباره راه بیندازید یا رهایش کنید
برای ابزاری که از قبل در حال اجراست، بارگذاری دوباره یا نمایه فضای کاری خودش را ترجیح دهید اگر دارد. در غیر این صورت کار را ذخیره کنید و مؤلفهای را که تنظیم را میخواند دوباره راه بیندازید، که اغلب یک سرور زبان است و نه پنجره ویرایشگر. راهاندازی دوباره پنجره با این فرض که فرایندهای فرزند دنبالش کردهاند همان چیزی است که باعث میشود بارگذاری دوباره به نظر برسد کار نمیکند.
قطع اتصال تصمیمی جداگانه است. مکث، بستن یا اتصال دوباره به برنامه تعلق دارد، و متغیر نقطه پایانی آن را کنترل نمیکند. متغیر را پیکربندیای بدانید که نشانی را انتخاب میکند، نه قاعدهای درباره اینکه پس از آن کدام ترافیک شبکه مجاز است، و این دو مسئله قابل تفکیک میمانند.