0

我正在尝试让子进程通过 linux 运行 hma 代理。我是 Python 新手,所以也许我没有使用正确的方法。我需要它做的是在后台运行 hma 并让程序检查我的公共 IP 是否与程序启动之前相同,如果不是每 30 分钟重新运行一次 hma 程序。

基本上程序需要检查当前IP然后连接到hma。如果第一个 IP 匹配第二个 IP,即 hma 没有连接,则打印等待。如果 IP 不匹配,则在 30 分钟内再次运行 hma。这是我到目前为止的代码。

import os
import webbrowser
import time
import socket
import urllib2
import subprocess

response = urllib2.urlopen("http://automation.whatismyip.com/n09230945.asp")
internal = response.read()
print "Internal IP Address is ", internal   
hma = ['cd', '/Desktop/hma', ';', './hma-start', '-r']
subprocess.Popen(hma, shell=True)
response = urllib2.urlopen("http://automation.whatismyip.com/n09230945.asp")
external = response.read()
while (internal == external):
    time.sleep(1)
    response = urllib2.urlopen("http://automation.whatismyip.com/n09230945.asp")
    external = response.read()
    print 'waiting'

while (internal != external):
    print 'It changed'
    hma = ['cd', '/Desktop/hma', ';', './hma-start', '-r']
    subprocess.Popen(hma, shell=True)
    response = urllib2.urlopen("http://automation.whatismyip.com/n09230945.asp")
    external = response.read()

print "External IP Address is ", external

我究竟做错了什么?对不起,如果这是完全错误的。我是子流程模块的新手

4

2 回答 2

0

嗨,所以我不熟悉 hma,但是这样的东西应该可以工作。如果不是 dav1d ,请确保 hma-start 在您的路径中。我不太确定你为什么使用 /Desktop/hma?当您提升权限时,它在哪里并不重要。

import os
import webbrowser
import time
import socket
import urllib2
import subprocess
import socket

URL = "http://automation.whatismyip.com/n09230945.asp"
DIR = '/Desktop/hma'
HMA = ['./hma-start', '-r']
WAIT_TIME = 60 * 30 # 30 min
GET_IP = lambda: urllib2.urlopen(URL).read()

if __name__ == '__main__':
    external = internal = GET_IP()
    print "Internal IP Address is %s" % internal
    try:
        os.chdir(DIR)
    except OSError:
        print "%s not found" % DIR

    print "External IP Address is ", external
    while True:
        external = GET_IP()
        if external != internal:
            print "Proxied"
            time.sleep(WAIT_TIME)
        else:
            print "Not Proxied"
            proc = subprocess.Popen(HMA)
            proc.wait()
于 2012-07-27T05:38:09.403 回答
0

如果你使用shell=True你的命令行必须是一个字符串:

hma = 'cd /Desktop/hma; ./hma-start -r'
subprocess.Popen(hma, shell=True)

但是你也可以不这样做shell=True

hma = ['/Desktop/hma/hma-start', '-r']
subprocess.Popen(hma)

如果您想等到该过程完成,请调用.communicate().Popen-Object

于 2012-07-26T22:26:20.487 回答