c++ - 通过 execvp : StrictHostKeyChecking=no: unknown option 运行 rsync

标签 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(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/

相关文章:

c++ - 如何使用 Boost::Geometry _union 与整数

c++ - 从 C++ 图像帧到 html5 <客户端浏览器中的视频标签

c - 具有 sigev_notify = SIGEV_THREAD_ID 方法的 POSIX 计时器

linux - 无法使用 jenkins 在 ubuntu 上运行远程脚本

ubuntu - 将大数据从 Droplet 同步到 Digital Ocean Space (S3)

c++ - C++ 中 "low-level"多线程的基本示例是什么?

c++ - 数组( vector )中大于某个值的元素的起始索引和结束索引

linux - 我们可以在 linux 上运行 tensorflow lite 吗?或者它仅适用于 android 和 ios

macos - 将文件传输到 Web 服务器时转换 Unicode 分解

ssh - 如何将目录从本地机器复制到远程机器