Twisted SSH curl 'CreateProcess', 'Система не может найти указанный файл.

Я использовал twisted, чтобы сделать 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', но безрезультатно.


person sajattack    schedule 14.06.2013    source источник


Ответы (2)


Попробуйте использовать фактический путь к исполняемому файлу curl. Скорее всего его нет в os.getcwd(). /usr/bin более вероятно (или, возможно, /bin или /usr/local/bin, или другое определенное системой местоположение). Вероятно, вы можете найти его, используя 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", при попытке их выполнения. Если он не установлен, вы должны указать абсолютный путь, чтобы иметь возможность выполнить что-либо.

person Jean-Paul Calderone    schedule 14.06.2013
comment
Исполняемый файл curl находится в cwd. Я положил это туда. - person sajattack; 14.06.2013
comment
Если бы это было действительно так, и вы указали абсолютный путь к нему, то spawnProcess его найдет. Значит, что-то не так, как вы думаете. Возможно, вы забыли поставить / между os.getcwd() и "curl". Я не знаю, вы точно не включили этот код в свой вопрос (но то, что вы включили, смешанное с вашей прозой, предполагает, что вы, возможно, это сделали). - person Jean-Paul Calderone; 14.06.2013

Хорошо, поэтому мне нужно было быть более конкретным. Вот рабочий do_curl. Мне пришлось добавить «\» после getcwd () и «.exe» после curl.

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)
person sajattack    schedule 14.06.2013
comment
Вы должны делать это с os.path.join, а не с +. В UNIX-подобных ОС вам понадобится /, а не файл с расширением. - person Glyph; 15.06.2013
comment
Спасибо за совет. Я должен сделать это отдельно для Unix, потому что Windows требует, чтобы я добавлял .exe - person sajattack; 15.06.2013