запустить rsync через execvp: StrictHostKeyChecking=no: неизвестная опция

Я пытаюсь запустить rsync через execvp с параметром StrictHostKeyChecking. Это мой код:

#include <unistd.h>
int main() {
        char *argv[] = {"rsync",
                        "[email protected]:/tmp",
                        "/home/tmp/",
                        "-e 'ssh -o StrictHostKeyChecking=no'",
                        0};
        execvp("rsync", argv);
}

Я получаю эту ошибку:

rsync: -e '-o StrictHostKeyChecking=no': неизвестная опция rsync error: синтаксическая ошибка или ошибка использования (код 1) в main.c(1422) [client=3.0.6]

Я пробовал другой способ:

#include <unistd.h>
int main() {
        char *argv[] = {"rsync",
                        "[email protected]:/tmp",
                        "/home/tmp/",
                        "-e",
                        "'ssh -o StrictHostKeyChecking=no'",
                        0};
        execvp("rsync", argv);
}

Но теперь он терпит неудачу с ошибкой:

rsync: не удалось выполнить ssh -o StrictHostKeyChecking=no: нет такого файла или каталога (2) ошибка rsync: ошибка в коде IPC (код 14) в pipe.c(84) [sender=3.0.6]

Почему он не понимает опцию StrictHostKeyChecking?


person peroksid    schedule 04.07.2015    source источник
comment
Я думаю, что execvp ожидает, что это будет разделено на аргументы, как это сделала бы оболочка. Так что перемещение -e в свою собственную вещь идет в правильном направлении. Затем я бы попытался удалить одинарные кавычки вокруг аргумента ssh. Оболочка их тоже лишила бы.   -  person chicks    schedule 04.07.2015


Ответы (1)


rsync сначала ожидает получить параметры, а затем хосты. Вы делаете это в обратном порядке: сначала вам нужно указать -e и -o.

Вы также не должны заключать в одинарные кавычки параметр -o: это необходимо при вызове его из bash, чтобы bash не интерпретировал аргументы и не разбивал их на отдельные записи argv[]. Подумайте об этом: когда bash видит '-o StrictHostKeyChecking=no', он передает -o StrictHostKeyChecking=no как одну запись argv[] без одинарных кавычек (поскольку одинарные кавычки — это ваш способ сообщить оболочке, что вы не хотите разделения аргументов).

И последнее, но не менее важное: вы должны убедиться, что execvp(3) не дал сбоев.

Итак, это то, что вам нужно:

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

int main() {
    char *argv[] = {
        "rsync",
        "-e",
        "ssh -o StrictHostKeyChecking=no",
        "[email protected]:/tmp",
        "/home/tmp/",
        NULL
    };


    if (execvp("rsync", argv) < 0) {
        perror("rsync(1) error");
        exit(EXIT_FAILURE);
    }

    return 0;
}
person Filipe Gonçalves    schedule 04.07.2015