private void CreateChannel() { this._channel = this._session.CreateChannel <ChannelSession>(); this._channel.DataReceived += Channel_DataReceived; this._channel.ExtendedDataReceived += Channel_ExtendedDataReceived; this._channel.RequestReceived += Channel_RequestReceived; this._channel.Closed += Channel_Closed; // Dispose of streams if already exists if (this.OutputStream != null) { this.OutputStream.Dispose(); this.OutputStream = null; } if (this.ExtendedOutputStream != null) { this.ExtendedOutputStream.Dispose(); this.ExtendedOutputStream = null; } // Initialize output streams and StringBuilders this.OutputStream = new PipeStream(); this.ExtendedOutputStream = new PipeStream(); this.InputStream = new MemoryStream(); this.ExecuteThread(_channel.GetReaderAction(_bufferSize, InputStream, e => { }, new AutoResetEvent(false))); this._result = null; this._error = null; }
/// <summary> /// Starts this shell. /// </summary> /// <exception cref="SshException">Shell is started.</exception> public void Start() { if (this.IsStarted) { throw new SshException("Shell is started."); } if (this.Starting != null) { this.Starting(this, new EventArgs()); } this._channel = this._session.CreateChannel <ChannelSession>(); this._channel.DataReceived += Channel_DataReceived; this._channel.ExtendedDataReceived += Channel_ExtendedDataReceived; this._channel.Closed += Channel_Closed; this._session.Disconnected += Session_Disconnected; this._session.ErrorOccured += Session_ErrorOccured; this._channel.Open(); // TODO: Terminal mode is ignored as this functionality will be obsolete this._channel.SendPseudoTerminalRequest(this._terminalName, this._columns, this._rows, this._width, this._height); this._channel.SendShellRequest(); this._channelClosedWaitHandle = new AutoResetEvent(false); // Start input stream listener this._dataReaderTaskCompleted = new ManualResetEvent(false); this.ExecuteThread(_channel.GetReaderAction(_bufferSize, _input, RaiseError, _dataReaderTaskCompleted)); this.IsStarted = true; if (this.Started != null) { this.Started(this, new EventArgs()); } }