我正在尝试使用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上的语法或用法错误(代码1)(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)[sender = 3.0.6]
为什么它不理解StrictHostKeyChecking选项?
答案 0 :(得分:2)
rsync
期望首先接收选项,然后是主机。您反向执行此操作:首先,您需要指定-e
和-o
。
你也不应该单引用-o
选项:从bash调用它时需要它,以防止bash解释参数并将它们拆分成单独的argv[]
条目。考虑一下:当bash
看到'-o StrictHostKeyChecking=no'
时,它会将-o StrictHostKeyChecking=no
作为单个argv[]
条目传递,而不会使用单引号(因为单引号是告诉shell的方式)你不想要论证分裂。
最后但并非最不重要的是,您应该检查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;
}