Как переопределить атрибуты DCB в SFTP с помощью phpseclib

У меня есть ссылка, где я видел ссылку на изменение атрибутов по умолчанию и установку необходимых режим для передачи набора данных через 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..... команды работали?


person kumar    schedule 15.12.2015    source источник


Ответы (1)


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

Выше приведена клиентская команда OpenSSH sftp ls. Внутри он отправляет последовательность запросов SFTP (OPENDIR, READDIR, CLOSE) для получения списка каталогов.

Сервер SFTP реализован для обработки OPENDIR именно с помощью этого уникального синтаксиса, как описано в статье, на которую вы ссылаетесь< /а>.


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

В то время как приведенное выше выполняет команду удаленной оболочки ls. Команда оболочки ls не имеет специальной обработки синтаксиса, считает ее путем и терпит неудачу.

Обратите внимание, что пока вы выполняете exec в экземпляре $sftp, метод фактически реализуется в родительском классе SSH2 и не имеет ничего общего с SFTP.


Чтобы эмулировать команду ls OpenSSH sftp (т. е. отправить запрос OPENDIR SFTP), используйте некоторые команды списка каталогов класса SFTP, например nlist или rawlist:

$sftp->nlist('/+mode=text,lrecl=80,recfm=fb');
person Martin Prikryl    schedule 15.12.2015