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();
}
}
?>
ssh2_connect
(PECL ssh2 >= 0.9.0)
ssh2_connect — Bir SSH sunucusuna bağlanır
Açıklama
$konak
[, int $port = 22
[, array $yöntemler
[, array $geriçağırımlar
]]] )Bir uzak SSH sunucusuna bağlanıp bir bağlantı özkaynağı döndürür.
Bağlantı sağlanır sağlanmaz, istemcinin ssh2_fingerprint() işlevini kullanarak konak anahtarını ve ardından parola veya genel anahtarla kullanıcı kimliğini doğrulaması gerekir.
Değiştirgeler
-
konak -
-
port -
-
yöntemler -
Aşağıda açıklanan dört değiştirgeden bazılarını içeren bir ilişkisel dizi.
Yöntemler İndis Anlamı Desteklenen değerler* kex Anahtar müzakere yöntemlerinin listesi; tercih sırasına göre dizilmiş virgül ayraçlı bir listedir. diffie-hellman-group1-sha1, diffie-hellman-group14-sha1 ve diffie-hellman-group-exchange-sha1 hostkey Müzakere edilecek konak anahtarı yöntemlerinin listesi; tercih sırasına göre dizilmiş bir listedir. ssh-rsa ve ssh-dss client_to_server İstemciden sunucuya gönderilen iletiler için şifreleme, sıkıştırma ve ileti kimlik doğrulaması kodu (MAC) ile igili yöntem tercihlerini içeren bir ilişkisel dizi. server_to_client Sunucudan istemciye gönderilen iletiler için şifreleme, sıkıştırma ve ileti kimlik doğrulaması kodu (MAC) ile igili yöntem tercihlerini içeren bir ilişkisel dizi. * - Desteklenen değerler sisteminizdeki kütüphaneye bağlıdır. Daha ayrıntılı bilgi için » libssh2 belgelerine bakınız.
client_to_serverveserver_to_clientaşağıdaki değiştirgelerin tamamını veya bir kısmını içeren bir ilişkisel dizidir.İndis Anlamı Desteklenen değerler* crypt Müzakere edilecek şifreleme yöntemleri; tercih sırasına göre dizilmiş virgül ayraçlı bir listedir. rijndael-cbc@lysator.liu.se, aes256-cbc, aes192-cbc, aes128-cbc, 3des-cbc, blowfish-cbc, cast128-cbc, arcfour ve none** comp Müzakere edilecek sıkıştırma yöntemleri; tercih sırasına göre dizilmiş virgül ayraçlı bir listedir. zlib ve none mac Müzakere edilecek MAC yöntemleri; tercih sırasına göre dizilmiş virgül ayraçlı bir listedir. hmac-sha1, hmac-sha1-96, hmac-ripemd160, hmac-ripemd160@openssh.com ve none** Bilginize: Crypt ve MAC yöntemi "none"
Güvenlik saikiyle, none değeri » libssh2 kütüphanesi tarafından iptal edilmiştir. Bu değeri etkin kılmak isterseniz kütüphaneyi derlerken uygun ./configure seçeneğini kullanmanız gerekir. Daha fazla bilgi için kütüphane belgelerine bakınız.
-
geriçağırımlar -
Aşağıdaki değiştirgeleri içeren bir ilişkisel dizidir.
Geriçağırım değiştirgeleri İndis Anlamı İşlev bildirimi ignore Bir SSH2_MSG_IGNOREpaketi alındığında çağrılacak işlevin ismi.void ignore_cb($ileti) debug Bir SSH2_MSG_DEBUGpaketi alındığında çağrılacak işlevin ismi.void debug_cb($ileti, $dil, $hep_göster) macerror Bir paket alındığında ileti kimlik doğrulaması başarısız olduğunda çağrılacak işlevin ismi. Eğer geri çağırım işlevi TRUEdöndürürse uyuşmazlık görmezden gelinir, yoksa bağlantı sonlandırılır.bool macerror_cb($packet) disconnect Bir SSH2_MSG_DISCONNECTpaketi alındığında çağrılacak işlevin ismi.void disconnect_cb($sebep, $ileti, $dil)
Dönen Değerler
Başarı durumunda bir özkaynak yoksa FALSE döner.
Örnekler
Örnek 1 - ssh2_connect() örneği
Paket gönderirken 3des-cbc, paket alırken güçlü aes şifremesi için zorlayan, hiçbir yönde sıkıştırma yapılmayan ve Group1 anahtar değişim yöntemini kullanan bir bağlantı açalım.
<?php
/* Sunucu bağlantıyı sonlandırırsa kullanıcıya bilgi verelim */
function my_ssh_disconnect($ebep, $ileti, $dil) {
printf("Sunucu bağlantıyı kesti; sebep kodu ve ileti: [%d] %s\n",
$sebep, $ileti);
}
$yontemler = array(
'kex' => 'diffie-hellman-group1-sha1',
'client_to_server' => array(
'crypt' => '3des-cbc',
'comp' => 'none'),
'server_to_client' => array(
'crypt' => 'aes256-cbc,aes192-cbc,aes128-cbc',
'comp' => 'none'));
$islevler = array('disconnect' => 'my_ssh_disconnect');
$baglanti = ssh2_connect('shell.example.com', 22, $yontemler, $islevler);
if (!$baglanti) die('Bağlantı sağlanamadı');
?>
Ayrıca Bakınız
- ssh2_fingerprint() - Uzak sunucunu parmakizini döndürür
- ssh2_auth_none() - "none" kimlik doğrulaması yapar
- ssh2_auth_password() - Parola kullanarak kimlik doğrulaması yapar
- ssh2_auth_pubkey_file() - Bir genel anahtar kullanarak kimlik doğrulaması yapar
With Sara's help, I have the following SS2 class that is quite flexible. If anyone improves it, please feel free to let me know.
<?php
// ssh protocols
// note: once openShell method is used, cmdExec does not work
class ssh2 {
private $host = 'host';
private $user = 'user';
private $port = '22';
private $password = 'password';
private $con = null;
private $shell_type = 'xterm';
private $shell = null;
private $log = '';
function __construct($host='', $port='' ) {
if( $host!='' ) $this->host = $host;
if( $port!='' ) $this->port = $port;
$this->con = ssh2_connect($this->host, $this->port);
if( !$this->con ) {
$this->log .= "Connection failed !";
}
}
function authPassword( $user = '', $password = '' ) {
if( $user!='' ) $this->user = $user;
if( $password!='' ) $this->password = $password;
if( !ssh2_auth_password( $this->con, $this->user, $this->password ) ) {
$this->log .= "Authorization failed !";
}
}
function openShell( $shell_type = '' ) {
if ( $shell_type != '' ) $this->shell_type = $shell_type;
$this->shell = ssh2_shell( $this->con, $this->shell_type );
if( !$this->shell ) $this->log .= " Shell connection failed !";
}
function writeShell( $command = '' ) {
fwrite($this->shell, $command."\n");
}
function cmdExec( ) {
$argc = func_num_args();
$argv = func_get_args();
$cmd = '';
for( $i=0; $i<$argc ; $i++) {
if( $i != ($argc-1) ) {
$cmd .= $argv[$i]." && ";
}else{
$cmd .= $argv[$i];
}
}
echo $cmd;
$stream = ssh2_exec( $this->con, $cmd );
stream_set_blocking( $stream, true );
return fread( $stream, 4096 );
}
function getLog() {
return $this->log;
}
}
?>
