2012-01-12 1 views

risposta

29

È possibile utilizzare ssh2_sftp e opendir, in questo modo:

<?php 
$connection = ssh2_connect('shell.example.com', 22); 
ssh2_auth_password($connection, 'username', 'password'); 

$sftp = ssh2_sftp($connection); 
$sftp_fd = intval($sftp); 

$handle = opendir("ssh2.sftp://$sftp_fd/path/to/directory"); 
echo "Directory handle: $handle\n"; 
echo "Entries:\n"; 
while (false != ($entry = readdir($handle))){ 
    echo "$entry\n"; 
} 
+2

C'è un modo per identificare se è un file o una directory? specialmente quando un file non ha il nome dell'estensione? – 1901

+0

Wow. Metodo di hacking reale. Inoltre, è possibile utilizzare molte altre funzioni del filesystem in modo simile, ad esempio scandir, fopen, file_exists, file_get_contents. – Pascal9x

+0

In realtà questo genera lo stesso errore di segmentazione in PHP 5.6. Devi davvero passare la risorsa '$ sftp' restituita da' ssh2_sftp' a un 'intval' prima, prima di concatenarla con qualcosa, come indicato dalla risposta di @pcs. –

1

http://www.php.net/manual/en/function.ssh2-exec.php

si dà il comando ls, ammesso che sia un sistema basato su UNIX (solitamente il caso), altrimenti il ​​comando specifico-OP come dir per Windows.

<?php 
$connection = ssh2_connect('shell.example.com', 22); 
ssh2_auth_password($connection, 'username', 'password'); 

$stream = ssh2_exec($connection, 'ls'); 
?> 
+4

'ls' non aiuta se si desidera eseguire il loop delle voci della directory. Inoltre, non funzionerà se l'host consente solo il sottosistema SFTP e nega l'accesso alla shell. – elias

+1

ok, non lo sapevo. notato e +1 sulla tua soluzione. –

+0

Il server SSH potrebbe funzionare su Windows. Windows non ha il comando ls. – Pascal9x

17

Nel caso in cui qualcuno sta lottando per ottenere questo lavoro, e si esegue PHP 5.6.28 c'era un recente aggiornamento che sia creato un requisito o ha introdotto un bug in cui intval() deve essere utilizzato su ogni funzione di accesso di cartelle/file SFTP:

$handle = opendir("ssh2.sftp://".intval($sftp)."/path/to/directory"); 
+0

Formatta il codice –

+0

Grazie, mi hai salvato la giornata! Ho continuato a ricevere segfaults da quell'aggiornamento di PHP! – Christian

+0

Perché questa non è la risposta migliore? – magtak