【发布时间】:2011-01-13 14:08:03
【问题描述】:
谁能给我一个简单的 c 语言示例,使用 pipe() 系统调用和使用 ssh 连接到远程服务器并执行简单的 ls 命令并解析回复。提前谢谢,..
【问题讨论】:
-
您可能想更新有关 pipe&ssh 的问题。
-
他们可能可以。但这将是两个不同的例子——一个用于 pipe(),另一个用于 ssh()。
谁能给我一个简单的 c 语言示例,使用 pipe() 系统调用和使用 ssh 连接到远程服务器并执行简单的 ls 命令并解析回复。提前谢谢,..
【问题讨论】:
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;
}
}
注意:该示例不解析来自ls 的输出,因为任何程序都不应该这样做。当文件名包含空格时,它是不可靠的。
【讨论】:
FILE * 流中获得ls 输出,因此您可以对流执行任何操作,fseek 除外。
cd ,那么你必须将它传递给ssh 命令。即execlp("ssh", "ssh", host, "(cd 'DIR' && ls)", NULL); 查看exec(3) 和ssh(1),如果要从用户输入中获取DIR 参数,请注意shell 引用规则。