[python] كيفية scp في بيثون؟


Answers

قد تكون مهتمًا بمحاولة Pexpect ( مشروع SourceForge ). يتيح لك ذلك التعامل مع المطالبات التفاعلية لكلمة المرور الخاصة بك.

إليك مثال عن استخدام المثال (لـ ftp) من موقع الويب الرئيسي:

   # This connects to the openbsd ftp site and
   # downloads the recursive directory listing.
   import pexpect
   child = pexpect.spawn ('ftp ftp.openbsd.org')
   child.expect ('Name .*: ')
   child.sendline ('anonymous')
   child.expect ('Password:')
   child.sendline ('noah@example.com')
   child.expect ('ftp> ')
   child.sendline ('cd pub')
   child.expect('ftp> ')
   child.sendline ('get ls-lR.gz')
   child.expect('ftp> ')
   child.sendline ('bye')
Question

ما هي الطريقة الأكثر استخدامًا لتلقي ملف في Python؟ الطريق الوحيد الذي أعرفه هو

os.system('scp "%s" "%s:%s"' % (localfile, remotehost, remotefile) )

وهو عبارة عن اختراق ، ولا يعمل خارج الأنظمة التي تشبه لينكس ، والتي تحتاج إلى مساعدة من وحدة Pexpect لتجنب مطالبات كلمة المرور ما لم يكن لديك بالفعل إعداد SSH بدون كلمة مرور إلى المضيف البعيد.

أنا على علم بمحار Twisted ، لكنني أفضل تجنب تنفيذ scp نفسي عبر وحدات ssh منخفضة المستوى.

أنا على paramiko من paramiko ، وهي وحدة بايثون تدعم ssh و sftp؛ لكنها لا تدعم scp.

الخلفية: أقوم بالاتصال بجهاز توجيه لا يدعم sftp ولكنه يدعم ssh / scp ، لذا لا يعد sftp خيارًا.

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

import scp

client = scp.Client(host=host, user=user, keyfile=keyfile)
# or
client = scp.Client(host=host, user=user)
client.use_system_keys()
# or
client = scp.Client(host=host, user=user, password=password)

# and then
client.transfer('/etc/local/filename', '/etc/remote/filename')



لقد مرّ وقت طويل منذ طرح هذا السؤال ، وفي الوقت نفسه ، فقد ظهرت مكتبة أخرى يمكنها التعامل مع هذا الأمر: يمكنك استخدام وظيفة copy المضمنة في مكتبة Plumbum :

import plumbum
r = plumbum.machines.RemoteMachine("example.net",
 user="username", keyfile=".ssh/some_key")
fro = plumbum.local.path("some_file")
to = r.path("/path/to/destination/")
plumbum.path.utils.copy(fro, to)






يمكنك استخدام subprocess الحزمة ومكالمة الأمر لاستخدام الأمر scp من shell.

from subprocess import call

cmd = "scp user1@host1:files user2@host2:files"
call(cmd.split(" "))






إذا قمت بتثبيت المعجون على win32 تحصل على pscp (المعجون SCP).

حتى تتمكن من استخدام الاختراق os.system على win32 أيضا.

(ويمكنك استخدام عامل المعجون للإدارة الرئيسية)

آسف أنه مجرد اختراق (ولكن يمكنك لفه في فئة بيثون)




Links



Tags

python python   ssh   scp