Sample code for 30+ languages & platforms
SQL Server

Read an SSH Channel with a Byte Threshold

See more SSH Examples

Demonstrates the Chilkat Ssh.ChannelReadAndPoll2 method, which works like ChannelReadAndPoll but also returns once newly processed data brings the total buffered data to or above a byte threshold. The arguments are the channel number, the poll timeout, and the threshold.

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: The threshold makes it practical to stream large output in manageable chunks instead of buffering an entire multi-megabyte result. Treat it as a return threshold, not a hard cap: a complete SSH packet is buffered as a unit, so the amount returned can exceed what you asked for. Data already buffered before the call does not by itself trigger an immediate return.

Chilkat SQL Server Downloads

SQL Server
-- 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.ChannelReadAndPoll2 method, which works like ChannelReadAndPoll but also
    --  returns once the total buffered data reaches or exceeds a byte threshold.  The 1st argument is
    --  the channel number, the 2nd is the poll timeout, and the 3rd is the byte threshold.

    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, 'cat /var/log/syslog' + CHAR(10), 'utf-8'
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @ssh
        RETURN
      END

    --  Return when output goes quiet for 500ms, or once about 64KB has been buffered.  The
    --  threshold is not a hard buffer limit -- a whole SSH packet may push the total above it.
    DECLARE @pollTimeoutMs int
    SELECT @pollTimeoutMs = 500
    DECLARE @maxNumBytes int
    SELECT @maxNumBytes = 65536
    --  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, 'ChannelReadAndPoll2', @result OUT, @channelNum, @pollTimeoutMs, @maxNumBytes
    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