2014-01-04 4 views
1

Я упаковываю программу на Windows, которая ожидает, что сможет вызвать OpenSSH извне. Итак, мне нужно пакет ssh.exe с ним, и мне нужно заставить ssh.exe всегда вызываться с помощью параметра командной строки (в частности, -F для указания файла конфигурации, который он должен использовать). Невозможно заставить вызывающую программу сделать это, и нет простых способов сделать это иначе в Windows (что я могу думать о любом случае - скрипты symlinks или cmd не будут работать), поэтому я просто собирался написать простую оболочку в C, чтобы сделать это.Simple C Wrapper Around OpenSSH (с Cygwin в Windows)

Это код, который я поставил вместе:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 


int main(int argc, char *argv[]) 
{ 
    int ret; 
    char **newv = malloc((argc + 2) * sizeof(*newv)); 
    memmove(newv, argv, sizeof(*newv) * argc); 

    newv[argc] = "-F ssh.conf"; 
    newv[argc+1] = 0; 

    ret = execv("ssh.orig.exe", newv); 

    printf("execv failed with return value of %i", ret); 

    return ret; 
} 

Я затем скомпилировать этот код, используя GCC 4.6.3 в Cygwin и работает без ошибок; однако есть странное поведение в отношении ввода и вывода. Когда вы переходите к типу на консоли (подтверждая подлинность хоста и вводя пароль и т. Д.), На консоли появляется только часть ввода. Например, если я набираю слово «да» и нажимаю , введите, на консоли появится только «e», и SSH отобразит сообщение о необходимости ввода «да» или «нет». Выполнение этого из командной строки Windows приведет к возврату вашего ввода в команду propmt, поэтому, когда вы наберете «да» и нажмите , введите, вы получите «да», не распознается как внутренняя или внешняя команда. . ', как будто ввод вводится в командной строке. В конце концов SSH будет тайм-аут после этого.

Итак, я, очевидно, что-то пропустил, и полагаю, что это имеет какое-то отношение к тому, как работает execv (по крайней мере, версия POSIX Cygwin).

Есть ли что-то, что мне не хватает здесь или есть какие-то альтернативы? Мне было интересно, может, мне нужно его разветвить и перенаправить ввод-вывод в fork (хотя fork(), похоже, не работает, но в Windows есть другие проблемы). Я попытался использовать _execv из process.h, но у меня были проблемы с получением кода для этого (также может быть связано с попыткой использовать gcc).

Возможно также, что может быть не программируемый способ сделать это, о котором я не думал, но все возможности, которые я пробовал, похоже, не работают.

Мысли?

ответ

1

В итоге я нашел решение этой проблемы. Я уверен, что есть другие способы сделать это, но это, похоже, устраняет проблему и работает хорошо. Я заменил execv строку со следующим кодом:

ret = spawnv(P_WAIT, "ssh.orig.exe", newv); 

Вы должны использовать «P_WAIT» в противном случае родительский процесс завершается, и выходит, и вы по-прежнему имеют те же проблемы, как и раньше. Это заставляет родительский процесс ждать, но все же переносит ввод и вывод в дочерний процесс.

Смежные вопросы