SQL Server
SQL Server
SSH to Cisco Switch - Processing "More" Responses
See more SSH Examples
Demonstrates connecting to a Cisco switch, running a command to enable privileged mode, then running a command to get a paged response requiring the SPACE char to be sent to process "--More--".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
-- Important: Do not use nvarchar(max). See the warning about using nvarchar(max).
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- This example assumes the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.
DECLARE @ssh int
EXEC @hr = sp_OACreate 'Chilkat.Ssh', @ssh OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
EXEC sp_OAMethod @ssh, 'Connect', @success OUT, 'SSH_SERVER_DOMAIN_OR_IP_ADDRESS', 22
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
-- Authenticate using login/password:
EXEC sp_OAMethod @ssh, 'AuthenticatePw', @success OUT, 'myLogin', 'myPassword'
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
-- Start a shell session.
DECLARE @channelNum int
EXEC sp_OAMethod @ssh, 'QuickShell', @channelNum OUT
IF @channelNum < 0
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
-- If the CISCO switch returns a prompt with ">", then read until we get the prompt.
-- (It's not actually required that we do this, but it helps to know that all is OK at this point..)
EXEC sp_OAMethod @ssh, 'ChannelReceiveUntilMatch', @success OUT, @channelNum, '>', 'utf-8', 1
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
-- Show what we received so far:
EXEC sp_OAMethod @ssh, 'GetReceivedText', @sTmp0 OUT, @channelNum, 'utf-8'
PRINT @sTmp0
-- Send the "ena" command to enable privileged mode.
-- (For the Cisco switch, terminate command with a single CR char.)
EXEC sp_OAMethod @ssh, 'ChannelSendString', @success OUT, @channelNum, 'ena' + CHAR(13), 'utf-8'
-- Assume success for this example to make it shorter..
-- Read to the "Password:" prompt.
EXEC sp_OAMethod @ssh, 'ChannelReceiveUntilMatch', @success OUT, @channelNum, 'Password:', 'utf-8', 1
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
-- Show what we received...
EXEC sp_OAMethod @ssh, 'GetReceivedText', @sTmp0 OUT, @channelNum, 'utf-8'
PRINT @sTmp0
-- Send the password.
EXEC sp_OAMethod @ssh, 'ChannelSendString', @success OUT, @channelNum, 'MY_PASSWORD_FOR_ELEVATED_PRIVILEGE' + CHAR(13), 'utf-8'
-- The prompt now changes from "Something>" to "Something#>
-- Read until the new prompt..
EXEC sp_OAMethod @ssh, 'ChannelReceiveUntilMatch', @success OUT, @channelNum, '#', 'utf-8', 1
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
RETURN
END
-- Show what we received...
EXEC sp_OAMethod @ssh, 'GetReceivedText', @sTmp0 OUT, @channelNum, 'utf-8'
PRINT @sTmp0
-- Send the "show running-config" command.
-- The response will be in multiple pages, each ending with "--More--" and requiring a SPACE bar to be sent
-- to get the next page.
EXEC sp_OAMethod @ssh, 'ChannelSendString', @success OUT, @channelNum, 'show running-config' + CHAR(13), 'utf-8'
-- Consume the response until we end with another prompt.
DECLARE @saMatch int
EXEC @hr = sp_OACreate 'Chilkat.StringArray', @saMatch OUT
-- Change "YOUR_PROMPT" to your actual prompt. We don't want to check for only "#" because
-- it's not specific enough. The data in the response could contain the "#" char...
EXEC sp_OAMethod @saMatch, 'Append', @success OUT, 'YOUR_PROMPT#'
EXEC sp_OAMethod @saMatch, 'Append', @success OUT, '--More--'
DECLARE @sbReceived int
EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbReceived OUT
DECLARE @moreComing int
SELECT @moreComing = 1
WHILE (@moreComing = 1)
BEGIN
EXEC sp_OAMethod @ssh, 'ChannelReceiveUntilMatchN', @success OUT, @channelNum, @saMatch, 'utf-8', 1
IF @success <> 1
BEGIN
EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @ssh
EXEC @hr = sp_OADestroy @saMatch
EXEC @hr = sp_OADestroy @sbReceived
RETURN
END
SELECT @moreComing = 0
EXEC sp_OAMethod @sbReceived, 'Clear', NULL
EXEC sp_OAMethod @ssh, 'GetReceivedText', @sTmp0 OUT, @channelNum, 'utf-8'
EXEC sp_OAMethod @sbReceived, 'Append', @success OUT, @sTmp0
EXEC sp_OAMethod @sbReceived, 'GetAsString', @sTmp0 OUT
PRINT @sTmp0
EXEC sp_OAMethod @sbReceived, 'Contains', @iTmp0 OUT, '--More--', 1
IF @iTmp0 = 1
BEGIN
SELECT @moreComing = 1
-- Send a SPACE char just as if we were interactively pressing the SPACE key to get more output.
EXEC sp_OAMethod @ssh, 'ChannelSendString', @success OUT, @channelNum, ' ', 'utf-8'
END
END
EXEC sp_OAMethod @ssh, 'Disconnect', NULL
EXEC @hr = sp_OADestroy @ssh
EXEC @hr = sp_OADestroy @saMatch
EXEC @hr = sp_OADestroy @sbReceived
END
GO