我正在尝试使用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/

10-15 05:16