Twisted SSH curl“'CreateProcess','系统无法找到指定的文件。”

时间:2013-06-14 02:41:06

标签: python curl ssh twisted createprocess

我使用twisted来制作类似于here所示的SSH服务器。我试图像这样添加curl功能:

class CurlProcessProtocol(protocol.ProcessProtocol):
    def connectionMade(self):
        self.transport.closeStdin()

def do_curl(self, *args):
    "Sets up a download"
    curlProcess = CurlProcessProtocol()
    args = tuple(['curl'])+args
    reactor.spawnProcess(curlProcess, 'curl', args)

我有curl在我的程序所在的目录中运行所需的文件。当我连接到SSH服务器并尝试curl命令时,我收到以下错误:Error: (2, 'CreateProcess', 'The system cannot find the file specified.')我尝试在os.getcwd()+之前添加'curl'无效。

2 个答案:

答案 0 :(得分:2)

尝试使用curl可执行文件的实际路径。最有可能的不是os.getcwd()/usr/bin更有可能(或可能是/bin/usr/local/bin或其他一些系统定义的位置。你可以在shell中使用which curl找到它。

或者,将PATH环境变量添加到spawnProcess调用 -

reactor.spawnProcess(
    curlProcess, 'curl', args, env={b"PATH": os.environ[b"PATH"]})

或者,甚至可能更好,添加整个环境:

reactor.spawnProcess(
    curlProcess, 'curl', args, env=os.environ)

PATH控制系统在尝试执行它们时查找相对路径名称(如“curl”)的位置。如果未设置,则必须指定一个绝对路径才能执行任何操作。

答案 1 :(得分:0)

好吧,所以我需要更加具体。这是一个有效的do_curl。我必须在getcwd()之后添加一个“\”,在curl之后添加一个“.exe”。

def do_curl(self, *args):
    "Sets up a download"
    curlProcess = CurlProcessProtocol()
    args = tuple([os.getcwd()+'\curl.exe'])+args
    reactor.spawnProcess(curlProcess, os.getcwd()+'\curl.exe', args)