■ space · السلك، مُعاد تمثيله · fig 1
Permission denied (publickey) = كل مفتاح عرضه العميل قد رُفض — حُكمُ تفاوضٍ، لا خطأ مطبعيّ في كلمة السر.
التشخيص: ssh -vvv يُظهر أي المفاتيح عُرضت؛ journalctl -u ssh يُظهر لماذا رُفضت.
بعدها فهو واحد من أربعة أسباب: مستخدم خاطئ، مفتاح غير موجود في authorized_keys، صلاحيات متفتحة أكثر من اللازم، أو ssh-rsa مرفوض من OpenSSH 8.8+. ssh-copy-id يمنع معظم تكرار الحالة.
01السلك
العميل يقترح · الخادم يرفض · ثلاثة أسطر تحدد في أي جهة تسكن مشكلتك
$ ssh -vvv deploy@staging 2>&1 | grep -iE "offering|identity|denied|authentications"
debug1: Offering public key: /home/deploy/.ssh/id_rsa RSA SHA256:9T4xQmV…
02:10:03 — مرفوض. النشر مات على SSH-RSA02:14:41 — العميل نفسه، وُقِّل على ed25519
عُرض id_rsa → ورُفض · عُرض id_ed25519 → وُقِّل · السجل 1R · 1A
السير هو قائمة العروض — كل خَتم يأخذه الحلقة، ssh -vvv يُطبع سطرًا
02الشاهد
الحلقة تحفظ الحصيلة — الخادم حفظ حصيلته أولًا: journalctl قد سجَّل كل حكم
Oct 18 02:10:03 staging sshd[4421]: Failed publickey for deploy from 203.0.113.7 port 51422 ssh2: RSA SHA256:9T4xQmV…
Oct 18 02:14:41 staging sshd[4421]: Accepted publickey for deploy from 203.0.113.7 port 51422 ssh2: ED25519 SHA256:KP7wLn…
سطران، قوس واحد: عرض RSA رُفض في 02:10 — موت النشر — ثم العميل نفسه، بعد أربع دقائق، وُقِّل على ed25519
journalctl -u ssh -n 50 --no-pager | grep -iE "publickey|denied|accepted"
تحقّق: journalctl -u ssh -n 50 | grep Accepted → سطر فيه بصمتك ومستخدمك
03جدول الأسباب
السجل يسمّي الحكم، لا السبب أبدًا — ستة أشكال تُنتج رفضًا واحدًا
| السبب | المؤشر الفاضح | العلاج |
|---|---|---|
| المفتاح الصحيح موجود، ويصل غيره | -vvv يعرض هوية لا تعرفها | ssh-add -l للسرد، ssh-add -d لإسقاط المتقادم |
-i mykey مُتجاهَل | IdentityFile في الإعدادات يتجاوز ترتيب العروض | أصلِح أو احذف كتلة ~/.ssh/config |
| المفتاح غير مثبَّت | سجل الخادم يُظهر Failed publickey مع كل عرض — authorized_keys: فارغ، 0 مفاتيح | ssh-copy-id user@host |
| مستخدم خاطئ | المفتاح يعمل مع root@host، ويفشل مع deploy@host | المفتاح يجب أن يكون في ~/.ssh/authorized_keys |
| الصلاحيات متفتحة أكثر من اللازم | WARNING: UNPROTECTED PRIVATE KEY FILE — المفتاح يُتخطى، لا يُعرض أبدًا | chmod 700 ~/.ssh; chmod 600 ~/.ssh/* |
| مفتاح ssh-rsa قديم | الخادم يركّض OpenSSH 8.8+؛ مفتاح RSA القديم لا يُقبل أبدًا | أعِد توليده كـed25519، أو رقِّ المفتاح |
كل سطر يعاد تمثيله على السلك — اضغط مفتاحه على السير وشاهد المفاوضات تختار ذلك السبب
ssh -o BatchMode=yes … 'echo ok' — لا سؤال تفاعلي، ولا أمل، فقط ok.04بوابة الصلاحيات
كل سببٍ في الجدول وصل إلى الخادم — هذا يموت في جهة العميل من السلك
drwx------ · 755 مفتوح أكثر من اللازم-rw------- · 644 و 664 مفتوحة أكثر من اللازمchmod 700 ~/.ssh
chmod 600 ~/.ssh/*
تحقّق: ls -ld ~/.ssh → drwx------ · ls -l ~/.ssh/id_ed25519 → -rw-------
05اللسان المتقاعد
رفض واحد يحمل تاريخًا — 8.8، أصدر في 2021-10-01، توقف عن كلام ssh-rsa
«مخطط تواقيع ssh-rsa ... معطَّل افتراضيًا» — ملاحظات إصدار OpenSSH 8.8، 2021-10-01.
مفتاح RSA وُلِّد في 2018 ليس مكسورًا — صيغة توقيعه فقط لم تعد تُتحدَّث
ssh-keygen -t ed25519 — مفتاح جديد بلسان ما يزال كل الخوادم يتحدثونهrsa-sha2-256 لا يحتاج إعادة توليد — التوقيع يُرقَّى في مكانهssh-copy-id يضيف المفتاح ويضبط صلاحيات معقولة — موجود لأن اللصق اليدوي يتعثر في الأسطر الناقصةssh-keygen -t ed25519
ssh-copy-id deploy@staging
$ ssh -o BatchMode=yes deploy@staging 'echo ok'
ok
تحقّق: ssh -o BatchMode=yes deploy@staging 'echo ok' → ok، بلا سؤال تفاعلي
نهاية السلك · لم يُجلب شيء بـfetch · كل شيء محلي