Note: This repository is a part of Kraken Framework, but can be used freely as standalone library. If you are interested in more asynchronous components for PHP, check out the rest of Kraken Project or see our asynchronous application skeleton example.
SSH is a component that provides consistent interface for PHP SSH2 extension and allows asynchronous writing and reading.
SSH features:
- OOP abstraction for PHP SSH2 extension,
- Support for variety of authorization methods,
- Asynchronous SSH2 commands,
- Asynchronous operations on files via SFTP,
- Kraken Framework compatibility,
- ...and more.
This section contains most frequently asked for examples. You can see more in example directory or in official documentation.
$loop = new Loop(new SelectLoop);
$auth = new SSH2Password($user, $pass);
$config = new SSH2Config();
$ssh2 = new SSH2($auth, $config, $loop);
$ssh2->on('connect:shell', function(SSH2DriverInterface $shell) use($ssh2, $loop) {
echo "# CONNECTED SHELL\n";
$buffer = '';
$command = $shell->open();
$command->write('ls -la');
$command->on('data', function(SSH2ResourceInterface $command, $data) use(&$buffer) {
$buffer .= $data;
});
$command->on('end', function(SSH2ResourceInterface $command) use(&$buffer) {
echo "# COMMAND RETURNED:\n";
echo $buffer;
$command->close();
});
$command->on('close', function(SSH2ResourceInterface $command) use($shell) {
$shell->disconnect();
});
});
$ssh2->on('disconnect:shell', function(SSH2DriverInterface $shell) use($ssh2) {
echo "# DISCONNECTED SHELL\n";
$ssh2->disconnect();
});
$ssh2->on('connect', function(SSH2Interface $ssh2) {
echo "# CONNECTED\n";
$ssh2->createDriver(SSH2::DRIVER_SHELL)
->connect();
});
$ssh2->on('disconnect', function(SSH2Interface $ssh2) use($loop) {
echo "# DISCONNECTED\n";
$loop->stop();
});
$loop->onTick(function() use($ssh2) {
$ssh2->connect();
});
$loop->start();
$loop = new Loop(new SelectLoop);
$auth = new SSH2Password($user, $pass);
$config = new SSH2Config();
$ssh2 = new SSH2($auth, $config, $loop);
$ssh2->on('connect:sftp', function(SSH2DriverInterface $sftp) use($loop, $ssh2) {
echo "# CONNECTED SFTP\n";
$lines = [ "KRAKEN\n", "IS\n", "AWESOME!\n" ];
$linesPointer = 0;
$file = $sftp->open(__DIR__ . '/_file_write.txt', 'w+');
$file->write();
$file->on('drain', function(SSH2ResourceInterface $file) use(&$lines, &$linesPointer) {
echo "# PART OF THE DATA HAS BEEN WRITTEN\n";
if ($linesPointer < count($lines)) {
$file->write($lines[$linesPointer++]);
}
});
$file->on('finish', function(SSH2ResourceInterface $file) {
echo "# FINISHED WRITING\n";
$file->close();
});
$file->on('close', function(SSH2ResourceInterface $file) use($sftp) {
echo "# FILE HAS BEEN CLOSED\n";
$sftp->disconnect();
});
});
$ssh2->on('disconnect:sftp', function(SSH2DriverInterface $sftp) use($ssh2) {
echo "# DISCONNECTED SFTP\n";
$ssh2->disconnect();
});
$ssh2->on('connect', function(SSH2Interface $ssh2) {
echo "# CONNECTED\n";
$ssh2->createDriver(SSH2::DRIVER_SFTP)
->connect();
});
$ssh2->on('disconnect', function(SSH2Interface $ssh2) use($loop) {
echo "# DISCONNECTED\n";
$loop->stop();
});
$loop->onTick(function() use($ssh2) {
$ssh2->connect();
});
$loop->start();
$loop = new Loop(new SelectLoop);
$auth = new SSH2Password($user, $pass);
$config = new SSH2Config();
$ssh2 = new SSH2($auth, $config, $loop);
$ssh2->on('connect:sftp', function(SSH2DriverInterface $sftp) use($loop, $ssh2) {
echo "# CONNECTED SFTP\n";
$buffer = '';
$file = $sftp->open(__DIR__ . '/_file_read.txt', 'r+');
$file->read();
$file->on('data', function(SSH2ResourceInterface $file, $data) use(&$buffer) {
$buffer .= $data;
});
$file->on('end', function(SSH2ResourceInterface $file) use(&$buffer) {
echo "# FOLLOWING LINES WERE READ FROM FILE:\n";
echo $buffer;
$file->close();
});
$file->on('close', function(SSH2ResourceInterface $file) use($sftp) {
echo "# FILE HAS BEEN CLOSED\n";
$sftp->disconnect();
});
});
$ssh2->on('disconnect:sftp', function(SSH2DriverInterface $sftp) use($ssh2) {
echo "# DISCONNECTED SFTP\n";
$ssh2->disconnect();
});
$ssh2->on('connect', function(SSH2Interface $ssh2) {
echo "# CONNECTED\n";
$ssh2->createDriver(SSH2::DRIVER_SFTP)
->connect();
});
$ssh2->on('disconnect', function(SSH2Interface $ssh2) use($loop) {
echo "# DISCONNECTED\n";
$loop->stop();
});
$loop->onTick(function() use($ssh2) {
$ssh2->connect();
});
$loop->start();
See more examples in example directory or in official documentation.
- PHP-5.6 or PHP-7.0+,
- UNIX or Windows OS,
- PHP SSH2 extension enabled.
composer require kraken-php/ssh
Tests are provided within our write-only Framework repository.
Documentation for this module can be found in the official documentation.
This library is read-only subtree split of Kraken Framework. To make contributions, please go to Framework repository.
This library licensed under the MIT license, see more information in Kraken Framework license section.