pythonによるftpとリモート操作linuxの実現

5786 ワード

ハロー、皆さん、こんにちは、隣の王ですが、最近仕事でpythonを使って遠隔操作をするモジュールに初めて触れました.実用的だと思います.ここでも皆さんと共有して、もちろん大神は迂回しましょう.
このライブラリはparamikoと呼ばれています.このライブラリはリモートプロトコルを実現したライブラリです.簡単で使いやすく、機能が強いですよ.
まずsftpの実装プロセスを紹介し、ディレクトリの下のすべてのファイルをダウンロードすると仮定します.一般的な実装プロセスは、ターゲットホストをリンクすることです.sftpオブジェクトを作成します.リモートディレクトリ内のすべてのターゲットファイル名を取得します.ファイル名とローカルに保存されたフォルダを使用してターゲットファイルパスを構成します.ダウンロード;リンクを閉じます.
具体的なコードは以下の通りです.
def loadFile():
    tar_list = []
    local_list = []

    # connect server & get file
    transport = paramiko.Transport(('%s' % DataHost, DataPort))
    transport.connect(username=DataUser, password=DatapPassword)
    sftp = paramiko.SFTPClient.from_transport(transport)
    file_names = sftp.listdir(server_compress_file_path)
    for file in file_names:
        tar_list.append(server_file_path + file)
        local_list.append(local_file_path + file)

    for i in range(len(tar_list)):
        sftp.get(tar_list[i], local_list[i])
          transport.close()

これはサンプルの関数です.ソースディレクトリ、宛先ディレクトリのパス(server_file_path,local_file_path)は、自分でコンテンツを別途設定します.
もちろんこれで完璧ですか?ファイルをダウンロードする前に、ターゲットファイルがアップロードされたかどうかを確認したほうがいいですが、どうやって検証すればいいですか?mtime、つまりファイルの最後の修正時間で、ファイルの最後の修正時間が現在の時間の2分を超えると、このファイルは完全にアップロードされると仮定します.どのように実現しますか.
def checkTime(filePath):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(DataHost, DataPort, DataUser, DatapPassword)

    stdin, stdout, stderr = ssh.exec_command('stat ' + filePath)
    time_info = stdout.read()
    ssh.close()

    mtime = re.search('()(.{19})', time_info).group()[-19:]
    mtimestamp = time.mktime(time.strptime(mtime, "%Y-%m-%d %H:%M:%S"))
    curtime = time.time()

    if (curtime - mtimestamp) > 120:
        return True
    else:
        return False

ここではちょうどsshの使い方も提案されていますが、sshの呼び出しはもっと簡単で、set_missing_host_key_policy()は,初上陸時の検証を迂回するために用いられる.execの使用commandは、リモートファイルのいくつかの列情報を印刷できるフィードバックメタグループを得ることができ、パラメータ1は入力情報であり、パラメータ3はフィードバックのエラー情報である.正規表現で最後の修正時間を見つけ,timeモジュールを用いてタイムスタンプに変換してローカルのタイムスタンプと比較し,結果を得た.ここでは、私の正則はあまり使われていないので、硬いので、一致するときは「最近の変更:」という文字を排除していません.それによって、スライスの最後の19の役に立つ時間文字を選択しなければなりません.正則は私の指導の下で、ありがとうございます.
では、この2つの関数を組み合わせてみましょう.
def loadFile():
    tar_list = []
    local_list = []

    # connect server & get file
    transport = paramiko.Transport(('%s' % DataHost, DataPort))
    transport.connect(username=DataUser, password=DatapPassword)
    sftp = paramiko.SFTPClient.from_transport(transport)
    file_names = sftp.listdir(server_compress_file_path)
    for file in file_names:
        tar_list.append(server_file_path + file)
        local_list.append(local_file_path + file)

    for i in range(len(tar_list)):
        if checkTime(tar_list[i]):
            sftp.get(tar_list[i], local_list[i])
        else:
            printInfo("file:%s is not upload perfectly!" % tar_list[i])
            continue   transport.close()

これがsftp、ssh、および時間チェック付きのリモートファイルダウンロードの例です.
読んでくれてありがとう.何かアドバイスや指導があれば、メッセージを歓迎します.