Visual FoxPro
Visual FoxPro
Receive an SSH Channel Until Close
See more SSH Examples
Demonstrates the Chilkat Ssh.ChannelReceiveToClose method, which receives data on a channel until the server sends and Chilkat processes channel CLOSE. The only argument is the channel number. EOF alone does not complete this method.
Important: Set the ReadTimeoutMs property before calling this method. It defaults to 0, meaning no limit, so without it the call waits forever if the server never sends channel close.
Background: This is the simplest and most reliable way to collect the complete output of a one-shot
exec command, because the server closes the channel when the command finishes. It is not appropriate for an interactive shell, which never closes on its own — use the poll-based methods there instead. Both stdout and stderr are processed, merged or kept separate according to StderrToStdout.Chilkat Visual FoxPro Downloads
LOCAL lnSuccess
LOCAL loSsh
LOCAL lnSshPort
LOCAL lcPassword
LOCAL lnChannelNum
LOCAL lcOutput
lnSuccess = 0
* Demonstrates the Ssh.ChannelReceiveToClose method, which receives data on a channel until the
* server sends channel CLOSE. The only argument is the channel number. EOF alone does not
* complete this method.
loSsh = CreateObject('Chilkat.Ssh')
lnSshPort = 22
lnSuccess = loSsh.Connect("ssh.example.com",lnSshPort)
IF (lnSuccess = 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* 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.
lcPassword = "mySshPassword"
lnSuccess = loSsh.AuthenticatePw("mySshLogin",lcPassword)
IF (lnSuccess = 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
lnChannelNum = loSsh.OpenSessionChannel()
IF (lnChannelNum < 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
lnSuccess = loSsh.SendReqExec(lnChannelNum,"ls -l /tmp")
IF (lnSuccess = 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
* IMPORTANT: Set a read timeout. ReadTimeoutMs defaults to 0, which means no limit -- without
* it, this call waits forever if the server never sends channel close.
loSsh.ReadTimeoutMs = 15000
* Receive everything the command produces, up to and including channel close.
lnSuccess = loSsh.ChannelReceiveToClose(lnChannelNum)
IF (lnSuccess = 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
lcOutput = loSsh.GetReceivedText(lnChannelNum,"utf-8")
IF (loSsh.LastMethodSuccess = 0) THEN
? loSsh.LastErrorText
RELEASE loSsh
CANCEL
ENDIF
? lcOutput
loSsh.Disconnect()
RELEASE loSsh