2021年7月21日水曜日

Paramiko でコマンドをバックグランド実行する方法

Paramiko でコマンドをバックグランド実行する方法

概要

過去 に paramiko を試してみました 今回はバックグランドで実行する方法を紹介します

環境

  • macOS 11.4
  • Python 3.8.3
  • paramiko 2.7.2

サンプルコード

import paramiko

def execute_cmd():
    with paramiko.SSHClient() as ssh_client:
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_client.connect(hostname='192.168.1.2',
                    port=22,
                    username='username',
                    password='xxxxxxxxx')
        transport = ssh_client.get_transport()
        channel = transport.open_session()
        channel.exec_command('for i in `seq 1 10`; do echo $i; sleep 1; done', timeout=5)
        # try: 
        #     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()
        # finally:
        #     channel.close()
        return "ok"

print(execute_cmd())

ポイント

transport.open_session() でセッションを作成してからチャネルに対して exec_command することでバックグランド実行になります

ただこの場合は結果が戻ってこないので別ロジックでチャネルを使って結果を待つ必要があります コメントしている部分を外せば stdout_data に結果が入りますが Python 的には結局結果を待つ必要があるので結果が取得できるまでプロンプトは戻ってきません

バックグランドでコマンドを実行させる場合はコマンド側に結果をどこかに格納してそれを参照するような仕組みにしたほうが良いかなと思います (例えばコマンドの結果をファイルに出力してそのファイルの中身を見るなど)

参考サイト

0 件のコメント:

コメントを投稿