Saya telah menulis binding Python untuk libssh2. Libssh2 adalah pustaka sisi klien yang menerapkan protokol SSH2.
import socket
import libssh2
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('exmaple.com', 22))
session = libssh2.Session()
session.startup(sock)
session.userauth_password('john', '******')
channel = session.channel()
channel.execute('ls -l')
print channel.read(1024)
Saya belum mencobanya, tetapi modul pysftp ini mungkin membantu, yang pada gilirannya menggunakan paramiko. Saya percaya semuanya adalah sisi klien.
Perintah yang menarik mungkin adalah .execute()
yang mengeksekusi perintah sewenang-wenang pada mesin jarak jauh. (Modul ini juga menampilkan .get()
dan .put
metode yang lebih menyinggung karakter FTP-nya).
PEMBARUAN:
Saya telah menulis ulang jawabannya setelah posting blog yang awalnya saya tautkan tidak tersedia lagi. Beberapa komentar yang mengacu pada versi lama dari jawaban ini sekarang akan terlihat aneh.
Anda dapat mengkodekannya sendiri menggunakan Paramiko, seperti yang disarankan di atas. Sebagai alternatif, Anda dapat melihat Fabric, sebuah aplikasi python untuk melakukan semua hal yang Anda tanyakan:
Fabric adalah pustaka Python dan alat baris perintah yang dirancang untuk merampingkan penerapan aplikasi atau melakukan tugas administrasi sistem melalui protokol SSH. Ini menyediakan alat untuk menjalankan perintah shell sewenang-wenang (baik sebagai pengguna login biasa, atau melalui sudo), mengunggah dan mengunduh file, dan sebagainya.
Saya pikir ini sesuai dengan kebutuhan Anda. Ini juga bukan perpustakaan besar dan tidak memerlukan penginstalan server, meskipun memiliki ketergantungan pada paramiko dan pycrypt yang memerlukan penginstalan pada klien.
Aplikasi ini dulu ada di sini. Sekarang dapat ditemukan di sini.
* The official, canonical repository is git.fabfile.org
* The official Github mirror is GitHub/bitprophet/fabric
Ada beberapa artikel bagus tentangnya, namun Anda harus berhati-hati karena telah berubah dalam enam bulan terakhir:
Menerapkan Django dengan Fabric
Alat Peretas Python Modern:Virtualenv, Fabric, dan Pip
Penerapan Sederhana &Mudah dengan Fabric dan Virtualenv
Nanti:Fabric tidak lagi memerlukan paramiko untuk menginstal:
$ pip install fabric
Downloading/unpacking fabric
Downloading Fabric-1.4.2.tar.gz (182Kb): 182Kb downloaded
Running setup.py egg_info for package fabric
warning: no previously-included files matching '*' found under directory 'docs/_build'
warning: no files found matching 'fabfile.py'
Downloading/unpacking ssh>=1.7.14 (from fabric)
Downloading ssh-1.7.14.tar.gz (794Kb): 794Kb downloaded
Running setup.py egg_info for package ssh
Downloading/unpacking pycrypto>=2.1,!=2.4 (from ssh>=1.7.14->fabric)
Downloading pycrypto-2.6.tar.gz (443Kb): 443Kb downloaded
Running setup.py egg_info for package pycrypto
Installing collected packages: fabric, ssh, pycrypto
Running setup.py install for fabric
warning: no previously-included files matching '*' found under directory 'docs/_build'
warning: no files found matching 'fabfile.py'
Installing fab script to /home/hbrown/.virtualenvs/fabric-test/bin
Running setup.py install for ssh
Running setup.py install for pycrypto
...
Successfully installed fabric ssh pycrypto
Cleaning up...
Ini sebagian besar kosmetik, namun:ssh adalah fork dari paramiko, pengelola untuk kedua perpustakaan adalah sama (Jeff Forcier, juga penulis Fabric), dan pengelola memiliki rencana untuk menyatukan kembali paramiko dan ssh dengan nama paramiko. (Koreksi ini melalui pbanka.)
Jika Anda ingin menghindari modul tambahan apa pun, Anda dapat menggunakan modul subproses untuk menjalankan
ssh [host] [command]
dan menangkap output.
Cobalah sesuatu seperti:
process = subprocess.Popen("ssh example.com ls", shell=True,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output,stderr = process.communicate()
status = process.poll()
print output
Untuk menangani nama pengguna dan kata sandi, Anda dapat menggunakan subproses untuk berinteraksi dengan proses ssh, atau Anda dapat memasang kunci publik di server untuk menghindari permintaan kata sandi.