Пользовательские команды с libssh

Я использую SSH для связи с сервером condor и мне нужно вызывать команды для настраиваемого управления (т.е. condor_submit, condor_make, condor_q, так далее.). Скачав и успешно интегрировав libSSH в мой проект XCode (да, я использую Mac OS), я обнаружил, что предоставленные функции не поддерживают пользовательские команды. Учебник заявил, что это будет выполнять команды на хосте:


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

Источник

Тем не менее, когда я заменяю "ls -l" с скажем "condor_q"команда, кажется, не выполняется. Мне удалось это исправить с помощью интерактивного сеанса оболочки следующим образом:


// Create channel

rc = ssh_channel_request_pty(channel);
if (rc != SSH_OK) return rc;
rc = ssh_channel_change_pty_size(channel, 84, 20);
if (rc != SSH_OK) return rc;
rc = ssh_channel_request_shell(channel);

std::string commandString = "condor_q";
char buffer[512];
int bytesRead, bytesWrittenToConsole;
std::string string;

while (ssh_channel_is_open(channel) && !ssh_channel_is_eof(channel)) {
// _nonblocking
bytesRead = ssh_channel_read_nonblocking(channel, buffer, sizeof(buffer), 0);
if (bytesRead < 0) {
rc = SSH_ERROR;
break;
}
if (bytesRead > 0) {
for (int i = 0; i < bytesRead; i++) {
string.push_back(buffer[i]);
}
bytesWrittenToConsole = write(1, buffer, bytesRead);
if (string.find("$") != std::string::npos) {

if (commandString.length() > 0) {
ssh_channel_write(channel, commandString.c_str(), commandString.length());
ssh_channel_write(channel, "\n", 1);
} else {
break;
}
commandString.clear();
string.clear();
}
}
}

// Distroy channel

Итак, мой вопрос, есть ли более простой способ отправить обычай команды через SSH, а не «поддельный отправить» команда?

Спасибо

Максимум

0

Решение

Пользовательские команды обычно выгружаются в буфер stderr.

По этой причине, если вы используете пользовательские команды, попробуйте использовать чтение канала следующим образом:

rc = ssh_channel_read(channel, buffer, sizeof(buffer), 1);

Обратите внимание на изменение 0 -> 1 в последнем атрибуте функции. Этот атрибут указывает чтение для чтения из stderr на канале, где вместо этого может быть сброшена некоторая информация.

Попробуйте это.

0

Другие решения

rc = ssh_channel_request_exec (канал, «ls -l»);

Код успешного возврата говорит вам, что команда была успешно отправлена ​​на сервер, но не была успешно выполнена. Вам нужно подождать и проверить код выхода или дождаться вывода.

Вы читали:

http://api.libssh.org/stable/libssh_tutor_command.html

и посмотрите примеры / exec.c в исходном коде?

-2