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