2024年PHP日本大会

ssh2://

ssh2://安全壳2

描述

ssh2.shell:// ssh2.exec:// ssh2.tunnel:// ssh2.sftp:// ssh2.scp:// (PECL)

注意: 此包装器默认未启用
为了使用ssh2.*:// 包装器,必须安装来自» PECL» SSH2 扩展。

除了接受传统的URI登录详细信息外,ssh2包装器还将通过在URL的主机部分传递连接资源来重用打开的连接。

用法

选项

包装器摘要
属性 ssh2.shell ssh2.exec ssh2.tunnel ssh2.sftp ssh2.scp
allow_url_fopen限制
允许读取
允许写入
允许追加 是(当服务器支持时)
允许同时读写
支持stat()
支持unlink()
支持rename()
支持mkdir()
支持rmdir()

上下文选项
名称 用法 默认值
session 要重用的预连接ssh2资源  
sftp 要重用的预分配sftp资源  
methods 要使用的密钥交换、主机密钥、密码、压缩和MAC方法  
callbacks    
username 连接使用的用户名  
password 要与密码身份验证一起使用的密码  
pubkey_file 要用于身份验证的公钥文件的名称  
privkey_file 要用于身份验证的私钥文件的名称  
env 要设置的环境变量的关联数组  
term 分配pty时请求的终端仿真类型  
term_width 分配pty时请求的终端宽度  
term_height 分配pty时请求的终端高度  
term_units 与term_width和term_height一起使用的单位 SSH2_TERM_UNIT_CHARS

示例

示例 #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() 因离开作用域(例如在函数中)而隐式存在时,也会发生这种情况。

添加备注

用户贡献的备注 4条备注

exptom
11年前
"password"上下文选项也可用于提供"privkey_file"和"pubkey_file"提供的密钥文件的密码。

注意此错误:https://bugs.php.net/bug.php?id=58573
除非您针对openssl构建libssh2,否则加密密钥可能无法工作。(只有在我重新编译库后,它才在我的Debian Wheezy上工作)。
bluej100 at gmail dot com
11年前
请注意,opendir当前在sftp根目录中已损坏,但您可以通过附加一个点来解决此问题。参见https://bugs.php.net/bug.php?id=64169http://stackoverflow.com/a/16238476/69173.
guilhem at no dot spam dot answeb dot net
7年前
请注意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');
?>
thomas at gielfeldt dot dk
7年前
<?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";
}
?>
To Top