запустить rsync через execvp: StrictHostKeyChecking = no: неизвестный параметр

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

#include <unistd.h>
int main() {
char *argv[] = {"rsync",
"remote_user@1.2.4.5:/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",
"remote_user@1.2.4.5:/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?

2

Решение

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

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

Наконец, но не в последнюю очередь, вы должны проверить, что execvp(3) не подвела

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

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

int main() {
char *argv[] = {
"rsync",
"-e",
"ssh -o StrictHostKeyChecking=no",
"remote_user@1.2.4.5:/tmp",
"/home/tmp/",
NULL
};if (execvp("rsync", argv) < 0) {
perror("rsync(1) error");
exit(EXIT_FAILURE);
}

return 0;
}
2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector