我正在尝试使用 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] 的语法或使用错误(代码 1)
我试过另一种方式:
#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 选项?
最佳答案
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;
}
关于c++ - 通过 execvp : StrictHostKeyChecking=no: unknown option 运行 rsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31221398/