note 104758 modified in function.ssh2-connect by danbrown
| From: | danbrown@php.net | Date: | Tue, 26 Jun 2012 16:18:07 +0000 |
| Subject: | note 104758 modified in function.ssh2-connect by danbrown | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-188870@lists.php.net to get a copy of this message | ||
Due to a lack of complete examples, here's a simple SSH2 class for connecting to a server,
authenticating with public key authentication, verifying the server's fingerprint, issuing
commands and reading their STDOUT and properly disconnecting. Note: You may need to make sure you
commands produce output so the response can be pulled. Some people suggest that the command is not
executed until you pull the response back. <?php class
NiceSSH { 	// SSH Host 	private $ssh_host =
'myserver.example.com'; 	// SSH
Port 	private $ssh_port = 22; 	// SSH Server
Fingerprint 	private $ssh_server_fp =
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; 	// SSH
Username 	private $ssh_auth_user =
'username'; 	// SSH Public Key
File 	private $ssh_auth_pub =
'/home/username/.ssh/id_rsa.pub'; 	// SSH Private Key
File 	private $ssh_auth_priv =
'/home/username/.ssh/id_rsa'; 	// SSH Private Key Passphrase
(null == no passphrase) 	private $ssh_auth_pass; 	//
SSH Connection 	private
$connection; 	 	public function connect()
{ 		if (!($this->connection =
ssh2_connect($this->ssh_host, $this->ssh_port)))
{ 			throw new Exception('Cannot connect to
server'); 		} 		$fingerprint =
ssh2_fingerprint($this->connection, SSH2_FINGERPRINT_MD5 |
SSH2_FINGERPRINT_HEX); 		if (strcmp($this->ssh_server_fp,
$fingerprint) !== 0) { 			throw new Exception('Unable
to verify server
identity!'); 		} 		if
(!ssh2_auth_pubkey_file($this->connection, $this->ssh_auth_user,
$this->ssh_auth_pub, $this->ssh_auth_priv, $this->ssh_auth_pass))
{ 			throw new Exception('Autentication rejected by
server'); 		} 	} 	public
function exec($cmd) { 		if (!($stream =
ssh2_exec($this->connection, $cmd))) { 			throw new
Exception('SSH command
failed'); 		} 		stream_set_blocking($stream,
true); 		$data =
""; 		while ($buf = fread($stream, 4096))
{ 			$data .=
$buf; 		} 		fclose($stream); 		return
$data; 	} 	public function disconnect()
{ 		$this->exec('echo "EXITING"
&& exit;'); 		$this->connection =
null; 	} 	public function __destruct()
{ 		$this->disconnect(); 	} } ?> [EDIT
BY danbrown AT php DOT net: Contains two bugfixes suggested by 'AlainC' in user note
#109185 (removed) on 26-JUN-2012.]
--was--
Due to a lack of complete examples, here's a simple SSH2 class for connecting to a server,
authenticating with public key authentication, verifying the server's fingerprint, issuing
commands and reading their STDOUT and properly disconnecting. Note: You may need to make sure you
commands produce output so the response can be pulled. Some people suggest that the command is not
executed until you pull the response back.
<?php
class NiceSSH {
// SSH Host
private $ssh_host = 'myserver.example.com';
// SSH Port
private $ssh_port = 22;
// SSH Server Fingerprint
private $ssh_server_fp = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
// SSH Username
private $ssh_auth_user = 'username';
// SSH Public Key File
private $ssh_auth_pub = '/home/username/.ssh/id_rsa.pub';
// SSH Private Key File
private $ssh_auth_priv = '/home/username/.ssh/id_rsa';
// SSH Private Key Passphrase (null == no passphrase)
private $ssh_auth_pass;
// SSH Connection
private $connection;
public function connect() {
if (!($this->connection = ssh2_connect($this->ssh_host, $this->ssh_port))) {
throw new Exception('Cannot connect to server');
}
$fingerprint = ssh2_fingerprint($this->connection, SSH2_FINGERPRINT_MD5 |
SSH2_FINGERPRINT_HEX);
if (strcmp($this->ssh_master_fp, $fingerprint) !== 0) {
throw new Exception('Unable to verify server identity!');
}
if (!ssh2_auth_pubkey_file($this->connection, $this->ssh_auth_user, $this->ssh_auth_pub,
$this->ssh_auth_priv, $this->ssh_auth_pass)) {
throw new Exception('Autentication rejected by server');
}
}
public function exec($cmd) {
if (!($stream = ssh2_exec($this->connection, $cmd))) {
throw new Exception('SSH command failed');
}
stream_set_blocking($stream, true);
$data = "";
while ($buf = fread($stream, 4096)) {
$data .= $buf;
}
fclose($stream);
return $data;
}
public function disconnect() {
$this->exec($this->connection, 'echo "EXITING" && exit;');
$this->connection = null;
}
public function __destruct() {
$this->disconnect();
}
}
?>
http://php.net/manual/en/function.ssh2-connect.php