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

run rsync through execvp: StrictHostKeyChecking=no: unknown option

本文关键字:选项 运行 unknown rsync execvp StrictHostKeyChecking 通过 no      更新时间:2023-10-16

我正试图通过带有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错误:语法或用法错误(代码1(在main.c(1422([client=3.06]

我尝试了另一种方式:

#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错误:管道.c(84([sender=3.0.6]上的IPC代码(代码14(错误

为什么它不理解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;
}