Глава 4: Передача удаленно команды


В предыдущей главе было показано как открывать полноценную сессию командной оболочки с присоединенным терминалом и без. Если же необходимо выполнять удаленно команду, то в таких сложностях нет необходимости.

Описываемый здесь метод пригоден лишь для исполнения удаленно одной единственной команды. В случае, если необходимо выдавать несколько команд одной строкой, следует задуматься об использовании удаленно не-интерактивной командной оболочки как объяснялось в предыдущей главе.

Смотри так же
Открытие терминала удаленно

Исполнение команды удаленно

Первым шагом при выполнении команды удаленно будет идентификация того, что удаленно открыта командная оболочка. Поэтому первым необходим канал SSH, а затем сессия SSH, которая использует этот канал:

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;
}

После открытие сессии, необходимо запустить удаленно команду с помощью ssh_channel_request_exec().

rc = ssh_channel_request_exec(channel, "ls -l");
if (rc != SSH_OK)
{
ssh_channel_close(channel);
ssh_channel_free(channel);
return rc;
}

Если исполняемая удаленно команда выводит данные, получить их можно с ssh_channel_read(). Эта функция возвращает прочитанное количество байт. Если данных для чтения нет, она вернет 0. Если же встретились ошибки, она вернет отрицательное значение:

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;
}

После того, как будет прочитан результат выполнения удаленно команды, необходимо каналу отправить символ конца файла, закрыть его и освободить память, используемую им:

ssh_channel_send_eof(channel);
ssh_channel_close(channel);
ssh_channel_free(channel);
 
return SSH_OK;
}

 

  
Вернуться к содержанию

 

Сайт создан в системе uCoz