Pythonは複数のサーバ間でファイルのアップロード/ダウンロード機能を実現

28908 ワード

まず、この機能を実現するにはparamikoモジュールを借りる必要があるので、このブログではparamikoモジュールを使用して関連するサーバ間のファイル操作を行う方法について重点的に説明します.
一:紹介
paramikoはpython言語で書かれたモジュールで、SSH 2プロトコルに従い、暗号化と認証でリモートサーバへの接続をサポートしています.
pythonのようなプラットフォーム間で動作可能な言語を使用しているため、Linux、Solaris、BSD、MacOS X、Windowsなど、すべてのpythonがサポートするプラットフォームでparamikoがサポートできるため、SSHを使用して一つのプラットフォームから別のプラットフォームに接続し、一連の操作を行う必要がある場合、paramikoは最適なツールの一つです.
一般的な例を挙げると、Windowsクライアントを使用してLinuxサーバにリモートで接続し、上記のログステータスを表示する必要があります.一般的に使用されている方法は、次のとおりです.
  • 用telnet
  • 用PUTTY
  • 用WinSCP
  • Xmanager等で…
  • では、今また1つ追加して、サーバーからファイルをダウンロードする必要がある場合は、どうすればいいですか?よく使われる方法は、
  • LinuxにFTPをインストールして配置
  • LinuxにSambeをインストールして配置する...
  • 一般的な解決策としては、リモートサーバに必要な構成が必要であることがわかります.リモートサーバが1、2台しかない場合は、N台があれば、1台ずつ構成する必要がある場合や、コードを使用して以上の操作を行う必要がある場合は、上記の方法は不便です.
    paramikoを使用すると、上記の問題をうまく解決できます.前述の方法よりも、対応するソフトウェア(pythonおよびPyCrypto)をローカルにインストールするだけで、リモートサーバに構成要件がなく、複数のサーバを接続するために複雑な接続操作を行うのに特に役立ちます.
    二:取り付け
    paramikoのインストールには、pythonとPyCryptoという別のモジュールの2つの前提条件があります.通常、標準のpythonモジュールをインストールします.モジュールのルートディレクトリで実行するだけです.
    python setup.py build
    python setup.py install
    
    : gcc(yum -y install gcc)
    2.1、PyCryptoインストール
    wget http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz
    
    tar -zxvf pycrypto-2.6.tar.gz
    
    cd pycrypto-2.6/
    
    python setup.py build && python setup.py install
    

    テスト:
    python>> import Crypto
    
    ( :error: command 'gcc' failed with exit status 1; python-dev , yum -y install python-devel)
    2.2、paramiko取付
    wget http://www.lag.net/paramiko/download/paramiko-1.7.7.1.tar.gz
    
    tar xvzf paramiko-1.7.7.1.tar.gz
    
    cd paramiko-1.7.7.1/
    
    python setup.py build && python setup.py install
    
    Crypto error: 'module' object has no attribute 'HAVE_DECL_MPZ_POWM_SEC'
    

    テスト:
    python>> import paramiko
    

    (Crypto error: ‘module’ object has no attribute ‘HAVE_DECL_MPZ_POWM_SEC’
    /usr/lib/python 2を見つけます.7/site-packages/Crypto/Util/number.py if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:コメント#if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:)*
    三:paramikoの使用
    #ssh接続のリモートホストアドレスとポートt=paramikoを設定.Transport((ip,port)#ログイン名とパスワードt.connect(username=username,password=password)#接続に成功したらchannel chan=t.open_を開くセッションのタイムアウト時間を設定します.settimeout(session_timeout)#リモートterminal chanを開く.get_pty()#terminal chanをアクティブにします.invoke_shell()はchanを通過することができます.send(‘command’)とchan.recv(recv_buffer)は、コマンドをリモートで実行し、フィードバックをローカルで取得します.paramikoには2つのモジュールSSHClient()とSFTPClient()がSSHClient()を利用しています.
     #coding:utf-8
     import paramiko
     
     #  SSH  
     ssh = paramiko.SSHClient()
     #       know_hosts      
     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     #      
     ssh.connect(hostname='192.168.2.103', port=22, username='root', password='123456')
    
     #     
     stdin, stdout, stderr = ssh.exec_command('ls')
     #       
     result = stdout.read()
     print (str(result,encoding='utf-8'))
     #     
     ssh.close()
    

    SSHClient()にはtransport変数があります.これは接続を取得するために使用されます.そのため、transport変数を単独で取得し、接続操作を実行することもできます.
    #coding:utf-8
     import paramiko
    
     transport = paramiko.Transport(('192.168.2.103', 22))
     transport.connect(username='root', password='123456')
     
     ssh = paramiko.SSHClient()
     ssh._transport = transport
     stdin, stdout, stderr = ssh.exec_command('df')
     print (str(stdout.read(),encoding='utf-8'))
     transport.close()
    

    transportでアップロードダウンロードおよびコマンドの実行を実現する:
     1 #coding:utf-8
     2 import paramiko
     3 import uuid
     4 
     5 class SSHConnection(object):
     6 
     7     def __init__(self, host='192.168.2.103', port=22, username='root',pwd='123456'):
     8         self.host = host
     9         self.port = port
    10         self.username = username
    11         self.pwd = pwd
    12         self.__k = None
    13 
    14     def connect(self):
    15         transport = paramiko.Transport((self.host,self.port))
    16         transport.connect(username=self.username,password=self.pwd)
    17         self.__transport = transport
    18 
    19     def close(self):
    20         self.__transport.close()
    21 
    22     def upload(self,local_path,target_path):
    23         #   ,  
    24         # file_name = self.create_file()
    25         sftp = paramiko.SFTPClient.from_transport(self.__transport)
    26         #  location.py        /tmp/test.py
    27         sftp.put(local_path, target_path)
    28 
    29     def download(self,remote_path,local_path):
    30         sftp = paramiko.SFTPClient.from_transport(self.__transport)
    31         sftp.get(remote_path,local_path)
    32 
    33     def cmd(self, command):
    34         ssh = paramiko.SSHClient()
    35         ssh._transport = self.__transport
    36         #     
    37         stdin, stdout, stderr = ssh.exec_command(command)
    38         #       
    39         result = stdout.read()
    40         print (str(result,encoding='utf-8'))
    41         return result
    42 
    43 ssh = SSHConnection()
    44 ssh.connect()
    45 ssh.cmd("ls")
    46 ssh.upload('s1.py','/tmp/ks77.py')
    47 ssh.download('/tmp/test.py','kkkk',)
    48 ssh.cmd("df")
    49 ssh.close()
    

    四、linuxとの接続
    次にparamikoを使用してlinuxサーバに接続する2つのコードを示します.
    方法1:
    1 ssh = paramiko.SSHClient()
    2 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    3 ssh.connect(" IP  ",22,"   ", "  ")
    

    方式2:
    1 t = paramiko.Transport((“  ”,”  ”))
    2 t.connect(username = “   ”, password = “  ”)
    

    SFTPClient()もtransportを使用して実現されるので、コマンドとアップロードファイルを混在させる必要がある場合はtransportを使用して実現する必要があります.リモートホストへの接続に鍵が必要な場合は、上の2行目のコードを次のように変更できます.
    t.connect(username = “   ”, password = “  ”, hostkey=”  ”)
    

    3.1 Windowsはlinuxに対して任意のコマンドを実行し、結果を出力する
    linuxサーバに22ポートがオープンしている場合、windows側ではparamikoを使用してサーバにリモート接続し、任意のコマンドを実行してprintまたは他の方法で結果を得ることができます.
    コードは次のとおりです.
     1 #coding:Utf8
     2 
     3 import paramiko
     4  
     5 ssh = paramiko.SSHClient()
     6 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     7 ssh.connect(" IP  ",22,"   ", "  ")
     8 stdin, stdout, stderr = ssh.exec_command("    ")
     9 print stdout.readlines()
    10 ssh.close()
    

    その中の「あなたのコマンド」はlinuxがサポートするコマンドを任意に使用できます.
    3.2 widnows側からlinuxサーバ上のファイルをダウンロードする
    1 coding:utf8
     2 
     3 import paramiko
     4  
     5 t = paramiko.Transport((“  ”,”  ”))
     6 t.connect(username = “   ”, password = “  ”)
     7 sftp = paramiko.SFTPClient.from_transport(t)
     8 remotepath=/var/log/system.log’
     9 localpath=/tmp/system.log’
    10 sftp.get(remotepath, localpath)
    11 t.close()
    

    3.3 widnows側からlinuxサーバにファイルをアップロードする
    1 import paramiko
    2 
    3 t = paramiko.Transport((“  ”,”  ”))
    4 t.connect(username = “   ”, password = “  ”)
    5 sftp = paramiko.SFTPClient.from_transport(t)
    6 remotepath=/var/log/system.log’
    7 localpath=/tmp/system.log’
    8 sftp.put(localpath,remotepath)
    9 t.close()
    

    3.4 Linuxにparamikoモジュールをインストールする
    scrapyというアプリケーションで発生した問題c/_をインストールします.cffi_backend.c:2:20: fatal error: Python.h: No such file or directory sudo apt-get install python-dev c/_cffi_backend.c:13:17: fatal error: ffi.h: No such file or directory 1 sudo apt-get install libffi-dev *make sure the development packages of libxml2 and libxslt are installed * 1 sudo apt-get install libxslt1-dev
    1.インストールwgetをダウンロードするhttp://peak.telecommunity.com/dist/ez_setup.py
    2.python ez_setup.py
    3.easy_install paramiko