Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(SQL Server) SSH -- Running Commands that Prompt for Additional Input, such as "su"Demonstrates how to run a shell command via SSH where the shell command prompts for additional input from the client. This example demonstrates "su".
// Important: See this note about string length limitations for strings returned by sp_OAMethod calls. // CREATE PROCEDURE ChilkatSample AS BEGIN DECLARE @hr int DECLARE @sTmp0 nvarchar(4000) -- 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_9_5_0.Ssh', @ssh OUT IF @hr <> 0 BEGIN PRINT 'Failed to create ActiveX component' RETURN END -- Hostname may be an IP address or hostname: DECLARE @hostname nvarchar(4000) SELECT @hostname = '172.16.16.46' DECLARE @port int SELECT @port = 22 DECLARE @success int EXEC sp_OAMethod @ssh, 'Connect', @success OUT, @hostname, @port IF @success <> 1 BEGIN EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @ssh RETURN END -- If receiving output from a command stalls for more than 5 seconds, then stop waiting. EXEC sp_OASetProperty @ssh, 'IdleTimeoutMs', 5000 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 -- Open a session channel. 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 -- Request a pseudo-terminal DECLARE @termType nvarchar(4000) SELECT @termType = 'dumb' DECLARE @widthInChars int SELECT @widthInChars = 120 DECLARE @heightInChars int SELECT @heightInChars = 40 DECLARE @pixWidth int SELECT @pixWidth = 0 DECLARE @pixHeight int SELECT @pixHeight = 0 EXEC sp_OAMethod @ssh, 'SendReqPty', @success OUT, @channelNum, @termType, @widthInChars, @heightInChars, @pixWidth, @pixHeight IF @success <> 1 BEGIN EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @ssh RETURN END -- Start a shell on the channel: EXEC sp_OAMethod @ssh, 'SendReqShell', @success OUT, @channelNum IF @success <> 1 BEGIN EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @ssh RETURN END -- Send the su command. -- (The SSH server I'm using for testing is a Linux Ubuntu -- system running OpenSSH. It is important in this case to send a bare-LF -- and not a CRLF.) DECLARE @cmd nvarchar(4000) SELECT @cmd = 'su' + CHAR(10) EXEC sp_OAMethod @ssh, 'ChannelSendString', @success OUT, @channelNum, @cmd, 'ansi' IF @success <> 1 BEGIN EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @ssh RETURN END -- Read until we get the prompt for the password: EXEC sp_OAMethod @ssh, 'ChannelReceiveUntilMatch', @success OUT, @channelNum, 'Password:', 'ansi', 1 IF @success <> 1 BEGIN EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @ssh RETURN END -- Display what we've received so far: EXEC sp_OAMethod @ssh, 'GetReceivedText', @sTmp0 OUT, @channelNum, 'ansi' PRINT @sTmp0 -- Send the password. (This is the equivalent of typing at the shell prompt.) -- Again, make sure it uses a bare-LF and not a CRLF. DECLARE @password nvarchar(4000) SELECT @password = 'myPassword' + CHAR(10) EXEC sp_OAMethod @ssh, 'ChannelSendString', @success OUT, @channelNum, @password, 'ansi' IF @success <> 1 BEGIN EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @ssh RETURN END -- Read the response until we get the shell prompt (assuming it's successful) -- In my case, the shell prompt is: "chilkat@vivoMini64:~$ " DECLARE @myShellPrompt nvarchar(4000) SELECT @myShellPrompt = 'chilkat@vivoMini64:~$' -- It will be different in your case. EXEC sp_OAMethod @ssh, 'ChannelReceiveUntilMatch', @success OUT, @channelNum, @myShellPrompt, 'ansi', 1 IF @success <> 1 BEGIN -- Check the last-error information and the session log... EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 -- Check to see what was received. EXEC sp_OAMethod @ssh, 'GetReceivedText', @sTmp0 OUT, @channelNum, 'ansi' PRINT @sTmp0 EXEC @hr = sp_OADestroy @ssh RETURN END -- Display what we've received so far. This clears -- the internal receive buffer, which is important. -- After we send the command, we'll be reading until -- the next command prompt. If the command prompt -- is already in the internal receive buffer, we'll think we're -- already finished... EXEC sp_OAMethod @ssh, 'GetReceivedText', @sTmp0 OUT, @channelNum, 'ansi' PRINT @sTmp0 -- Send a command. In this case, we are sending the "ls" command: SELECT @cmd = 'ls' + CHAR(10) EXEC sp_OAMethod @ssh, 'ChannelSendString', @success OUT, @channelNum, @cmd, 'ansi' IF @success <> 1 BEGIN EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @ssh RETURN END -- Read until the next command prompt: EXEC sp_OAMethod @ssh, 'ChannelReceiveUntilMatch', @success OUT, @channelNum, @myShellPrompt, 'ansi', 1 IF @success <> 1 BEGIN -- Check the last-error information and the session log... EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 -- Check to see what was received. EXEC sp_OAMethod @ssh, 'GetReceivedText', @sTmp0 OUT, @channelNum, 'ansi' PRINT @sTmp0 EXEC @hr = sp_OADestroy @ssh RETURN END -- Display the command output: EXEC sp_OAMethod @ssh, 'GetReceivedText', @sTmp0 OUT, @channelNum, 'ansi' PRINT @sTmp0 -- You may continue sending additional commands. -- The technique is: send the command, read until the next command prompt, -- and then fetch/clear the internal receive buffer. -- We're done, so shut it down.. -- Send an EOF. This tells the server that no more data will -- be sent on this channel. The channel remains open, and -- the SSH client may still receive output on this channel. EXEC sp_OAMethod @ssh, 'ChannelSendEof', @success OUT, @channelNum IF @success <> 1 BEGIN EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @ssh RETURN END -- Close the channel: EXEC sp_OAMethod @ssh, 'ChannelSendClose', @success OUT, @channelNum IF @success <> 1 BEGIN EXEC sp_OAGetProperty @ssh, 'LastErrorText', @sTmp0 OUT PRINT @sTmp0 EXEC @hr = sp_OADestroy @ssh RETURN END -- Disconnect EXEC sp_OAMethod @ssh, 'Disconnect', NULL EXEC @hr = sp_OADestroy @ssh END GO |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.