如何使用phpseclib

时间:2015-12-15 07:38:38

标签: php sftp phpseclib

我有一个link我在哪里看到了更改默认属性的引用。设置所需的模式以通过SFTP传输数据集。

这是怎么回事......

sftp> ls /+mode=text,lrecl=80,recfm=fb

在此,我们将模式更改为文本(默认为binary模式)。

当我通过命令提示符执行它时它工作正常并给出相同的响应,这意味着命令执行得非常完美!

(在命令提示符下执行后的响应)

sftp> ls /+mode=text,lrecl=80,recfm=fb
/+mode=text,lrecl=80,recfm=fb 

但如果我尝试通过PHP代码使用相同的内容,则会将错误抛给我

  

ls:找不到FSUM6785文件或目录“/ + mode = text,lrecl = 80,recfm = fb”

以下是我使用phpseclib库的方法:

 define('NET_SFTP_LOGGING', NET_SFTP_LOG_COMPLEX);
 $user = 'username';
 $host = 'host';
 $key = new Crypt_RSA();
 $key->loadKey(file_get_contents('file.ppk'));
 $sftp = new Net_SFTP($host);
 if ($sftp->login($user,$key)) {
     echo $sftp->exec('ls /+mode=text,lrecl=80,recfm=fb');
 } else {
     return false;
 }

在上面,如果我尝试使用$sftp->exec('ls -la');$sftp->exec('pwd'); 它给了我目前的目录列表和分别是当前目录..这意味着SFTP连接正常,exec命令有效。

但是当我使用上面提到的ls /+mode=text,lrecl=80,recfm=fb命令时,同样的抛出错误。

是否需要设置其他任何内容才能使这些/+mode=text.....命令正常工作

1 个答案:

答案 0 :(得分:1)

sftp> ls /+mode=text,lrecl=80,recfm=fb

以上是OpenSSH sftp客户端命令ls。在内部,它会发出一系列SFTP请求(OPENDIRREADDIRCLOSE)以检索目录列表。

实施SFTP服务器以专门处理具有该唯一语法的OPENDIR,如the article you link to中所述。

echo $sftp->exec('ls /+mode=text,lrecl=80,recfm=fb');

虽然上面执行了远程shell ls命令。 shell ls命令没有对语法进行特殊处理,并将其视为路径并失败。

请注意,在exec实例上执行$sftp时,该方法实际上是在父SSH2类中实现的,与SFTP无关。

要模拟OpenSSH ls的{​​{1}}命令(即发送sftp SFTP请求),请使用OPENDIR类的一些目录列表命令,如{{ 1}}或SFTP

nlist