Visual FoxPro
Visual FoxPro
SSH Remote Shell
See more SSH Examples
Demonstrates how to start a shell on a remote SSH server, run a command, and retrieve the output.Chilkat Visual FoxPro Downloads
LOCAL lnSuccess
LOCAL loSsh
LOCAL lcHostname
LOCAL lnPort
LOCAL lnChannelNum
LOCAL lcTermType
LOCAL lnWidthInChars
LOCAL lnHeightInChars
LOCAL lnPixWidth
LOCAL lnPixHeight
LOCAL n
LOCAL lnPollTimeoutMs
LOCAL lcCmdOutput
lnSuccess = 0
* This example assumes the Chilkat API to have been previously unlocked.
* See Global Unlock Sample for sample code.
loSsh = CreateObject('Chilkat.Ssh')
* Hostname may be an IP address or hostname:
lcHostname = "www.some-ssh-server.com"
lnPort = 22
* Connect to an SSH server:
lnSuccess = loSsh.Connect(lcHostname,lnPort)
IF (lnSuccess <> 1) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* Wait a max of 5 seconds when reading responses..
loSsh.IdleTimeoutMs = 5000
* Authenticate using login/password:
lnSuccess = loSsh.AuthenticatePw("myLogin","myPassword")
IF (lnSuccess <> 1) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* Open a session channel. (It is possible to have multiple
* session channels open simultaneously.)
lnChannelNum = loSsh.OpenSessionChannel()
IF (lnChannelNum < 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* Some SSH servers require a pseudo-terminal
* If so, include the call to SendReqPty. If not, then
* comment out the call to SendReqPty.
* Note: The 2nd argument of SendReqPty is the terminal type,
* which should be something like "xterm", "vt100", "dumb", etc.
* A "dumb" terminal is one that cannot process escape sequences.
* Smart terminals, such as "xterm", "vt100", etc. process
* escape sequences. If you select a type of smart terminal,
* your application will receive these escape sequences
* included in the command's output. Use "dumb" if you do not
* want to receive escape sequences. (Assuming your SSH
* server recognizes "dumb" as a standard dumb terminal.)
lcTermType = "dumb"
lnWidthInChars = 120
lnHeightInChars = 40
* Use 0 for pixWidth and pixHeight when the dimensions
* are set in number-of-chars.
lnPixWidth = 0
lnPixHeight = 0
lnSuccess = loSsh.SendReqPty(lnChannelNum,lcTermType,lnWidthInChars,lnHeightInChars,lnPixWidth,lnPixHeight)
IF (lnSuccess <> 1) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* Start a shell on the channel:
lnSuccess = loSsh.SendReqShell(lnChannelNum)
IF (lnSuccess <> 1) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* Start a command in the remote shell. This example
* will send a "ls" command to retrieve the directory listing.
lnSuccess = loSsh.ChannelSendString(lnChannelNum,"ls" + CHR(13) + CHR(10),"ansi")
IF (lnSuccess <> 1) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* 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.
lnSuccess = loSsh.ChannelSendEof(lnChannelNum)
IF (lnSuccess <> 1) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* Read whatever output may already be available on the
* SSH connection. ChannelReadAndPoll returns the number of bytes
* that are available in the channel's internal buffer that
* are ready to be "picked up" by calling GetReceivedText
* or GetReceivedData.
* A return value of -1 indicates failure.
* A return value of -2 indicates a failure via timeout.
* The ChannelReadAndPoll method waits
* for data to arrive on the connection usingi the IdleTimeoutMs
* property setting. Once the first data arrives, it continues
* reading but instead uses the pollTimeoutMs passed in the 2nd argument:
* A return value of -2 indicates a timeout where no data is received.
lnPollTimeoutMs = 2000
n = loSsh.ChannelReadAndPoll(lnChannelNum,lnPollTimeoutMs)
IF (n < 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* Close the channel:
lnSuccess = loSsh.ChannelSendClose(lnChannelNum)
IF (lnSuccess <> 1) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* Perhaps we did not receive all of the commands output.
* To make sure, call ChannelReceiveToClose to accumulate any remaining
* output until the server's corresponding "channel close" is received.
lnSuccess = loSsh.ChannelReceiveToClose(lnChannelNum)
IF (lnSuccess <> 1) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* Let's pickup the accumulated output of the command:
lcCmdOutput = loSsh.GetReceivedText(lnChannelNum,"ansi")
IF (loSsh.LastMethodSuccess <> 1) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* Display the remote shell's command output:
? lcCmdOutput
* Disconnect
loSsh.Disconnect()
RELEASE loSsh