SQL Server
SQL Server
Read Data from an SSH Channel
See more SSH Examples
Demonstrates the Chilkat Ssh.ChannelRead method, which reads incoming SSH channel messages. The only argument is the channel number; the ReadTimeoutMs property limits how long it waits. Received data is appended to the channel's receive buffer, then retrieved with a GetReceived... method.
The integer return value is -1 on error, -2 if nothing arrived before the timeout, 0 if EOF or channel close was processed, or — when greater than 0 — the total bytes currently buffered for the channel (not the bytes newly received by this call).
Background: SSH reading is a two-step pattern that trips people up at first: the
Channel* read/poll methods move bytes from the network into an internal per-channel buffer, and a separate GetReceived... call hands that buffer to your code. A positive return is therefore a buffer total, not a count of what this call fetched. Note that a 0 return means EOF or close — buffered data can still remain and should be drained.Chilkat SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
DECLARE @iTmp0 int
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- Demonstrates the Ssh.ChannelRead method, which reads incoming SSH channel messages. The only
-- argument is the channel number. The ReadTimeoutMs property limits how long it waits.
DECLARE @ssh int
EXEC @hr = sp_OACreate 'Chilkat.Ssh', @ssh OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
DECLARE @sshPort int
SELECT @sshPort = 22
EXEC sp_OAMethod @ssh, 'Connect', @success OUT, 'ssh.example.com', @sshPort
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
-- Normally you would not hard-code the password in source. You should instead obtain it
-- from an interactive prompt, environment variable, or a secrets vault.
DECLARE @password nvarchar(4000)
SELECT @password = 'mySshPassword'
EXEC sp_OAMethod @ssh, 'AuthenticatePw', @success OUT, 'mySshLogin', @password
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
DECLARE @channelNum int
EXEC sp_OAMethod @ssh, 'OpenSessionChannel', @channelNum OUT
IF @channelNum < 0
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
-- Start a shell WITHOUT requesting a PTY. Without a PTY the shell sees it is connected to a
-- raw data pipe and enters non-interactive mode: it suppresses the command prompt, does not
-- echo typed commands back, and skips interactive login scripts. The output is therefore
-- clean and easily parseable -- but because no prompt is ever sent, code must not wait for
-- one. Instead, have each command print a predictable marker, or wait for EOF / channel close.
EXEC sp_OAMethod @ssh, 'SendReqShell', @success OUT, @channelNum
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
EXEC sp_OAMethod @ssh, 'ChannelSendString', @success OUT, @channelNum, 'uname -a' + CHAR(10), 'utf-8'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
-- The return value is: -1 on error, -2 if nothing arrived before the timeout, 0 if EOF or
-- channel close was processed, or the total number of buffered bytes when greater than 0.
DECLARE @result int
EXEC sp_OAMethod @ssh, 'ChannelRead', @result OUT, @channelNum
IF @result = -1
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
IF @result = -2
BEGIN
PRINT 'No channel data arrived before the timeout.'
END
IF @result = 0
BEGIN
PRINT 'EOF or channel close was processed. Buffered data may still remain.'
END
IF @result > 0
BEGIN
PRINT 'Total bytes buffered: ' + @result
END
DECLARE @output nvarchar(4000)
EXEC sp_OAMethod @ssh, 'GetReceivedText', @output OUT, @channelNum, 'utf-8'
EXEC sp_OAGetProperty @ssh, 'LastMethodSuccess', @iTmp0 OUT
IF @iTmp0 = 0
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
PRINT @output
EXEC sp_OAMethod @ssh, 'Disconnect', NULL
EXEC @hr = sp_OADestroy @ssh
END
GO