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

时间:2015-07-04 13:52:29

标签: c++ linux rsync execvp

我正在尝试使用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选项?

1 个答案:

答案 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;
}