2022年8月5日金曜日

paramikoで30分以上かかるコマンドを投げる場合にはchannelを使ったほうがいいかもしれない

paramikoで30分以上かかるコマンドを投げる場合にはchannelを使ったほうがいいかもしれない

概要

過去に paramiko を使ってコマンドを実行する方法を紹介しました
今回は channel という機能を使って接続状態を保つ方法を紹介します

環境

  • macOS 11.6.8
  • Python 3.10.2
  • paramiko

サンプルコード

import paramiko

with paramiko.SSHClient() as client:
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    rsa_key = paramiko.RSAKey.from_private_key_file("/path/to/sshkey.pem", "xxx")
    client.connect(hostname="192.168.100.1", port=22, username="user01", pkey=rsa_key)
    # channelの作成
    channel = client.get_transport().open_session(timeout=3600)
    try:
        command = "hostname"
        channel.exec_command(command)
        RECV_SIZE = 1024 * 32
        stdout_data = b''
        stderr_data = b''
        while not channel.closed or channel.recv_ready() or channel.recv_stderr_ready():
            stdout_data += channel.recv(RECV_SIZE)
            stderr_data += channel.recv_stderr(RECV_SIZE)
        code = channel.recv_exit_status()
        print(stdout_data)
        print(stderr_data)
    finally:
        channel.close()

注意事項

while で無限ループにしているので最悪抜け出せないことになるかもしれないのでもう少し考慮が必要かもしれない (外部タイマとか別のフラグのチェックとか)

0 件のコメント:

コメントを投稿