1

我实际上尝试做的事情:

使用 python 脚本nc在远程主机上使用 SSH 启动(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与 then同步"&"执行,然后 kill只是杀死子进程()。ncssh -tncp.terminate()

查看如何在 timeout 时停止读取子进程标准输出

于 2012-09-19T09:07:40.240 回答