通过execvp运行rsync:StrictHostKeyChecking = no:未知选项

我想通过StrictHostKeyChecking选项通过execvp运行rsync。 这是我的代码:

#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错误: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错误:pipe.c(84)处的IPC代码(代码14)错误[sender = 3.0.6]

为什么它不明白StrictHostKeyChecking选项?

rsync希望首先接收选项,然后是主机。 你正在做倒退:首先你需要指定-e-o

你也不应该单引号-o选项:当从bash调用它时需要这个选项,以防止bash解释参数并将它们拆分成单独的argv[]条目。 想一想:当bash看到'-o StrictHostKeyChecking=no' ,它将-o StrictHostKeyChecking=no作为单个的argv[]条目-o StrictHostKeyChecking=no ,没有单引号(因为单引号是你告诉shell你不用的方法) t想要分裂)。

最后,但并非最不重要,你应该检查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; }