Soru Python kullanarak SSH'ye giden en kolay yol hangisidir?


Yerel bir Python (3.0) komut dosyasından uzak bir sunucuya SSH'yi nasıl kolayca gönderebilirim, bir giriş / şifre girebilir, bir komut yürütebilir ve çıktıyı Python konsoluna yazdırabilir miyim?

Büyük bir dış kütüphane kullanmamayı veya uzak sunucuda herhangi bir şey yüklememeyi tercih ederim.


76
2017-08-05 14:34


Menşei




Cevaplar:


Denemedim ama bu pysftp modül, paramiko kullandığı yardımcı olabilir. Her şeyin müşteri tarafında olduğuna inanıyorum.

İlginç komut muhtemelen .execute() uzak makinede keyfi bir komut yürütür. (Ayrıca modül özellikleri .get() ve .put FTP karakterine daha fazla dikkat çeken yöntemler.

GÜNCELLEŞTİRME:

Orijinal olarak bağlandığım blog yayınından sonra yanıtı tekrar yazdım. Bu cevabın eski versiyonuna atıfta bulunan yorumlardan bazıları artık tuhaf görünecek.


38
2017-08-05 14:49



İyi bul! Hata yanıtlarını özelleştirmeye önem vermediğiniz sürece, bu ek soyutlama çok yararlı olacaktır. - Cascabel
Ssh modülü hile yaptı. Basit ve iyi çalışıyor. Paramiko API'sı üzerinden arama yok. - Christopher Tokar
Verdiğiniz bağlantı içindeki ssh.py dosyasına bağlantı bozuk: / - dgorissen
Evet, lütfen yeni bir bağlantımız olabilir mi? Github'da ssh.py'yi buldum ama aynı değil (iyi değil) - jdborg
Pysftp paketi sadece SFTP sağlar. SSH müşterisinden uzak. - bortzmeyer


Yukarıda önerildiği gibi, Paramiko kullanarak kendinizi kodlayabilirsiniz. Alternatif olarak, istediğiniz her şeyi yapmak için bir python uygulaması olan Kumaş'a bakabilirsiniz:

Kumaş bir Python kütüphanesidir ve   için tasarlanmış komut satırı aracı   uygulamaları dağıtma veya   sistem yönetimi görevlerini gerçekleştirme   SSH protokolü ile. Sağlar   keyfi kabuğu çalıştırmak için araçlar   komutlar (normal giriş olarak   kullanıcı veya sudo ile), yükleme ve   dosya indirme, vb.

Bence bu sizin ihtiyaçlarınıza uygun. Ayrıca büyük bir kütüphane değildir ve istemci üzerinde kurulum gerektiren paramiko ve pycrypt bağımlılıkları olmasına rağmen sunucu kurulumu gerektirmez.

Uygulama eskiden İşte. Şimdi bulunabilir İşte.

* The official, canonical repository is git.fabfile.org
* The official Github mirror is GitHub/bitprophet/fabric

Üzerinde birkaç iyi makale var, ancak dikkatli olmalısınız, çünkü son altı ayda değişti:

Django'yu Kumaşla Dağıtmak

Modern Python Hacker Araçları: Virtualenv, Kumaş ve Pip

Kumaş ve Virtualenv ile Basit ve Kolay Dağıtım


Daha sonra: Kumaş artık takmak için paramiko gerektirmiyor:

$ 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...

Bu çoğunlukla kozmetiktir, ancak: ssh paramiko'nun bir çatalıdır, her iki kütüphanenin bakıcısı da aynıdır (Jeff Forcier, aynı zamanda Kumaş yazarı) ve bakıcının paramiko ve ssh paramiko adı altında yeniden birleştirme planları var. (Bu düzeltme yoluyla pbanka.)


60
2017-08-05 15:00



Bu ilginç bir bağlantı gibi göründüğü için, sizinkini güncelledikçe güncellemek istiyorum. lütfen kullan: clemesha.org/blog/... - dlewin
Teşekkürler. 404 bağlantısı düzeltildi. - hughdbrown
Asker, "büyük bir dış kütüphane" kullanmak istemediğini belirtmedi mi? Paramiko ve Kumaş, tüm yazar gerçekten istediği zaman tek bir basit ssh tarifi olduğunda hem aşırı. - Zoran Pavlovic
@Zoran Pavlovic: Tüm cevaplar ya yerel bir paket kurmak (paramiko, kumaş, ssh, libssh2) ya da ssh çalıştırmak için alt-süreç kullanmaktı. İkincisi, takılmamış bir çözümdür, ancak ssh yumurtlamanın harika bir fikir olduğunu düşünmüyorum ve Ssh modülünü kurmak için cevabı seçtiği için OP'yi de yapmadı. Bu dokümanlar şöyle diyor: "ssh.py üç ortak SSH operasyonu sağlar, elde eder, koyar ve uygular. Paramiko üzerine üst düzey bir soyutlamadır." Yani kodlamada ağır olan libssh2'yi tercih etmediğiniz sürece, uygun bir tavsiye yoktur. OP'nin koşulları makul bir şekilde yerine getirilemediğinde iyi bir çözüm sunmayı tercih ediyorum. - hughdbrown


Ekstra modüllerden kaçınmak istiyorsanız, çalıştırmak için alt işlem modülünü kullanabilirsiniz.

ssh [host] [command]

ve çıkışı yakalayın.

Şunun gibi bir şey deneyin:

process = subprocess.Popen("ssh example.com ls", shell=True,
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output,stderr = process.communicate()
status = process.poll()
print output

Kullanıcı adları ve parolalarla başa çıkmak için, ssh işlemiyle etkileşimde bulunmak üzere alt işlemlerden yararlanabilir veya parola isteminden kaçınmak için sunucuya ortak bir anahtar da kurabilirsiniz.


22
2017-08-05 15:05



Peki ya istemci Windows'daysa? - Nathan
İçin bir parola tedarik etmek zor olabilir sshbir boru yoluyla alt süreç. Görmek Neden sadece boru kullanmıyorsunuz (popen ())?. İhtiyacın olabilir pty, pexpect geçici çözüm için modüller. - jfs
string 'ssh bazı bilgisayar için çalışmıyor gibi görünüyor; python -c "import numpy; print numpy .__ version__" 'komutu "import" komutunu bilmiyor. - usethedeathstar
@usethedeathstar: tüm uzak komutu tırnak içine alın: ssh somecomputer 'python -c' bunu içe aktar; bunu yazdır '' - Neil


Ben yazdım Libssh2 için Python bağlamaları. Libssh2, SSH2 protokolünü uygulayan bir istemci tarafı kütüphanesidir.

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)

16
2018-02-28 12:51



Çok düşük seviyeli görünüyor. Örneğin (kendi örneğiniz), IPv4 veya IPv6 (OpenSSH komut satırı istemcisiyle ilgisi olmayan bir şey) kullandığınızı açıkça belirtmeniz gerekir. Ayrıca, ssh-agent ile nasıl çalışacağını bulamadım. - bortzmeyer
Pylibssh2 ile ilgili iyi bir şey, dosyaları Wsh'in pshhon'un herhangi bir python uygulamasından daha hızlı bir şekilde aktarılmasıdır. - Damien


"En basit" tanımınız burada önemlidir - basit kod bir modül kullanmak anlamına gelir ("büyük harici kütüphane" abartı olsa da).

En güncel (aktif olarak geliştirilen) modülün olduğuna inanıyorum paramiko. Bu indirme içinde demo betikleri ile gelir ve detaylı çevrimiçi API belgelerine sahiptir. Sen de deneyebilirsin PxSSHiçinde bulunan pexpect. İlk bağlantıdaki belgelerle birlikte kısa bir örnek var.

Yine basitlikle ilgili olarak, iyi bir hata saptamanın her zaman kodunuzun daha karmaşık görünmesini sağlayacağını, ancak örnek kodlardan çok fazla kodu yeniden kullanabileceğinizi ve sonra unuttuğunuzu unutmayın.


8
2017-08-05 14:44





Hughdbrown gibi, Kumaş'ı severim. Lütfen kendi bildirimsel betiklerini uygularken (dağıtım yapmak için) ve ayrıca bir Python modülü olarak içe aktarılabildiğini ve bir Kumaş senaryosu yazmak zorunda kalmadan programlarınızda kullanılabileceğini unutmayın.

Kumaşın yeni bir bakıcısı var ve yeniden yazılma sürecinde; Bu, şu anda web'de bulacağınız çoğu öğreticinin geçerli sürümle çalışmadığı anlamına gelir. Ayrıca, Google hala eski Kumaş sayfasını ilk sonuç olarak gösterir.

Güncel belgeler için şunları kontrol edebilirsiniz: http://docs.fabfile.org


6
2017-08-06 10:08



Kumaş paramiko çatalı kullanır pypi.python.org/pypi/ssh tüm ssh şeyler için. - Damien


Paramiko'yu biraz fazla düşük seviyeli buldum ve Kumaş bir kütüphane olarak kullanılmaya çok elverişli değildi, bu yüzden kendi kütüphanemle bir araya getirdim. mahmuz Bu biraz daha güzel bir arayüz uygulamak için paramiko kullanır:

import spur

shell = spur.SshShell(hostname="localhost", username="bob", password="password1")
result = shell.run(["echo", "-n", "hello"])
print result.output # prints hello

Ayrıca, programın çıktısını çalıştığı sırada yazdırmayı da seçebilirsiniz; bu, çıkmadan önce uzun süren komutların çıktısını görmek istiyorsanız kullanışlıdır:

result = shell.run(["echo", "-n", "hello"], stdout=sys.stdout)

6
2018-01-10 21:47



Standart olmayan komutların çalıştırılmasını desteklemez, örneğin bazı yönlendiricilerde (MikroTik) komutlar öneki '/' ile, bu kütüphane bir hata atar. Standart linux ana bilgisayarlar için, ancak oldukça iyi görünüyor. - Babken Vardanyan
Bir IP adresini hostname'ye ilettiğimde, IP'nin unknown_hosts içinde bulunmadığını söyleyen bir hata atıyor ... - rexbelia
@rexbelia Bu, SSH'nin normal davranışıdır: doğru sunucuyla konuştuğunuzdan emin olmak için, SSH yalnızca bilinen bir ana bilgisayardan anahtarı kabul edecektir. Çözüm, ilgili anahtarın bilinen_konuslara eklenmesi veya belgede açıklandığı gibi, uygun bir değere eksik_konum_kimliği argümanı ayarlanmasıdır. - Michael Williamson