【问题标题】:run rsync through execvp: StrictHostKeyChecking=no: unknown option通过 execvp 运行 rsync:StrictHostKeyChecking=no:未知选项
【发布时间】:2015-09-22 03:45:38
【问题描述】:

我正在尝试使用 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 错误:在 pipe.c(84) [sender=3.0.6] 的 IPC 代码(代码 14)中出错

为什么它不理解 StrictHostKeyChecking 选项?

【问题讨论】:

  • 我认为 execvp 期望这会像 shell 那样被拆分为参数。因此,将-e 转移到自己的领域是朝着正确的方向发展。接下来我将尝试删除 ssh 参数周围的单引号。外壳也会剥离这些。

标签: c++ linux rsync execvp


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2018-09-06
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多