Saya memiliki file teks di mesin lokal saya yang dihasilkan oleh skrip Python harian yang dijalankan di cron.
Saya ingin menambahkan sedikit kode agar file tersebut dikirim dengan aman ke server saya melalui SSH.
python
ssh
automation
scp
Alok
sumber
sumber
Jawaban:
Anda dapat memanggil
scp
perintah bash (ini menyalin file melalui SSH ) dengansubprocess.run
:Jika Anda membuat file yang ingin Anda kirim dalam program Python yang sama, Anda akan ingin memanggil
subprocess.run
perintah di luarwith
blok yang Anda gunakan untuk membuka file (atau panggil.close()
file terlebih dahulu jika Anda tidak menggunakanwith
block), jadi Anda tahu itu di-flush ke disk dari Python.Anda perlu membuat (pada mesin sumber) dan menginstal (pada mesin tujuan) kunci ssh sebelumnya sehingga scp secara otomatis diautentikasi dengan kunci ssh publik Anda (dengan kata lain, sehingga skrip Anda tidak meminta kata sandi) .
sumber
subprocess.check_call(['scp', srcfile, dest])
dapat digunakan sejak Python 2.5 alih-alihrc = Popen(..).wait(); if rc != 0: raise ..
Untuk melakukan ini dengan Python (yaitu tidak membungkus scp melalui subprocess.Popen atau serupa) dengan pustaka Paramiko , Anda akan melakukan sesuatu seperti ini:
(Anda mungkin ingin berurusan dengan host yang tidak dikenal, kesalahan, membuat direktori yang diperlukan, dan sebagainya).
sumber
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
setelah membuat contohssh
.Anda mungkin akan menggunakan modul subproses . Sesuatu seperti ini:
Dimana
destination
mungkin bentuknyauser@remotehost:remotepath
. Terima kasih kepada @Charles Duffy karena menunjukkan kelemahan dalam jawaban asli saya, yang menggunakan argumen string tunggal untuk menentukan operasi scpshell=True
- yang tidak akan menangani spasi kosong di jalur.Dokumentasi modul memiliki contoh pemeriksaan kesalahan yang mungkin ingin Anda lakukan sehubungan dengan operasi ini.
Pastikan Anda telah menyiapkan kredensial yang tepat sehingga Anda dapat melakukan scp tanpa pengawasan tanpa kata sandi di antara mesin . Sudah ada pertanyaan stackoverflow untuk ini .
sumber
subprocess.check_call(['scp', myfile, destination])
dapat digunakan sebagai gantinya sejak Python 2.5 (2006)Ada beberapa cara berbeda untuk menangani masalah:
Setiap pendekatan memiliki keunikannya sendiri. Anda perlu mengatur kunci SSH untuk mengaktifkan login tanpa kata sandi jika Anda menggabungkan perintah sistem seperti "ssh", "scp" atau "rsync." Anda dapat menyematkan kata sandi dalam skrip menggunakan Paramiko atau pustaka lain, tetapi Anda mungkin merasa kekurangan dokumentasi membuat frustrasi, terutama jika Anda tidak terbiasa dengan dasar-dasar koneksi SSH (misalnya - pertukaran kunci, agen, dll). Mungkin tidak perlu dikatakan bahwa kunci SSH hampir selalu merupakan ide yang lebih baik daripada kata sandi untuk hal semacam ini.
CATATAN: sulit untuk mengalahkan rsync jika Anda berencana mentransfer file melalui SSH, terutama jika alternatifnya adalah scp lama biasa.
Saya telah menggunakan Paramiko dengan tujuan untuk mengganti panggilan sistem tetapi mendapati diri saya ditarik kembali ke perintah yang dibungkus karena kemudahan penggunaan dan keakraban langsungnya. Anda mungkin berbeda. Saya memberikan Conch sekali lagi beberapa waktu lalu tetapi itu tidak menarik bagi saya.
Jika memilih jalur panggilan sistem, Python menawarkan serangkaian opsi seperti os.system atau modul perintah / subproses. Saya akan menggunakan modul subproses jika menggunakan versi 2.4+.
sumber
Mencapai masalah yang sama, tetapi bukannya "meretas" atau meniru baris perintah:
Temukan jawaban ini di sini .
sumber
Anda dapat melakukan sesuatu seperti ini, untuk menangani pemeriksaan kunci host juga
sumber
fabric
dapat digunakan untuk mengunggah file vis ssh:sumber
Anda dapat menggunakan paket pengikut, yang dirancang khusus untuk ini.
Yang Anda butuhkan hanyalah menginstal pengikut dan melakukannya
Selain itu, ini akan menghemat otentikasi kredensial dan tidak perlu mengetiknya lagi dan lagi.
sumber
Saya menggunakan sshfs untuk memasang direktori jarak jauh melalui ssh, dan shutil untuk menyalin file:
Kemudian di python:
Metode ini memiliki keuntungan karena Anda dapat mengalirkan data jika Anda membuat data daripada melakukan caching secara lokal dan mengirim satu file besar.
sumber
Coba ini jika Anda tidak ingin menggunakan sertifikat SSL:
sumber
Menggunakan paramiko sumber daya eksternal;
sumber
Memanggil
scp
perintah melalui subproses tidak memungkinkan untuk menerima laporan kemajuan di dalam skrip.pexpect
dapat digunakan untuk mengekstrak info itu:Lihat file copy python di jaringan lokal (linux -> linux)
sumber
Pendekatan yang sangat sederhana adalah sebagai berikut:
Tidak ada pustaka python yang diperlukan (hanya os), dan ini berfungsi, namun menggunakan metode ini bergantung pada klien ssh lain yang akan diinstal. Ini dapat menyebabkan perilaku yang tidak diinginkan jika dijalankan di sistem lain.
sumber
Agak hacky, tetapi yang berikut harus berfungsi :)
sumber