SSHPASS(1) Sshpass User Manual SSHPASS(1)

sshpass - ارائه‌دهنده غیرتعاملی گذرواژه برای ssh

sshpass [-ffilename|-dnum|-ppassword|-e[env_var]] [options] command arguments

این صفحه راهنما دستور sshpass را مستند می‌کند.

دستور sshpass ابزاری است که برای اجرای ssh با استفاده از حالتی موسوم به اصالت‌سنجی تعاملی گذرواژه با صفحه‌کلید («keyboard-interactive»)، اما در حالت غیرتعاملی طراحی شده است.

دستور ssh از دسترسی مستقیم به TTY استفاده می‌کند تا مطمئن شود گذرواژه واقعاً توسط یک کاربر از صفحه‌کلید تعاملی صادر شده است. Sshpass دستور ssh را در یک tty اختصاصی اجرا می‌کند و آن را فریب می‌دهد تا تصور کند گذرواژه را از یک کاربر تعاملی دریافت می‌کند.

دستوری که باید اجرا شود پس از گزینه‌های خود sshpass مشخص می‌شود. معمولاً این دستور «ssh» به همراه آرگومان‌ها است، اما می‌تواند هر دستور دیگری نیز باشد. با این حال، اعلان گذرواژه (password prompt) که توسط ssh استفاده می‌شود، در حال حاضر در کد sshpass به صورت ثابت قرار داده شده است.

اگر هیچ گزینه‌ای داده نشود، sshpass گذرواژه را از ورودی استاندارد می‌خواند. کاربر می‌تواند حداکثر یک منبع جایگزین برای گذرواژه مشخص کند:

گذرواژه در خط فرمان داده می‌شود. لطفاً به بخش «ملاحظات امنیتی (SECURITY CONSIDERATIONS)» توجه فرمایید.
گذرواژه خط اول فایل filename است.
مقدار number یک توصیف‌گر فایل به ارث رسیده توسط sshpass از اجراکننده است. گذرواژه از این توصیف‌گر فایل باز خوانده می‌شود.
گذرواژه از یک متغیر محیطی گرفته می‌شود. اگر env_var مشخص شده باشد، از همان متغیر محیطی استفاده می‌شود. در غیر این صورت، گذرواژه از متغیر SSHPASS گرفته خواهد شد.
اعلان گذرواژه را تعیین می‌کند. Sshpass در خروجی برنامه به TTY به دنبال این اعلان می‌گردد تا زمان ارسال گذرواژه را مشخص کند. به طور پیش‌فرض sshpass به دنبال رشته «assword:» می‌گردد (که با هر دو مورد «Password:» و «password:» تطابق دارد). اگر اعلان کلاینت شما شامل هیچ‌کدام از این‌ها نیست، می‌توانید با این گزینه مقدار پیش‌فرض را لغو کنید.
حالت پرگو (verbose). این دستور اطلاعاتی را به stderr می‌فرستد که برای اشکال‌زدایی در مواردی که اتصال به ظاهراً بدون هیچ دلیل مشخصی متوقف می‌شود، مفید است.

پیش از هر چیز، کاربران sshpass باید آگاه باشند که اصرار ssh بر دریافت تعاملی گذرواژه بی‌دلیل نیست. ذخیره‌سازی امن گذرواژه تقریباً غیرممکن است و کاربران sshpass باید بررسی کنند که آیا احراز اصالت با کلید عمومی ssh همان تجربه کاربری را با دردسر کمتر و امنیت بسیار بیشتر فراهم می‌کند یا خیر.

گزینه -p باید ناامن‌ترین گزینه در بین تمام گزینه‌های sshpass تلقی شود. همه کاربران سیستم می‌توانند با یک دستور ساده «ps» گذرواژه را در خط فرمان مشاهده کنند. Sshpass تلاشی حداقلی برای پنهان کردن گذرواژه انجام می‌دهد، اما چنین تلاش‌هایی بدون حل واقعی مشکل، ناگزیر شرایط رقابتی (race conditions) ایجاد می‌کنند. به کاربران sshpass توصیه می‌شود از روش‌های دیگر انتقال گذرواژه استفاده کنند که همگی امنیت بیشتری دارند.

به‌ویژه به افرادی که برنامه‌هایی برای ارسال گذرواژه به صورت خودکار می‌نویسند، توصیه می‌شود از یک لوله بی‌نام (anonymous pipe) استفاده کنند و سرِ خواندنی لوله را با گزینه -d به sshpass ارسال کنند.

همانند هر برنامه دیگری، sshpass در صورت موفقیت مقدار 0 را برمی‌گرداند. در صورت بروز خطا، کدهای بازگشتی زیر استفاده می‌شوند:

1
آرگومان نامعتبر در خط فرمان
2
آرگومان‌های متناقض ارائه شده است
3
خطای عمومی در زمان اجرا
4
پاسخ ناشناخته از ssh (خطای تجزیه)
5
گذرواژه نامعتبر/نادرست
6
کلید عمومی میزبان ناشناخته است. sshpass بدون تأیید کلید جدید خارج می‌شود.
7
کلید عمومی IP تغییر کرده است. sshpass بدون تأیید کلید جدید خارج می‌شود.

علاوه بر این، ممکن است ssh از حمله مرد میانی (man in the middle) هشدار دهد. این هشدار به tty ارسال نمی‌شود. به عبارت دیگر، حتی با وجود sshpass، پیام خطای ssh روی خطای استاندارد (stderr) چاپ می‌شود. در چنین حالتی کد بازگشتی خود ssh گزارش داده خواهد شد. این مقدار معمولاً برای تمام موارد خطا عدد غیرخلاقانه (و فاقد اطلاعات) «255» است.

اجرای rsync بر بستر SSH با احراز اصالت گذرواژه، به طوری که گذرواژه در خط فرمان ارسال می‌شود:

rsync --rsh='sshpass -p 12345 ssh -l test' host.example.com:path .

برای انجام همان کار از طریق یک اسکریپت bourne shell با روشی که تا حدی کمتر فاش‌کننده است:

SSHPASS=12345 rsync --rsh='sshpass -e ssh -l test' host.example.com:path .

ابزار Sshpass از رابط pty(7) برای کنترل TTY مربوط به ssh استفاده می‌کند. این رابط، حداقل در لینوکس، ایرادی ساختاری دارد که اگر هیچ توصیف‌گر فایل پِیروی (slave) بازی وجود نداشته باشد، pty اصلی (master) خطای EIO برمی‌گرداند. این رفتار عادی است، جز اینکه یک pty پیرو ممکن است در هر لحظه توسط برنامه‌ای که /dev/tty را باز می‌کند متولد شود. این مسئله انتظار قابل اطمینان برای رویدادها را بدون مصرف 100% پردازنده غیرممکن می‌سازد.

در طول نسخه‌های گوناگون رویکردهای متفاوتی برای حل این مشکل آزموده شد. هر نسخه از sshpass با این باور منتشر می‌شود که کار می‌کند، اما تجربه نشان داده است که این سازوکارها گاهی دچار اختلال می‌شوند. این اتفاق در OpenSSH نسخه 5.6 رخ داد. در زمان نگارش این متن، فرض بر این است که sshpass مجدداً به درستی کار می‌کند.

به نظر می‌رسد سیستم‌عامل HPUX ایده‌های غیرمنطبق با Posix درباره چگونگی جدا شدن TTY کنترلی دارد. ممکن است sshpass روی آن پلتفرم به درستی کار نکند.

May 27, 2022 Shachar Shemesh