我正在尝试使用StrictHostKeyChecking选项通过execvp运行rsync。
这是我的代码:
#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 =否':未知选项
rsync错误:main.c(1422)[client = 3.0.6]上的语法或用法错误(代码1)
我尝试了另一种方法:
#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错误: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[]
条目传递,不带单引号(因为单引号是告诉 shell 程序您不希望参数分割的方式)。
最后但并非最不重要的一点是,您应该检查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;
}
关于c++ - 通过execvp : StrictHostKeyChecking=no: unknown option运行rsync,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31221398/