Я пытаюсь запустить 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?
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",
"[email protected]:/tmp",
"/home/tmp/",
NULL
};if (execvp("rsync", argv) < 0) {
perror("rsync(1) error");
exit(EXIT_FAILURE);
}
return 0;
}