لدي برنامج نصي يحتوي على عدة خوادم SSH تستخدم مصادقة المفتاح العام. توقف أحد الخوادم عن السماح للبرنامج النصي بتسجيل الدخول بسبب مشكلة في التكوين ، مما يعني أن البرنامج النصي عالق مع موجه "كلمة المرور:" ، والذي من الواضح أنه لا يمكنه الإجابة عليه ، لذلك فهو لا يجرب حتى بقية الخوادم في القائمة.

هل هناك طريقة لإخبار عميل ssh بعدم المطالبة بكلمة مرور إذا فشلت مصادقة المفتاح ، ولكن بدلاً من ذلك ، أبلغ عن خطأ في الاتصال والسماح للبرنامج النصي الخاص بي بالاستمرار؟

answer

بالنسبة إلى OpenSSH ، يوجد BatchMode ، والذي بالإضافة إلى تعطيل مطالبة كلمة المرور ، يجب تعطيل الاستعلام عن عبارة (عبارات) المرور للمفاتيح.

BatchMode

If set to “yes”, passphrase/password querying will be disabled. This option is useful in scripts and other batch jobs where no user is present to supply the password. The argument must be “yes” or “no”. The default is “no”.

استخدام العينة:

ssh -oBatchMode=yes -l <user> <host> <dostuff>
  • لتعطيل مصادقة كلمة المرور لمحاولة اتصال ssh الحالية ، قم بتمرير هذا الخيار في سطر الأوامر:

    -o PasswordAuthentication=no
    
  • لتعطيل مصادقة كلمة المرور لجميع الاتصالات المستقبلية بأي مضيف ، أضف ما يلي إلى ~/.ssh/config:

    PasswordAuthentication no
    
  • لتعطيله لبعض المضيفين فقط ، أضف ما يلي إلى ~ / .ssh / config:

    Host host1 host2 host3...
        PasswordAuthentication no
    

تنطبق الخيارات أعلاه على اتصالات ssh الخارجة ، أي حيث تحاول الاتصال بخادم ssh بعيد.

لتعطيل مصادقة كلمة المرور على خادم ssh (أي ينطبق على جميع اتصالات ssh الواردة ) ، أضف PasswordAuthentication noإلى /etc/ssh/sshd_configوأعد التشغيل sshd.

إذا كنت تستخدم Dropbear ، فقط أضف -sخيار " " لتعطيل مصادقة كلمة المرور.

في سطر الأوامر (أو ~/.ssh/config) يمكنك تعيين PreferredAuthentications.

PreferredAuthentications=publickey

إليك عينة من مقتطف نص sftp bash. أنا أستخدم "-o BatchMode = Yes" لتعطيل مطالبة كلمة المرور في حالة الفشل. وتحقق من كود إرجاع frp للتحقق مما إذا كان اتصال ftp قد فشل.

sftp -o "IdentityFile=<YOUR_IDENTTIY_FILE>"  -o "BatchMode=Yes" [email protected] <<EOF

cd /$remotepath
mget *.csv $localpath/download

quit
EOF
exit_code=$?
if [[ $exit_code != 0 ]]; then
   echo "sftp error, failed to connect to ftp server" >&2
   exit 1
fi