Muallim-i Ali Posted October 24, 2007 Share Posted October 24, 2007 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 More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.