این باور وجود دارد که یک here-document چهارخطی یک ورود غیرتعاملی کامل است، و این باور تا زمانی دوام می‌آورد که دروازه دو گروه ارائه دهد، بنر چاپ کند یا بعد از گذرواژه توکن بخواهد. آن‌گاه همان اسکریپت گذرواژه را در منویی تایپ می‌کند که انتظار یک عدد داشت. کلاینت خط فرمان در لینوکس قابل اسکریپت‌نویسی است، اما تنها اگر آنچه را واقعاً انتظار دارد به آن بدهید، نه آنچه آموزش فرض کرده بود.

here-document ثابت افسانه است

کلاینت لینوکس سیسکو برنامه کوچکی را در /opt/cisco/anyconnect/bin/vpn نصب می‌کند و Secure Client 5 هنوز آن را عرضه می‌کند. وقتی سرویس vpnagentd در حال اجراست، پرچم -s پاسخ‌ها را به همان ترتیبی که کلاینت می‌پرسد از ورودی استاندارد می‌خواند. این ترتیب میان سرورها ثابت نیست.

یک منوی گروهی یک خط اضافه می‌کند. یک بنر ورود خط دیگری اضافه می‌کند. درخواست توکن بعد از گذرواژه یک اسکریپت چهارخطی را کاملاً می‌شکند، چون خط پنجم هرگز قرار نبود توکن باشد. شکست بی‌صداست: کلاینت رشته اشتباه را می‌گیرد، تلاش اتصال پایان می‌یابد و اسکریپت هیچ چیز مفیدی گزارش نمی‌کند.

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

کلاینت منتظر چه چیزی است

در حالت معمول یک‌گروهی، ترتیب نام کاربری، گذرواژه و گاهی تأیید بنر است. خط اول یک here-document تنها زمانی به شاخص منو تبدیل می‌شود که سرور واقعاً منویی نشان دهد، و به همین دلیل همان اسکریپت در یک سایت کار می‌کند و در سایت بعدی شکست می‌خورد.

/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF

آن را چهار پاسخ به چهار پرسش ممکن بخوانید، نه یک پروتکل ثابت. صفر یک انتخاب منو است، نه گذرواژه، و y پایانی بنری را می‌پذیرد که بسیاری از دروازه‌ها هرگز نمی‌فرستند.

وقتی ترتیب قابل پیش‌بینی نیست از expect استفاده کنید

وقتی ترتیب اعلان‌ها تغییر می‌کند، شمردن خطوط را کنار بگذارید و به‌جای آن منتظر اعلان بمانید. یک اسکریپت expect فرمان connect را اجرا می‌کند، منتظر اعلان نام کاربری می‌ماند، می‌فرستد، منتظر اعلان گذرواژه می‌ماند، می‌فرستد و سپس منتظر وضعیت متصل می‌ماند. هر انتظار مهلت خودش را دارد.

مهلت تمام‌شده را شکست بدانید و خارج شوید. اسکریپتی که بعد از یک اعلان غیرمنتظره به فرستادن ورودی ادامه دهد، با خوشحالی گذرواژه را در یک پوسته، یک منو یا هر چیز دیگری که در حال خواندن است تایپ می‌کند. این‌گونه است که یک اسکریپت ورود به یک حادثه تبدیل می‌شود.

expect همچنین گزارشی به شما می‌دهد که می‌توانید با حذف بخش محرمانه ثبتش کنید، و وقتی دروازه پس از ارتقا اعلان‌هایش را تغییر می‌دهد، این از کد خروج ارزشمندتر است.

راز باید جایی زندگی کند

هر نسخه از این مسئله یک ضعف مشترک دارد: گذرواژه باید به شکلی وجود داشته باشد که کلاینت بتواند بخواند. فرستادن آن به‌عنوان آرگومان آن را در جدول فرایندها آشکار می‌کند. عبور دادن از طریق خط لوله اغلب آن را در تاریخچه پوسته می‌گذارد. هر دو برای دیگر کاربران محلی روی یک میزبان پرش مشترک قابل خواندن است.

install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net

پرونده‌ای با مجوز 600 که متعلق به حساب است کمینه است، و هنوز رازی متنی روی دیسک است. secret-tool lookup از کلیدحلقه لینوکس می‌خواند و در macOS همان کار را security find-generic-password -w انجام می‌دهد. جایی که سازمان احراز هویت با گواهی یا SAML را پشتیبانی می‌کند، آن را ترجیح دهید، چون گذرواژه ذخیره‌شده به‌همراه MFA هنوز نمی‌تواند بدون یک انسان ورود را کامل کند.

تونل را تأیید کنید و سپس بستن آن را بر عهده بگیرید

به نبود متن خطا اعتماد نکنید. وضعیت را از کلاینت بپرسید و رابط را مستقل بررسی کنید:

/opt/cisco/anyconnect/bin/vpn state
ip -brief address

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

با vpn disconnect قطع کنید و بگذارید اسکریپتی که تونل را راه انداخته بستن را بر عهده بگیرد. کاری که شکست بخورد و نشستی را باز بگذارد یک جایگاه مجوز را مصرف می‌کند و برای نفر بعدی که تلاش می‌کند شبیه مشکلی در احراز هویت به نظر می‌رسد.

ترتیب کار: vpnagentd را تأیید کنید، ترتیب واقعی اعلان‌ها را ثبت کنید، here-document یا expect را انتخاب کنید، راز را از argv و تاریخچه بیرون نگه دارید، وضعیت و یک منبع را بررسی کنید و سپس در همان اسکریپت قطع کنید.

مقالات مرتبط