Я упаковываю программу на 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).
Возможно также, что может быть не программируемый способ сделать это, о котором я не думал, но все возможности, которые я пробовал, похоже, не работают.
Мысли?