SCP Permission Denied: لماذا يحدث وكيفية الإصلاح

SCP هي أداة مفتوحة لنقل الملفات عبر SSH، يمكنك استخدامها على Linux وأنظمة التشغيل المدعومة الأخرى لنقل الملفات عبر SSH. يمكن استخدامها لنقل الملفات بين مضيفين باستخدام اتصال SSH.

يمكن أن يحدث خطأ “permission denied” في SCP لعدة أسباب، مثل المسارات المحددة بشكل غير صحيح أو خطأ في إذن الكتابة. سنستكشف بعض الأسباب التي تؤدي إلى هذا الخطأ وكيفية حله.

السبب: عدم وجود أذونات الكتابة

أحد أسباب حدوث هذا الخطأ هو أن المستخدم الخاص بك لا يملك أذونات الكتابة للدليل المحدد على المضيف الذي تحاول كتابة الملفات فيه. للتحقق من هذه الأذونات، يمكنك استخدام الأمر ‘ls -l’، والذي سيعرض أذونات الكتابة.

ابحث عن الحرف ‘w’ ضمن الأحرف الأربعة الأولى في العمود الأول من الإخراج. إذا رأيته، فهذا يعني أن المستخدم الخاص بك لديه إذن الكتابة لذلك الدليل. بدلاً من ذلك، يمكنك دائمًا إنشاء ملف باستخدام أمر touch في ذلك الدليل. إذا لم تتلق أي أخطاء، مثل ‘permission denied’، فهذا يعني أن المستخدم الخاص بك لديه أذونات الكتابة.

مثال:

لنفترض أنك تريد نسخ ملف إلى مضيف بعيد باستخدام SCP، وتتلقى خطأ “permission denied” بسبب أذونات الكتابة.

scp abcd.txt user@127.0.0.1:/home/abcduser/abcd.txt

الحل 1: استخدام حساب root لنقل الملفات

لإصلاح مثل هذا الخطأ، تحتاج إلى منح أذونات الكتابة للمستخدم الخاص بك لذلك الدليل. لذلك، تحتاج إلى امتيازات root أو sudo. شيء آخر يمكنك فعله هو نسخ الملف إلى دليل يمتلك فيه المستخدم الخاص بك أذونات الكتابة.

في مثل هذا السيناريو، إما أن تحتاج إلى السماح للمستخدم الحالي بأذونات الكتابة على /home/abcduser أو يمكنك استخدام حساب المستخدم root لنسخ هذا الملف.

للسماح لـ مستخدم root بنسخ ملف باستخدام scp، تحتاج إلى السماح بتسجيل الدخول كـ root عبر ssh وهو أمر غير موصى به لأسباب أمنية، ولكن يمكنك استخدامه على أي حال في مثل هذه السيناريوهات وتعطيله بعد ذلك.

للقيام بذلك، افتح ملف إعدادات openssh في /etc/ssh/sshd_config وأزل التعليق عن PermitRootLogin في محرر نصوص على المضيف البعيد.

بعد ذلك، اتصل بالمضيف البعيد باستخدام حساب root الخاص به.

ثم قم بتشغيل الأمر كالتالي:

scp abcd.txt root@127.0.0.1:/abcduser/abcd.txt

أو ببساطة هذا سيفي بالغرض

scp abcd.txt 127.0.0.1:/abcduser/abcd.txt

حيث أنهما متطابقان.

الحل 2: إضافة المستخدم الخاص بك إلى مجموعة أذونات الكتابة:

لكي يتمكن المستخدم من الكتابة في دليل/ملف في Linux، تحتاج إما إلى إضافة المستخدم إلى المجموعة التي تملك الدليل أو الملف، أو جعل الملف مملوكًا لذلك المستخدم.

في مثالنا، نقوم بتشغيل ls -l على الدليل /home/ على النظام البعيد لمعرفة أي مجموعة تملك /home/abcd.

سيمنحك الأمر `ls -l` مخرجًا، حيث يكون محتوى العمود الرابع هو المجموعة التي تملك الدليل/الملف المقابل.

في مثالنا، مجموعة `abcduser` هي التي تملك الدليل `/home/abcduser`، ومن ثم يمكننا

ببساطة قم بتشغيل هذا الأمر على النظام البعيد.

sudo groupadd user abcd

إنها المجموعة ‘abcd’ التي نريد أن يكون مستخدمنا جزءًا منها، والمستخدم الذي نريد تغيير مجموعته هو ‘user’.

أعد تشغيل الأمر `ls -l` مرة أخرى، وإذا رأيت حرف ‘w’ في المكان السادس من المخرج في العمود الأول، فهذا يعني أن المجموعة لديها أذونات الكتابة على هذا الدليل.

ثم أعد تشغيل الأمر مرة أخرى، والذي سيكون في حالتنا:

scp abcd.txt user@somepc:/home/abcduser/abcd.txt

الحل 3: استخدم المستخدم الذي يملك هذا الدليل لنسخ الملف

أبسط الحلول على الإطلاق هو استخدام المستخدم الذي يملك هذا الدليل لنسخ الملف إليه.

ببساطة قم بتشغيل `ls -l` على الدليل. في حالتنا سيكون:

ls -l /home/

سيكون مخرج العمود الثالث هو المستخدم الذي يملك هذا الدليل المقابل لاسم الدليل الذي تهتم به. في حالتنا، `abcduser` يملك الدليل `/home/abcduser` كما هو موضح في لقطة الشاشة أعلاه.

ثم استخدم هذا الحساب المحدد أثناء نسخ الملف باستخدام `scp` إلى المضيف البعيد.
في حالتنا، نقوم بتشغيل الأمر كالتالي:

scp abcd.txt abcduser@127.0.0.1:/home/abcduser/abcd.txt

السبب 2: عدم وجود مفتاح خاص لذلك المستخدم على المضيف البعيد

قد تتلقى خطأ يفيد بـ “scp permission denied” (مفتاح عام) عند محاولة نقل الملفات بين المضيفين.

هذه مشكلة مصادقة لـ `ssh` والسبب في ذلك هو أنك لم تقم بإضافة مفتاح خاص إلى `scp` أثناء تشغيله.

مثال:

scp somefile user@127.0.0.1:/home/user/somefile.txt

الحل:

الحل البسيط لذلك هو تشغيل أمر `scp` مع العلامة `-i`، وبالتالي إضافة المفتاح الخاص لذلك المستخدم الذي تريد الاتصال به بالمضيف البعيد ونقل الملفات.

تحتاج إلى التأكد من أن لديك المفتاح الخاص لذلك المستخدم، وإذا لم يكن لديك، فأنت بحاجة إلى إنشائه على الجهاز البعيد، ثم جعل أداة `scp` تستخدمه باستخدام العلامة `-i`.

في حالتنا، سيكون الحل:

scp -i key.pem somefile user@127.0.0.1:/home/user/somefile.txt

حيث `key.pem` هو ملف المفتاح الخاص للمستخدم ‘user’.

ملاحظة: لقد استخدمنا `127.0.0.1` كمضيف بعيد للمثال فقط، في حالتك من المرجح أن يكون المضيف البعيد جهازًا بعيدًا وليس جهازك المحلي.

 

Comments are closed.