Как я могу напечатать переменную из другой функции? - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь сделать удаленную команду ssh с частью кода, основанного на примерах libssh, и я пытаюсь напечатать вывод за пределами выполняемой функции, как это в int main();

printf("Server output: %s", nbytes);
int exec_uname(ssh_session session) {

  ssh_channel channel;
  int rc;
  channel = ssh_channel_new(session);
  if (channel == NULL) return SSH_ERROR;
  rc = ssh_channel_open_session(channel);
  if (rc != SSH_OK) {
    ssh_channel_free(channel);
    return rc;
  }
  //Once a session is open, you can start the remote command with ssh_channel_request_exec():

  rc = ssh_channel_request_exec(channel, "uname -a");
  if (rc != SSH_OK) {
    ssh_channel_close(channel);
    ssh_channel_free(channel);
    return rc;
  }
  //If the remote command displays data, you get them with ssh_channel_read(). This function returns the number of bytes read. If there is no more data to read on the channel, this function returns 0, and you can go to next step. If an error has been encountered, it returns a negative value:
  char buffer[256];
  int nbytes;
  nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
  while (nbytes > 0) {
    if (fwrite(buffer, 1, nbytes, stdout) != nbytes) {
      ssh_channel_close(channel);
      ssh_channel_free(channel);
      return SSH_ERROR;
    }
    nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
  }
  if (nbytes < 0) {
    ssh_channel_close(channel);
    ssh_channel_free(channel);
    return SSH_ERROR;
  }
  //Once you read the result of the remote command, you send an end-of-file to the channel, close it, and free the memory that it used:
  ssh_channel_send_eof(channel);
  ssh_channel_close(channel);
  ssh_channel_free(channel);
  return SSH_OK;
}

1 Ответ

1 голос
/ 20 апреля 2019

Вы не можете получить доступ к локальной переменной вне функции. Вы либо объявляете это в более широкой области, такой как global, которая является последним средством, либо передаете ее для заполнения.

Например:

int exec_uname(ssh_session session, int* bytes) {
  // ... code

  // Push back to caller
  *bytes = nbytes;
}

Так, когда называется:

int nbytes;
int result = exec_uname(session, &nbytes);
printf("Server output: %d", nbytes);

Вам все равно нужно будет проверить result, чтобы убедиться, что функция завершена правильно, иначе значение в nbytes не будет использоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...