стартирайте rsync през execvp: StrictHostKeyChecking=не: неизвестна опция

Опитвам се да стартирам 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 грешка: грешка в синтаксиса или използването (код 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