Emr*_*reS 5 c++ channel libssh
例如,我想打开一个会话和一个通道,然后执行多个不同的命令。我有InitializeSSHSession 和Initialize SSH 通道方法,如下所示。
void Computer::InitializeSSHSession()
{
ssh_session remoteSSHSession = ssh_new();
if ( remoteSSHSession )
{
QString password = this->GetPassword();
QString remoteIP = this->GetIP();
QString userName = this->GetUserNameW();
ssh_options_set(remoteSSHSession, SSH_OPTIONS_HOST, remoteIP.toStdString().c_str());
ssh_options_set(remoteSSHSession, SSH_OPTIONS_LOG_VERBOSITY, &sessionVerbosity);
ssh_options_set(remoteSSHSession, SSH_OPTIONS_PORT, &sessionPort);
ssh_options_set(remoteSSHSession, SSH_OPTIONS_USER, userName.toStdString().c_str());
int remoteConnection = ssh_connect(remoteSSHSession);
if ( remoteConnection == SSH_OK )
{
int authenticateControl = ssh_userauth_password(remoteSSHSession, NULL, password.toStdString().c_str());
if ( authenticateControl == SSH_AUTH_SUCCESS )
{
InitializeSSHChannel(remoteSSHSession);
}
else
{
remoteSSHSession = NULL;
}
}
else
{
remoteSSHSession = NULL;
}
}
else
{
remoteSSHChannel = NULL;
}
}
void Computer::InitializeSSHChannel(ssh_session remoteSSHSession)
{
remoteSSHChannel = ssh_channel_new(remoteSSHSession);
if ( remoteSSHChannel )
{
int channelControl = ssh_channel_open_session(remoteSSHChannel);
if ( channelControl != SSH_OK )
{
EventLogger::LogMessage(true, "SSH channel sesssion failed!");
ssh_channel_free(remoteSSHChannel);
}
}
}
Run Code Online (Sandbox Code Playgroud)
总的来说,我正在初始化会话并获取这样的频道:
InitializeSSHSession();
ssh_channel channel = GetSSHChannel();
Run Code Online (Sandbox Code Playgroud)
进而
int rc = ssh_channel_request_exec(channel, "ls -l");
Run Code Online (Sandbox Code Playgroud)
没关系,它可以正确执行,但是当我想执行另一个命令时,它没有执行,我应该返回进程的开头,首先初始化会话并再次获取通道。
这并不是适用于每个命令的好解决方案。是否可以在初始化会话后执行此操作,而不是对每个命令一次又一次地使用它?
小智 0
根据 LibSSH 文档,ssh_channel_request_exec() 命令每个通道只能使用一次(不知道为什么他们会做出这种设计选择)。所以是的,您必须打开一个全新的会话(我尝试过使用同一会话创建新频道,这似乎也不起作用),然后创建一个新频道。
执行此操作的替代方法(以及对我有用的方法)是打开一个 shell(遵循他们的教程 #3 https://api.libssh.org/stable/libssh_tutor_shell.html#opening_shell)。它需要一些额外的步骤,但这允许您发送更多命令。但是,请记住在每个命令的末尾添加换行符(“\n”),否则这些命令将不会被执行。