Android™
Android™
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 Android™ Downloads
// Important: Don't forget to include the call to System.loadLibrary
// as shown at the bottom of this code sample.
package com.test;
import android.app.Activity;
import com.chilkatsoft.*;
import android.widget.TextView;
import android.os.Bundle;
public class SimpleActivity extends Activity {
private static final String TAG = "Chilkat";
// Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
boolean success = false;
// 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.
CkSsh ssh = new CkSsh();
int sshPort = 22;
success = ssh.Connect("ssh.example.com",sshPort);
if (success == false) {
Log.i(TAG, ssh.lastErrorText());
return;
}
// 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.
String password = "mySshPassword";
success = ssh.AuthenticatePw("mySshLogin",password);
if (success == false) {
Log.i(TAG, ssh.lastErrorText());
return;
}
int channelNum = ssh.OpenSessionChannel();
if (channelNum < 0) {
Log.i(TAG, ssh.lastErrorText());
return;
}
success = ssh.SendReqExec(channelNum,"uptime");
if (success == false) {
Log.i(TAG, ssh.lastErrorText());
return;
}
// 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.
ssh.put_ReadTimeoutMs(15000);
success = ssh.ChannelReceiveToClose(channelNum);
if (success == false) {
Log.i(TAG, ssh.lastErrorText());
return;
}
String output = ssh.getReceivedText(channelNum,"utf-8");
if (ssh.get_LastMethodSuccess() == false) {
Log.i(TAG, ssh.lastErrorText());
return;
}
Log.i(TAG, output);
// Send CLOSE for the channel.
success = ssh.ChannelSendClose(channelNum);
if (success == false) {
Log.i(TAG, ssh.lastErrorText());
return;
}
// After a successful call, the channel is no longer reported as open.
if (ssh.ChannelIsOpen(channelNum)) {
Log.i(TAG, "Still open.");
}
else {
Log.i(TAG, "The channel is closed.");
}
ssh.Disconnect();
}
static {
System.loadLibrary("chilkat");
// Note: If the incorrect library name is passed to System.loadLibrary,
// then you will see the following error message at application startup:
//"The application <your-application-name> has stopped unexpectedly. Please try again."
}
}