2014-03-03 01:43:58 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Andreas Fischer <bantu@phpbb.com>
|
2014-12-10 00:02:44 +01:00
|
|
|
* @copyright 2014 Andreas Fischer
|
2014-03-03 01:43:58 +01:00
|
|
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
|
|
|
*/
|
|
|
|
|
2019-11-07 06:41:40 +01:00
|
|
|
use phpseclib3\Net\SSH2;
|
2014-12-10 02:31:41 +01:00
|
|
|
|
2014-06-01 21:13:20 +02:00
|
|
|
class Functional_Net_SSH2Test extends PhpseclibFunctionalTestCase
|
2014-03-03 01:43:58 +01:00
|
|
|
{
|
|
|
|
public function testConstructor()
|
|
|
|
{
|
2014-12-10 02:31:41 +01:00
|
|
|
$ssh = new SSH2($this->getEnv('SSH_HOSTNAME'));
|
2014-03-03 01:43:58 +01:00
|
|
|
|
2020-12-13 02:34:38 +01:00
|
|
|
$this->assertIsObject(
|
2017-12-07 21:08:19 +01:00
|
|
|
$ssh,
|
2014-03-03 01:43:58 +01:00
|
|
|
'Could not construct NET_SSH2 object.'
|
|
|
|
);
|
|
|
|
|
|
|
|
return $ssh;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2015-03-29 18:07:17 +02:00
|
|
|
* @depends testConstructor
|
|
|
|
* @group github408
|
|
|
|
* @group github412
|
|
|
|
*/
|
2014-07-20 22:58:24 +02:00
|
|
|
public function testPreLogin($ssh)
|
|
|
|
{
|
|
|
|
$this->assertFalse(
|
|
|
|
$ssh->isConnected(),
|
|
|
|
'Failed asserting that SSH2 is not connected after construction.'
|
|
|
|
);
|
|
|
|
|
2016-04-10 18:30:59 +02:00
|
|
|
$this->assertFalse(
|
|
|
|
$ssh->isAuthenticated(),
|
|
|
|
'Failed asserting that SSH2 is not authenticated after construction.'
|
|
|
|
);
|
|
|
|
|
2014-07-20 22:58:24 +02:00
|
|
|
$this->assertNotEmpty(
|
|
|
|
$ssh->getServerPublicHostKey(),
|
|
|
|
'Failed asserting that a non-empty public host key was fetched.'
|
|
|
|
);
|
|
|
|
|
|
|
|
$this->assertTrue(
|
|
|
|
$ssh->isConnected(),
|
|
|
|
'Failed asserting that SSH2 is connected after public key fetch.'
|
|
|
|
);
|
|
|
|
|
|
|
|
$this->assertNotEmpty(
|
|
|
|
$ssh->getServerIdentification(),
|
|
|
|
'Failed asserting that the server identifier was set after connect.'
|
|
|
|
);
|
|
|
|
|
|
|
|
return $ssh;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2015-03-29 18:07:17 +02:00
|
|
|
* @depends testPreLogin
|
|
|
|
*/
|
2016-04-10 18:30:59 +02:00
|
|
|
public function testBadPassword($ssh)
|
|
|
|
{
|
|
|
|
$username = $this->getEnv('SSH_USERNAME');
|
|
|
|
$password = $this->getEnv('SSH_PASSWORD');
|
|
|
|
$this->assertFalse(
|
|
|
|
$ssh->login($username, 'zzz' . $password),
|
|
|
|
'SSH2 login using password succeeded.'
|
|
|
|
);
|
|
|
|
|
|
|
|
$this->assertTrue(
|
|
|
|
$ssh->isConnected(),
|
|
|
|
'Failed asserting that SSH2 is connected after bad login attempt.'
|
|
|
|
);
|
|
|
|
|
|
|
|
$this->assertFalse(
|
|
|
|
$ssh->isAuthenticated(),
|
|
|
|
'Failed asserting that SSH2 is not authenticated after bad login attempt.'
|
|
|
|
);
|
|
|
|
|
|
|
|
return $ssh;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @depends testBadPassword
|
|
|
|
*/
|
2014-03-03 01:43:58 +01:00
|
|
|
public function testPasswordLogin($ssh)
|
|
|
|
{
|
|
|
|
$username = $this->getEnv('SSH_USERNAME');
|
|
|
|
$password = $this->getEnv('SSH_PASSWORD');
|
|
|
|
$this->assertTrue(
|
|
|
|
$ssh->login($username, $password),
|
|
|
|
'SSH2 login using password failed.'
|
|
|
|
);
|
2014-03-06 11:35:54 +01:00
|
|
|
|
2016-04-10 18:30:59 +02:00
|
|
|
$this->assertTrue(
|
|
|
|
$ssh->isAuthenticated(),
|
|
|
|
'Failed asserting that SSH2 is authenticated after good login attempt.'
|
|
|
|
);
|
|
|
|
|
2014-03-06 11:35:54 +01:00
|
|
|
return $ssh;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2015-03-29 18:07:17 +02:00
|
|
|
* @depends testPasswordLogin
|
|
|
|
* @group github280
|
|
|
|
*/
|
2014-03-06 11:35:54 +01:00
|
|
|
public function testExecWithMethodCallback($ssh)
|
|
|
|
{
|
2017-12-14 07:31:32 +01:00
|
|
|
$callbackObject = $this->getMockBuilder('stdClass')
|
2022-01-30 16:34:42 +01:00
|
|
|
->setMethods(['callbackMethod'])
|
2017-12-14 07:31:32 +01:00
|
|
|
->getMock();
|
2014-03-06 11:35:54 +01:00
|
|
|
$callbackObject
|
|
|
|
->expects($this->atLeastOnce())
|
|
|
|
->method('callbackMethod')
|
|
|
|
->will($this->returnValue(true));
|
2017-11-27 09:30:14 +01:00
|
|
|
$ssh->exec('pwd', [$callbackObject, 'callbackMethod']);
|
2017-05-28 15:58:00 +02:00
|
|
|
|
|
|
|
return $ssh;
|
2014-03-03 01:43:58 +01:00
|
|
|
}
|
2014-06-17 01:54:26 +02:00
|
|
|
|
|
|
|
public function testGetServerPublicHostKey()
|
|
|
|
{
|
2014-12-10 02:31:41 +01:00
|
|
|
$ssh = new SSH2($this->getEnv('SSH_HOSTNAME'));
|
2014-06-17 01:54:26 +02:00
|
|
|
|
2020-12-12 22:11:04 +01:00
|
|
|
$this->assertIsString($ssh->getServerPublicHostKey());
|
2014-06-17 01:54:26 +02:00
|
|
|
}
|
2015-07-17 19:30:44 +02:00
|
|
|
|
|
|
|
public function testOpenSocketConnect()
|
|
|
|
{
|
|
|
|
$fsock = fsockopen($this->getEnv('SSH_HOSTNAME'), 22);
|
2015-07-17 19:43:50 +02:00
|
|
|
$ssh = new SSH2($fsock);
|
2015-07-17 19:30:44 +02:00
|
|
|
|
|
|
|
$username = $this->getEnv('SSH_USERNAME');
|
|
|
|
$password = $this->getEnv('SSH_PASSWORD');
|
|
|
|
$this->assertTrue(
|
|
|
|
$ssh->login($username, $password),
|
|
|
|
'SSH2 login using an open socket failed.'
|
|
|
|
);
|
|
|
|
}
|
2017-05-28 15:58:00 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @depends testExecWithMethodCallback
|
|
|
|
* @group github1009
|
|
|
|
*/
|
|
|
|
public function testDisablePTY($ssh)
|
|
|
|
{
|
|
|
|
$ssh->enablePTY();
|
|
|
|
$ssh->exec('ls -latr');
|
|
|
|
$ssh->disablePTY();
|
|
|
|
$ssh->exec('pwd');
|
2017-09-06 07:27:07 +02:00
|
|
|
|
2021-10-13 03:35:38 +02:00
|
|
|
$this->assertTrue(true);
|
|
|
|
|
2017-09-06 07:27:07 +02:00
|
|
|
return $ssh;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @depends testDisablePTY
|
|
|
|
* @group github1167
|
|
|
|
*/
|
|
|
|
public function testChannelDataAfterOpen($ssh)
|
|
|
|
{
|
2021-10-14 03:34:57 +02:00
|
|
|
// Ubuntu's OpenSSH from 5.8 to 6.9 didn't work with multiple channels. see
|
|
|
|
// https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/1334916 for more info.
|
|
|
|
// https://lists.ubuntu.com/archives/oneiric-changes/2011-July/005772.html discusses
|
|
|
|
// when consolekit was incorporated.
|
|
|
|
// https://marc.info/?l=openssh-unix-dev&m=163409903417589&w=2 discusses some of the
|
|
|
|
// issues with how Ubuntu incorporated consolekit
|
|
|
|
$pattern = '#^SSH-2\.0-OpenSSH_([\d\.]+)[^ ]* Ubuntu-.*$#';
|
|
|
|
$match = preg_match($pattern, $ssh->getServerIdentification(), $matches);
|
|
|
|
$match = $match && version_compare('5.8', $matches[1], '<=');
|
|
|
|
$match = $match && version_compare('6.9', $matches[1], '>=');
|
|
|
|
if ($match) {
|
|
|
|
self::markTestSkipped('Ubuntu\'s OpenSSH >= 5.8 <= 6.9 didn\'t work well with multiple channels');
|
|
|
|
}
|
|
|
|
|
2017-09-06 07:27:07 +02:00
|
|
|
$ssh->write("ping 127.0.0.1\n");
|
|
|
|
|
|
|
|
$ssh->enablePTY();
|
|
|
|
$ssh->exec('bash');
|
|
|
|
|
|
|
|
$ssh->write("ls -latr\n");
|
|
|
|
|
|
|
|
$ssh->setTimeout(1);
|
|
|
|
|
|
|
|
$ssh->read();
|
2017-05-28 15:58:00 +02:00
|
|
|
}
|
2014-03-03 01:43:58 +01:00
|
|
|
}
|