4

たとえば、1 つのセッションと 1 つのチャネルを開き、さまざまなコマンドを実行したいとします。InitializeSSHSession と Initialize SSH channel メソッドを以下に示します。

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

そして主に、私はセッションを初期化し、次のようなチャネルを取得しています:

 InitializeSSHSession();
 ssh_channel channel = GetSSHChannel(); 

その後

  int rc = ssh_channel_request_exec(channel, "ls -l");

正しく実行されても問題ありませんが、実行されていない別のコマンドを実行したい場合は、プロセスの最初に戻り、最初にセッションを初期化し、チャネルを再度取得する必要があります。

すべてのコマンドに適したソリューションではありません。すべてのコマンドに対して何度も何度も使用するよりも、一度セッションを初期化することは可能ですか?

4

0 に答える 0