Programming Examples

ChilkatHOMEASPVisual BasicVB.NETC#CC++MFCDelphiFoxProJavaPerlPythonRubySQL ServerVBScript

PHP ActiveX Examples

Bounced Mail
Bz2
Certificates/Keys
Charset
CSV
DKIM / DomainKey
Diffie-Hellman
DSA
Email Object
Encryption
FileAccess
FTP
HTML Conversion
HTTP
IMAP
MHT / HTML Email
MIME
NTLM
POP3
RSA
SMTP
Socket
Spider
SSH Key
SSH
SSH Tunnel
SFTP
Tar
Upload
XML
Zip
Amazon S3


 

 

 

 

 

 

 

 

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".

Download Chilkat 32-bit SSH / SFTP ActiveX (.msi)

Download All 32-bit Chilkat ActiveX Components (.zip)

Download All 64-bit Chilkat ActiveX Components (.zip)

<?php

//  Important: It is helpful to send the contents of the
//  ssh.LastErrorText property when requesting support.

$ssh = new COM("Chilkat.Ssh");

//  Any string automatically begins a fully-functional 30-day trial.
$success = $ssh->UnlockComponent('30-day trial');
if ($success != true) {
    print $ssh->lastErrorText() . "\n";
    exit;
}

//  Hostname may be an IP address or hostname:
$hostname = '192.168.1.117';
$port = 22;

//  Keep a session log, which is available via the SessionLog
//  property:
$ssh->KeepSessionLog = true;

$success = $ssh->Connect($hostname,$port);
if ($success != true) {
    print $ssh->lastErrorText() . "\n";
    print $ssh->sessionLog() . "\n";
    exit;
}

//  When reading, if no additional data arrives for more than
//  5 seconds, then abort:
$ssh->IdleTimeoutMs = 5000;

//  SSH Server Authentication
//  If there is no login/password required, you must still call
//  AuthenticatePw and use any values for login/password.
$success = $ssh->AuthenticatePw('chilkat','myPassword');
if ($success != true) {
    print $ssh->lastErrorText() . "\n";
    print $ssh->sessionLog() . "\n";
    exit;
}

//  Open a session channel.

$channelNum = $ssh->OpenSessionChannel();
if ($channelNum < 0) {
    print $ssh->lastErrorText() . "\n";
    print $ssh->sessionLog() . "\n";
    exit;
}

//  Request a pseudo-terminal
$termType = 'dumb';
$widthInChars = 120;
$heightInChars = 40;
$pixWidth = 0;
$pixHeight = 0;
$success = $ssh->SendReqPty($channelNum,$termType,$widthInChars,$heightInChars,$pixWidth,$pixHeight);
if ($success != true) {
    print $ssh->lastErrorText() . "\n";
    print $ssh->sessionLog() . "\n";
    exit;
}

//  Start a shell on the channel:
$success = $ssh->SendReqShell($channelNum);
if ($success != true) {
    print $ssh->lastErrorText() . "\n";
    print $ssh->sessionLog() . "\n";
    exit;
}

//  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.)

$cmd = 'su' . "\n";
$success = $ssh->ChannelSendString($channelNum,$cmd,'ansi');
if ($success != true) {
    print $ssh->lastErrorText() . "\n";
    print $ssh->sessionLog() . "\n";
    exit;
}

//  Read until we get the prompt for the password:
$success = $ssh->ChannelReceiveUntilMatch($channelNum,'Password:','ansi',true);
if ($success != true) {
    print $ssh->lastErrorText() . "\n";
    print $ssh->sessionLog() . "\n";
    exit;
}

//  Display what we've received so far:
print $ssh->getReceivedText($channelNum,'ansi') . "\n";

//  Send the password.
//  Again, make sure it uses a bare-LF and not a CRLF.

$password = 'myPassword' . "\n";
$success = $ssh->ChannelSendString($channelNum,$password,'ansi');
if ($success != true) {
    print $ssh->lastErrorText() . "\n";
    print $ssh->sessionLog() . "\n";
    exit;
}

//  Read the response until we get the shell prompt (assuming it's successful)
//  In my case, the shell prompt is: "root@ubuntu:/home/chilkat# "
//  It will be different in your case.
$success = $ssh->ChannelReceiveUntilMatch($channelNum,'root@ubuntu:/home/chilkat#','ansi',true);
if ($success != true) {
    //  Check the last-error information and the session log...
    print $ssh->lastErrorText() . "\n";
    print $ssh->sessionLog() . "\n";
    //  Check to see what was received.
    print $ssh->getReceivedText($channelNum,'ansi') . "\n";
    exit;
}

//  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...
print $ssh->getReceivedText($channelNum,'ansi') . "\n";

//  Send a command.  In this case, we are sending the "ls" command:
$cmd = 'ls' . "\n";
$success = $ssh->ChannelSendString($channelNum,$cmd,'ansi');
if ($success != true) {
    print $ssh->lastErrorText() . "\n";
    print $ssh->sessionLog() . "\n";
    exit;
}

//  Read until the next command prompt:
$success = $ssh->ChannelReceiveUntilMatch($channelNum,'root@ubuntu:/home/chilkat#','ansi',true);
if ($success != true) {
    //  Check the last-error information and the session log...
    print $ssh->lastErrorText() . "\n";
    print $ssh->sessionLog() . "\n";
    //  Check to see what was received.
    print $ssh->getReceivedText($channelNum,'ansi') . "\n";
    exit;
}

//  Display the command output:
print $ssh->getReceivedText($channelNum,'ansi') . "\n";

//  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.
$success = $ssh->ChannelSendEof($channelNum);
if ($success != true) {
    print $ssh->lastErrorText() . "\n";
    print $ssh->sessionLog() . "\n";
    exit;
}

//  Close the channel:
$success = $ssh->ChannelSendClose($channelNum);
if ($success != true) {
    print $ssh->lastErrorText() . "\n";
    print $ssh->sessionLog() . "\n";
    exit;
}

//  Disconnect
$ssh->Disconnect();
?>

Need a specific example? Send a request to support@chilkatsoft.com

© 2000-2010 Chilkat Software, Inc. All Rights Reserved.