概要
過去 に 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 件のコメント:
コメントを投稿