Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 管道系统调用_C_Ssh_Posix_Pipe - Fatal编程技术网

C 管道系统调用

C 管道系统调用,c,ssh,posix,pipe,C,Ssh,Posix,Pipe,有人能给我举个c语言的简单例子,使用pipe()系统调用并使用ssh连接到远程服务器,执行一个简单的ls命令并解析回复。提前感谢,…创建了一对相互连接的文件描述符,一个用于读取,另一个用于写入。然后,您可以将流程分成两部分,并让他们通过这些描述符相互交谈 您不能使用管道(2)来“连接”到预先存在的进程 注意:该示例不解析来自ls的输出,因为任何程序都不应该这样做。当文件名包含空格时,这是不可靠的。您可能需要更新有关pipe和ssh的问题。他们可能可以。但这将是两个不同的示例—一个用于pipe()

有人能给我举个c语言的简单例子,使用pipe()系统调用并使用ssh连接到远程服务器,执行一个简单的ls命令并解析回复。提前感谢,…

创建了一对相互连接的文件描述符,一个用于读取,另一个用于写入。然后,您可以将流程分成两部分,并让他们通过这些描述符相互交谈

您不能使用
管道(2)
来“连接”到预先存在的进程


注意:该示例不解析来自
ls
的输出,因为任何程序都不应该这样做。当文件名包含空格时,这是不可靠的。

您可能需要更新有关pipe和ssh的问题。他们可能可以。但这将是两个不同的示例—一个用于pipe(),另一个用于ssh()。文件系统不包含空格。。无论如何,我可以使用输出来获取数据吗??我的意思是使用ls并将文件列表设置为结构、向量、列表或类似的东西???您将在
文件*
流中获得
ls
输出,因此您可以对流执行任何操作,除了
fseek
。非常感谢。它起作用了。如何更改多个命令的pgm?例如cd命令,然后是ls命令。如果我正确理解您希望在远程端执行
cd
,则必须将其传递给
ssh
命令。即,
execlp(“ssh”,“ssh”,host,”(cd'DIR'和&ls)”,NULL)
签出
exec(3)
ssh(1)
,如果要从用户输入获取
DIR
参数,请注意shell引用规则。
int main()
{
    const char host[] = "foo.example.com";  // assume same username on remote
    enum { READ = 0, WRITE = 1 };
    int c, fd[2];
    FILE *childstdout;

    if (pipe(fd) == -1
     || (childstdout = fdopen(fd[READ], "r")) == NULL) {
        perror("pipe() or fdopen() failed");
        return 1;
    }
    switch (fork()) {
      case 0:  // child
        close(fd[READ]);
        if (dup2(fd[WRITE], STDOUT_FILENO) != -1)
            execlp("ssh", "ssh", host, "ls", NULL);
        _exit(1);
      case -1: // error
        perror("fork() failed");
        return 1;
    }

    close(fd[WRITE]);
    // write remote ls output to stdout;
    while ((c = getc(childstdout)) != EOF)
        putchar(c);
    if (ferror(childstdout)) {
        perror("I/O error");
        return 1;
    }
}