2

下面的 C 程序编译并输出“/Users/home/tempdir”目录的目录列表。

#include <stdio.h>
#include <unistd.h>
int main(int argc, const char * argv[])
{
        execl("/bin/ls", "ls", "/Users/home/tempdir");
        // execl("/usr/bin/scp", "scp", "myfile.txt home@127.0.0.1:/Users/home/scpdir");
    return 0;
}

这表明可以从 C 程序执行二进制文件。我试图弄清楚如何执行“scp”二进制文件并输入所需的密码。如何修改上述代码以通过 scp 实现成功的文件传输?

我尝试了上面注释掉的行,但是在未注释时收到以下消息:

usage: scp [-1246BCEpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l limit] [-o ssh_option] [-P port] [-S program]
           [[user@]host1:]file1 ... [[user@]host2:]file2

所以它显然试图在没有密码的情况下执行 scp。我该如何解决这个问题?

4

5 回答 5

5

虽然您可以使用 expect 或其他东西从命令行调用 scp,但如果可能的话,最好使用库。

开发时的一般规则是尽可能选择库而不是系统执行。它使您的代码更清洁、更便携。例外情况是,如果您正在编写 shell 脚本。

http://www.libssh2.org/

libssh2 是一个免费的 C 库,支持密码验证以及 SCP/SFTP 并支持 OS X。

http://curl.haxx.se/libcurl/

libcurl 支持几乎所有你想要的文件传输类型,几乎可以在你想要的每一个平台上工作,并且几乎所有你想要的语言都有绑定。

于 2013-09-23T20:01:08.790 回答
1

简短的回答,我知道,但是您通常会使用Expect 之类的东西来以这种方式自动化交互式应用程序。

于 2013-09-22T17:46:21.533 回答
0

在我看来,您正在打印的输出来自不正确的命令语法。根据 execl 的手册页(至少在 Arch Linux 上):

execl()、execlp() 和 execle() 函数中的 const char *arg 和后续省略号可被视为 arg0、arg1、...、argn。

所以看起来正确的称呼方式是:

execl("/usr/bin/scp", "scp", "myfile.txt", "home@127.0.0.1:/Users/home/scpdir");

此外,如果您想避免完全输入密码,可以使用绕过密码的“授权密钥”配置 SSH(建立在 scp 之上)。不过,它可能仍会询问未知的密钥指纹。设置无密码 scp 访问的一种简单方法是运行(从启动 scp 的计算机):

ssh-copy-id home@127.0.0.1

上面的命令将要求输入一次密码,您不需要在后续的 ssh 操作中再次输入密码。

于 2013-09-23T19:57:51.773 回答
0

以下代码适用于我:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    execl("/usr/bin/scp", "scp", "myfile.txt", "user@IP:path/to/file", (char *)0);
    return 0;
}
于 2018-08-13T07:56:14.277 回答
0

以下代码对我有用:

#include <stdio.h>
#include <unistd.h>

int main()
{

execl("/usr/bin/sshpass","sshpass","-p","typeYourPasswd","/usr/bin/scp", "scp", "/home/harekrishna/Downloads/LoRaModule/ArduinoWithMeterCode/dlmsLoraV1.ino", "harekrishna@172.29.118.18:/home/harekrishna",(char *)0);
 
    return 0;
}
于 2021-08-18T12:02:14.150 回答