Jump to content

Python ile SSH bağlantısı


Muallim-i Ali

Recommended Posts

Bu dökümanda Python ile uzak ssh sunucularına bağlantı anlatılacaktır. Öncelikle Python ssh2 istemcisini indirip kurmanız gerekir. Python ssh2 istemcisi paramiko'dur. Paramiko'nun ana sitesi http://www.lag.net/paramiko/ adresindedir. Ancak paramiko'nun çalışabilmesi için pycripto modülüne ihtiyacınız olacak. Her iki paketin Fedora sürümlerini aşağıdaki adreslerden elde edebilirsiniz:

http://dries.studentenweb.org/apt/packages/python-crypto/info.html

Paketleri kurduktan sonra python istemcisini çalıştırın. ve paramiko modülünü çağırın:

>>> import paramiko

Öncelikle, bağlantı yapılacak makinanın anahtarının, yerel anahtar dosyasında (roo kullanıcısının) /root/.ssh/known_hosts olup olmadığına bakmak gerek, bağlantı yapacağımız makina 192.168.1.1 olsun

>>> import paramiko

>>> hKeys=paramiko.HostKeys()

>>> hKeys.load("/root/.ssh/known_hosts")

>>> hKeys.lookup("192.168.1.1")

Buradan, makina anahtarının olmadığı görülüyor, eğer olsaydı {'ssh-rsa': <paramiko.RSAKey object at 0xb7f26bac>} şeklinde dönecekti. O halde öncelikle, makina anahtarını alıp, /root/.ssh/known_hosts dosyasına kaydetmeliyiz, bunun için:

>>> t=paramiko.Transport(("192.168.1.1",22))

>>> t.start_client()

>>> host_key=t.get_remote_server_key()

>>> hKeys.add("192.168.1.1", host_key.get_name(), host_key)

>>> hKeys.save("/root/.ssh/known_hosts")

Şimdi paramiko modülündeki ssh istemcisi için bir sınıf oluşturalım:

>>> istemci=paramiko.SSHClient()

Daha önceden bağlantı yapılan ssh sunucularının makina anahtaralarını (host keys) yükleyelim:

>>> istemci.load_system_host_keys()

Aslında en iyisi, tüm bunları otomatik olarak yapacak bir fonksiyon yazmalı.

Şimdi 192.168.1.1 sunucusuna mbaser kullanici adi ve harikapython parolası ile bağlanalım:

>>> istemci.connect("192.168.1.1", port=22, username="mbaser", password="harikapython")

Bu sunucuda istediğini komutu çalıştırmak için exec_command metodunu kullanmamız gerekir. Sunucuda date komutu işletelim ve sonucunu okuyalım:

>>> stdin, stdout, stderr = istemci.exec_command('date')

>>> stdout.read()

'Fri May 4 12:38:55 EEST 2007\n'

Karşı sunucuda istediğiniz komutu çalıştırabilirsiniz. Örneğin, bir kalsö açmak için:

>>> stdin, stdout, stderr = istemci.exec_command('mkdir /tmp/mbaser')

>>> stdout.read()

''

>>> stderr.read()

''

Elebtteki izniniz olmayan bir iş yaptığınızda:

>>> stdin, stdout, stderr = istemci.exec_command('mkdir /mbaser')

>>> stdout.read()

''

>>> stderr.read()

"mkdir: cannot create directory `/mbaser': Permission denied\n"

şeklinde uyarılacaksınız.

Uzak makinada yapılacak işlerin birçoğunu (oradaki komutları çalıştırmak dışında) sftp bağlantısı ile yapmanız olası, bunun için bir sftp bağlantısı yapalım:

>>> sftp=istemci.open_sftp()

sftp istemcisinin metotlarına bakacak olursak:

>>> dir(sftp)

['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__',

'__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__',

'__weakref__', '_adjust_cwd', '_async_request', '_convert_status', '_cwd', '_expecting',

'_finish_responses', '_lock', '_log', '_read_all', '_read_packet', '_read_response', '_request',

'_send_packet', '_send_server_version', '_send_version', '_write_all', 'chdir', 'chmod', 'chown',

'close', 'file', 'from_transport', 'get', 'getcwd', 'listdir', 'listdir_attr', 'logger', 'lstat',

'mkdir', 'normalize', 'open', 'put', 'readlink', 'remove', 'rename', 'request_number', 'rmdir', 'sock',

'stat', 'symlink', 'truncate', 'ultra_debug', 'unlink', 'utime']

Sanırım bu kadar, metot uzak makinada yapmak istediklerinizin birçoğunu gerçekleştirir. Örneğin uzak makinadaki /home/mbaser klasörünü listeleyelim:

sftp.listdir("/home/mbaser")

['.qt', '.bash_history', '.mcop', '.DCOPserver_mbaser.ibu.edu.tr__0', '.local',

'ms_thesis_heat_and_temperature_concepts_test.pdf', '.Xauthority', '.gnome2_private',

'.DCOPserver_mbaser.ibu.edu.tr_:0', '.xsession-errors-:0', 'vergi', '.mozilla', '.ICEauthority',

'Yeo_Zadnik.pdf', '.kde', '.zshrc', 'a.PNG', '.xsession-errors', '.bash_profile', 'vergi.pdf', '.dmrc',

'.bashrc', '.gconfd', 'Maildir', '.bash_logout', '.gnome2', 'Desktop', '.gconf']

Buradaki Yeo_Zadnik.pdf dosaysını alıp yerel makinadaki /root klasörüne kopyalayalım:

>>> F=sftp.open("/home/mbaser/Yeo_Zadnik.pdf",'rb') #dosya sanki yerel makinada imiş gibi okunur.

>>> pdfFile=F.read()

>>> F.close()

>>> W=open("/root/Yeo_Zadnik.pdf","wb")

>>> W.write(pdfFile)

>>> W.close()

Dosyayı okurken ve yazarken "b" (binary, ikili) şekilde açtığımıza dikkat edin.

Ya da aynı işlemi get metodu ile yapabilirsiniz:

>>> sftp.get("/home/mbaser/Yeo_Zadnik.pdf", "/root/Yeo_Zadnik.pdf")

İsterseniz, uzaktaki bir dosyayı açıp içine birşeyler ekleyip kaydedebilirsiniz:

>>> O=sftp.open("/home/mbaser/.bash_history",'a')

>>> O.write("date\n")

>>> O.close()

Ya da tamamen yeni bir dosya açabilirsiniz:

>>> O=sftp.open("/home/mbaser/yeni_dosya.txt",'w')

>>> O.write("Bu dosya python sftp istemcisi ile yazılmıştır")

>>> O.close()

Yerel makinadaki bir dosyayı karşı tarafı kopyalamak ta çok kolay. Örneğin, yerel makinadaki /root/dilekce.odt dosyasını karşı tarafa yazalım:

>>> F=open("/root/dilekce.odt","rb")

>>> binFile=F.read()

>>> F.close()

>>> O=sftp.open("/home/mbaser/dilekce.odt","wb")

>>> O.write(binFile)

>>> O.close()

Ya da aynı işlemi, put metodu ile doğrudan yapabilirsiniz:

>>> sftp.put("/root/dilekce.odt", "/home/mbaser/dilekce.odt")

Kaynak : http://mbaser.web.ibu.edu.tr/python/python_ssh.html

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...