Sample code for 30+ languages & platforms
Visual FoxPro

Send CLOSE on an SSH Channel

See more SSH Examples

Demonstrates the Chilkat Ssh.ChannelSendClose method, which sends an SSH CLOSE message for a channel and immediately marks it locally closed. The only argument is the channel number. It does not wait for remote EOF, remote CLOSE, or an exit status.

Background: CLOSE shuts down both directions of the channel, unlike EOF which closes only your side. Because the call returns without waiting for the remote side to acknowledge, it does not guarantee the remote process has terminated — so retrieve any output and exit status you care about before calling it. Afterward ChannelIsOpen reports false, though NumOpenChannels may still count the channel until final remote-close processing.

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loSsh
LOCAL lnSshPort
LOCAL lcPassword
LOCAL lnChannelNum
LOCAL lcOutput

lnSuccess = 0

*  Demonstrates the Ssh.ChannelSendClose method, which sends an SSH CLOSE message for a channel
*  and immediately marks it locally closed.  The only argument is the channel number.  It does
*  not wait for remote EOF, remote CLOSE, or an exit status.

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,"uptime")
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

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

*  Send CLOSE for the channel.
lnSuccess = loSsh.ChannelSendClose(lnChannelNum)
IF (lnSuccess = 0) THEN
    ? loSsh.LastErrorText
    RELEASE loSsh
    CANCEL
ENDIF

*  After a successful call, the channel is no longer reported as open.
IF (loSsh.ChannelIsOpen(lnChannelNum)) THEN
    ? "Still open."
ELSE
    ? "The channel is closed."
ENDIF

loSsh.Disconnect()

RELEASE loSsh