mirror of
https://github.com/tmate-io/tmate.git
synced 2024-11-30 12:04:38 +01:00
95 lines
2.3 KiB
Plaintext
95 lines
2.3 KiB
Plaintext
/**
|
|
@page libssh_tutor_command Chapter 4: Passing a remote command
|
|
@section remote_command Passing a remote command
|
|
|
|
Previous chapter has shown how to open a full shell session, with an attached
|
|
terminal or not. If you only need to execute a command on the remote end,
|
|
you don't need all that complexity.
|
|
|
|
The method described here is suited for executing only one remote command.
|
|
If you need to issue several commands in a row, you should consider using
|
|
a non-interactive remote shell, as explained in previous chapter.
|
|
|
|
@see shell
|
|
|
|
|
|
@subsection exec_remote Executing a remote command
|
|
|
|
The first steps for executing a remote command are identical to those
|
|
for opening remote shells. You first need a SSH channel, and then
|
|
a SSH session that uses this channel:
|
|
|
|
@code
|
|
int show_remote_files(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;
|
|
}
|
|
@endcode
|
|
|
|
Once a session is open, you can start the remote command with
|
|
ssh_channel_request_exec():
|
|
|
|
@code
|
|
rc = ssh_channel_request_exec(channel, "ls -l");
|
|
if (rc != SSH_OK)
|
|
{
|
|
ssh_channel_close(channel);
|
|
ssh_channel_free(channel);
|
|
return rc;
|
|
}
|
|
@endcode
|
|
|
|
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:
|
|
|
|
@code
|
|
char buffer[256];
|
|
unsigned 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;
|
|
}
|
|
@endcode
|
|
|
|
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:
|
|
|
|
@code
|
|
ssh_channel_send_eof(channel);
|
|
ssh_channel_close(channel);
|
|
ssh_channel_free(channel);
|
|
|
|
return SSH_OK;
|
|
}
|
|
@endcode
|
|
|
|
*/
|