Paramiko - كيفية SSH ونقل الملفات مع بيثون

لذا ، فأنا أعمل في شركة من نوع وسائل التواصل الاجتماعي مع منتج يعمل كثيرًا مثل facebook ، وكان على الأسبوع الماضي حل مشكلة مع فقدان الارتباط بين عناوين url للفيديو على ديسيبل لدينا مع المحتوى الفعلي على الخادم. بعض عدم تطابق مع Kaltura. لكن على أي حال ، قصة قصيرة طويلة ، اضطررت إلى كتابة نص برمجي صغير من شأنه تنزيل مقاطع الفيديو من خادم بعيد للتحميل إلى Kaltura والحصول على عناوين url جديدة لتحل محل القديمة القديمة في ديسيبل.

SSH هي الطريقة المستخدمة عادةً للوصول إلى جهاز بعيد وتشغيل الأوامر أو استرداد الملفات أو تحميل الملفات.

يمكنك نقل الملفات من الجهاز البعيد إلى المحلي أو العكس باستخدام SFTP (بروتوكول نقل الملفات الآمنة) و SCP (بروتوكول النسخ الآمن).

وفقًا لموقع paramiko.org ، يوفر نموذج python paramiko مجموعة من بروتوكول SSHv2 مع كل من جانب العميل ووظيفة جانب الخادم. كعميل ، يمكنك مصادقة نفسك باستخدام كلمة مرور أو مفتاح وكخادم يمكنك تحديد المستخدمين المسموح لهم بالوصول والقنوات التي تسمح بها

في هذه المدونة ، أركز على جانب العميل.

هيا بنا

العميل الرئيسي لباراميكو كما هو موثق في API ، هو Paramiko.SSHClient. يمكن استخدام مثيل Paramiko.SSHClient لإجراء اتصالات بالخادم البعيد ونقل الملفات

صنع اتصال

استيراد paramiko
ssh_client = paramiko.SSHClient ()
ssh_client.connect (المضيف = 'المضيف'، اسم المستخدم = 'mokgadi "، كلمة المرور =' mypassword ')
# يثير BadHostKeyException ، AuthenticationException ، SSHException ، خطأ مأخذ التوصيل

عندما تحاول ذلك ، تحصل على الخطأ التالي:
missing_host_key قم برفع SSHException (لم يتم العثور على "الخادم٪ r في اسم مضيف٪ معروف") paramiko.ssh_exception.SSHException: لم يتم العثور على اسم مضيف الخادم في known_hosts

فهم المضيفين المعروفين

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

لا يمكن إثبات صحة "مضيف" المضيف. بصمة مفتاح RSA هي "مفتاح". هل أنت متأكد من أنك تريد متابعة الاتصال (نعم / لا)؟

عند تحديد نعم هنا ، فأبلغ جهازك أن بإمكانه الوثوق بالجهاز ويمكنك الآن الوصول إليه دون المطالبة حتى يتغير مفتاح هذا الجهاز.
يتطلب Paramiko بالمثل أن تتحقق من ثقتك بالجهاز. تتم معالجة عملية التحقق من الصحة هذه عن طريق استدعاء set_missing_host_key_policy () على SSHClient ، وهو تمرير السياسة التي تريد تنفيذها عند الوصول إلى جهاز بعيد جديد. بشكل افتراضي ، يقوم paramiko.SSHclient بتعيين السياسة على RejectPolicy. السياسة ترفض الاتصال دون التحقق من الصحة كما رأينا أعلاه. ومع ذلك ، تمنحك Paramiko طريقة لاتباع سياسة "Trust all" ، AutoAddPolicy. تحليل مثيل AutoAddPolicy إلى set_missing_host_key_policy () يغيره للسماح لأي مضيف.

استيراد paramiko
ssh_client = paramiko.SSHClient ()
ssh_client.set_missing_host_key_policy (paramiko.AutoAddPolicy ())
ssh_client.connect (المضيف = 'المضيف'، اسم المستخدم = 'mokgadi "، كلمة المرور =' mypassword ')

يجب أن تكون الآن في الأخضر

أوامر التشغيل على الجهاز البعيد
لتشغيل أمر يسمى exec_command على SSHClient مع تمرير الأمر. يتم إرجاع الاستجابة كـ tuple (stdin، stdout، stderr)
على سبيل المثال لسرد جميع الملفات في الدليل:

ستدين، المعياري، ستدير = ssh_client.exec_command ( "ليرة سورية")

الحصول على نوع لكل من عاد ،
النوع (stdin) والنوع (stdout) هو "paramiko.channel.ChannelFile"
النوع (stderr) هو الفئة "paramiko.channel.ChannelStderrFile"

وفقا ل paramiko.org انهم جميعا ملف الثعبان مثل الكائنات.

stdin هو ملف للكتابة فقط والذي يمكن استخدامه للأوامر التي تتطلب الإدخال
يعطي ملف stdout مخرجات الأمر
يعطي stderr الأخطاء التي تم إرجاعها عند تنفيذ الأمر. سوف تكون فارغة إذا لم يكن هناك خطأ

للأمر أعلاه
>>> طباعة (stdout.readlines ()) → [u'anaconda-ks.cfg \ n '، u'database_backup \ n'، u'Desktop \ n '، u'Documents \ n'، u'Downloads \ n "، ... u’Public \ n '، u’Memplates \ n'، u’Videos \ n ']

>>> طباعة (stderr.readlines) → []

الأوامر التي تتطلب الإدخال
في بعض الأحيان تحتاج إلى تقديم كلمة مرور أو إدخال إضافي لتشغيل أمر. هذا هو ما يستخدم ل stdin. لنقم بتشغيل نفس الأمر أعلاه مع sudo.

stdin ، stdout ، stderr = ssh.exec_command ("sudo ls")
stdin.write ( 'mypassword \ ن')
طباعة stdout.readlines ()

يجب أن تعيد قائمة الملفات والمجلدات على النحو الوارد أعلاه.

نقل الملفات
تتم معالجة عمليات نقل الملفات بواسطة paramiko.SFTPClient التي تحصل عليها من استدعاء open_sftp () على مثيل Paramiko.SSHClient.

تنزيل ملف من الجهاز البعيد

ftp_client = ssh_client.open_sftp ()
ftp_client.get ( 'remotefileth'، 'localfilepath')
ftp_client.close ()

تحميل الملف من الجهاز المحلي إلى الجهاز البعيد

ftp_client = ssh.open_sftp ()
ftp_client.put ( 'localfilepath، remotefilepath')
ftp_client.close ()

إعطائها الذهاب وتصحيح لي حيث يجب :). يرجى متابعة أو الاشتراك في مدونتي للحصول على إخطار في أي وظائف جديدة