"password" 上下文选项还可以用来提供由 "privkey_file" 和 "pubkey_file" 提供的密钥文件的密码。
注意此错误: https://bugs.php.net/bug.php?id=58573
除非您使用 openssl 编译 libssh2,否则加密的密钥可能无法正常工作。(它只在我的 Debian Wheezy 上重新编译库后才对我有用)。
ssh2:// — 安全外壳 2
ssh2.shell:// ssh2.exec:// ssh2.tunnel:// ssh2.sftp:// ssh2.scp:// (PECL)
注意: 此包装器默认情况下未启用
为了使用 ssh2.*:// 包装器,必须安装来自 » PECL 的 » SSH2 扩展。
除了接受传统的 URI 登录详细信息外,ssh2 包装器还将通过在 URL 的主机部分传递连接资源来重用打开的连接。
示例 #1 从活动连接打开流
<?php
$session = ssh2_connect('example.com', 22);
ssh2_auth_pubkey_file($session, 'username', '/home/username/.ssh/id_rsa.pub',
'/home/username/.ssh/id_rsa', 'secret');
$stream = fopen("ssh2.tunnel://$session/remote.example.com:1234", 'r');
?>
示例 #2 此 $session 变量必须保持可用!
为了使用 ssh2.*://$session 包装器,必须保留 $session 资源变量。以下代码将不会产生预期效果
<?php
$session = ssh2_connect('example.com', 22);
ssh2_auth_pubkey_file($session, 'username', '/home/username/.ssh/id_rsa.pub',
'/home/username/.ssh/id_rsa', 'secret');
$connection_string = "ssh2.sftp://$session/";
unset($session);
$stream = fopen($connection_string . "path/to/file", 'r');
?>
unset() 会关闭会话,因为 $connection_string 并没有保存对 $session 变量的引用,而只是保存了一个从它派生的字符串类型。当 unset() 由于离开作用域(例如在函数中)而隐式调用时,也会发生这种情况。
"password" 上下文选项还可以用来提供由 "privkey_file" 和 "pubkey_file" 提供的密钥文件的密码。
注意此错误: https://bugs.php.net/bug.php?id=58573
除非您使用 openssl 编译 libssh2,否则加密的密钥可能无法正常工作。(它只在我的 Debian Wheezy 上重新编译库后才对我有用)。
请注意,目前 opendir 在 sftp 根目录上已损坏,但您可以通过附加一个点来解决此问题。请参阅 https://bugs.php.net/bug.php?id=64169 和 http://stackoverflow.com/a/16238476/69173.
请注意由 thomas at gielfeldt dot dk 指出的一个 PHP 错误,即您必须将连接变量 intval() 之后才能将其放入连接字符串中
<?php
$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$sftp = ssh2_sftp($connection);
// See: https://bugs.php.net/bug.php?id=73597
$stream = fopen("ssh2.sftp://" . intval($sftp) . "/path/to/file", 'r');
?>
<?php
// 使用公钥连接。
$session = ssh2_connect('example.com', 22);
$result = ssh2_auth_pubkey_file($session, 'remote-username', '/home/local-username/.ssh/id_rsa.pub',
'/home/local-username/.ssh/id_rsa',
'secret');
// 设置 sftp 流包装器
$sftp = ssh2_sftp($session);
// 参见: https://bugs.php.net/bug.php?id=73597
$connection_string = 'ssh2.sftp://' . intval($sftp);
// 列出远程主目录中的文件。
$i = new \RecursiveDirectoryIterator("$connection_string/home/remote-username");
$r = new \RecursiveIteratorIterator($i);
foreach ($r as $f) {
print $f->getPathname() . "\n";
}
?>