【问题标题】:C program waits for the execution of the command sent with SSHC 程序等待执行 SSH 发送的命令
【发布时间】:2018-07-10 06:15:33
【问题描述】:

我正在尝试通过 SSH 将命令发送到需要通过串行端口进行通信的远程系统。当我发送一个立即执行的命令时,一切正常,但是当我向运行我的程序的客户端发送一个命令时,该程序挂起并等待串行数据,我的其余 c 代码没有执行。我的代码如下所示。

 FILE* remf = popen("ssh DestinationPC > remoteoutput.txt", "w");
 if (!remf) { perror("popen ssh failed"); exit(EXIT_FAILURE); };
 fprintf(remf, "./IOexpander \n");
 fprintf(remf, "./Serial \n");
 fclose(remf);

第一行 (./IOexpander) 工作正常并打开一些 LED。没有第二行,执行继续。但是当我添加第二行时(当我尝试运行任何不会立即终止的程序时),上面代码下面的行不会被执行。

如何在不等待客户端执行命令的情况下运行我的 c 程序? 在此先感谢:)

【问题讨论】:

  • 可能是错误的方法。考虑改用libssh
  • popen 是双向 IO 的错误方法。 remoteoutput.txt 的输出可能会以您无法控制的方式进行缓冲。给 ssh 命令行开关以强制分配给伪终端 might 帮助。此外,您可能还想捕获 stderr 输出并查看是否在那里打印了某些内容。但要使其健壮,您将需要 ssh 进程 stdinstdoutstderr 的文件描述符,并且使用select/poll 同时访问它们。除非这是学习练习,否则请按照建议使用库。

标签: c linux ssh


【解决方案1】:

由于代码有多个脚本执行,它可能通过运行 ssh 到盒子并执行脚本来帮助排除脚本错误。

$ ssh user@hostname "./IOexpander && ./Serial \n"

【讨论】:

    【解决方案2】:

    stdout 被缓冲(参见setvbuf(3) & stdio(3)),因此可能是分叉的ssh 进程的标准输入(参见popen(3)

    您可能应该以\n 结束您的fprintf 格式控制字符串。

    您当然应该在适当的地方明智地使用fflush(3)

    顺便说一句,我建议避免使用popen-ing 一些ssh 并改用libssh

    也许你的遥控器 ./Serial 不知何故失败了。你应该检查一下。您当前的方法不能很好地处理远程程序的失败。

    【讨论】:

    • 是的,我实际上使用了 \n 但忘记在此处添加。我也用 fflush() 尝试过,但没有用。可能我应该检查 libssh。谢谢!
    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多