"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)
除了接受传统的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, '远程用户名', '/home/本地用户名/.ssh/id_rsa.pub',
'/home/本地用户名/.ssh/id_rsa',
'密码');
// 设置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/远程用户名");
$r = new \RecursiveIteratorIterator($i);
foreach ($r as $f) {
print $f->getPathname() . "\n";
}
?>