我使用SSH与神鹰服务器通信,需要调用命令进行自定义控制(即condor_submit
,condor_make
,condor_q
等。在我的Xcode项目中下载并成功集成了libSSH(是的,我使用的是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"
时,命令似乎没有执行。我设法使用像这样的交互式shell会话来解决这个问题:
// 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发送自定义命令,而不必使用“ fake-send ”命令?
由于
最高
答案 0 :(得分:0)
自定义命令通常会转储到stderr缓冲区。
因此,如果您使用自定义命令,请尝试使用通道读取,如下所示:
rc = ssh_channel_read(channel, buffer, sizeof(buffer), 1);
注意0 - &gt; 1更改最后一个函数属性。此属性告诉读取从通道上的stderr读取,而某些信息可能正在被转储。
尝试一下。
答案 1 :(得分:-2)
rc = ssh_channel_request_exec(channel,“ls -l”);
成功返回代码告诉您该命令已成功发送到服务器,但未成功执行。您需要等待并检查退出代码或等待输出。
你读过:
http://api.libssh.org/stable/libssh_tutor_command.html
并查看源代码中的examples / exec.c?