当我使用popen()运行ssh时,如何获取ssh命令的返回状态?

时间:2016-08-20 14:01:40

标签: linux ssh pipe popen portforwarding

我缩进创建反向ssh tunnel / ssh端口转发机制。

这是实际的反向ssh命令:

ssh -fN -R  101:localhost:22 computer@123.123.0.27 -p 2320

我需要使用popen()从我的C api运行此命令,我的实现方式如下。

注意:系统的公共&私钥已经共享,即无需提供密码。

int create_tunnel (void)
{
  FILE *fptr_ssh = NULL;
  char sshcmd[100] = {0};
  char response[100] = {0};


  sprintf(sshcmd, "ssh -fN -R  101:localhost:22 computer@123.123.0.27 -p 2320");

  fptr_ssh = popen(sshcmd, "r"); /* Executing ssh */

  if(NULL == fptr_ssh) {
      perror("popen failed");

      return -1;
  }

  /* Getting message from fp */
  if(!fgets(response, (sizeof(response)-1), fptr_ssh)) {
       perror("fgets failed");

       return -1;
  }
  printf("Msg: %s\n", response); 

  pclose(fptr_ssh);

  return 0;
}

成功案例:如果一切顺利,端口转发将成功没问题。

在失败案例中:考虑以下示例: 如果没有连接后续消息将显示在stdout(终端)中。

ssh: connect to host 123.123.0.27 port 2320: Network is unreachable

但我无法从文件指针fptr_ssh中获取C api / fgets()中的任何信息。

它返回成功,没有来自fgets的消息。

fgets failed: Success

0 个答案:

没有答案