1

私が実際にやろうとしたこと:

Python スクリプトを使用して、ncSSH を使用してリモート ホストで (netcat) を開始します。この netcat は、着信 TCP 接続をリッスンする必要があります。誰もリモート ホストに接続したくない可能性があるため、netcat プロセスを強制終了する必要があります。

nc私の最初のアイデアは、リモート ホスト上のプロセスの PID を使用して、単純なkill [PID]コマンドを実行することでした。ncしかし、リモート ホスト上のプロセスからプロセス ID を取得できませんでした。

私がこれまでに試したことは、paramikoandを使用することでしsshpassた。

私のparamikoコード:

    import os, sys, paramiko


    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    ssh.connect(host, username=user, password=password)
    stdin, stdout, stderr = ssh.exec_command("nc -l -p"+port+"&")
    print stdout.readlines()

使用sshpass:

    sshProcess = subprocess.Popen(["sshpass", "-p", password, "ssh", user+"@"+hostaddress, "nc", "-l", "-p", str(destPort),"&"], stdout=subprocess.PIPE, stdin=None)
    print sshProcess.stdout.read()

通常のLinux端末でアプローチを試みたところsshpass、netcatプロセスのpidが返ってきました。しかし、Python スクリプトで両方のアプローチを試しても同じ結果になりました。PID を返す代わりに、スクリプト全体がブロックされました。出力を読み取ろうとしない場合 (つまり、stdout.readlines()またはを削除することを意味しますsshProcess.stdout.read())、スクリプトはブロックされませんが、リモート ホスト上の netcat プロセスの PID も取得できません。

Linux マシンで作業しており、リモート ホストも Linux を実行しています。

4

1 に答える 1

0

removeを使用して同期的"&"に実行し、次にkill を使用してサブプロセスを単に kill します ( )。ncssh -tncp.terminate()

timeout でサブプロセス stdout の読み取りを停止する方法を参照してください。

于 2012-09-19T09:07:40.240 に答える