downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

ssh2_shell> <ssh2_sftp_unlink
Last updated: Fri, 13 Nov 2009

view this page in

ssh2_sftp

(PECL ssh2 >= 0.9.0)

ssh2_sftpSFTP サブシステムを初期化する

説明

resource ssh2_sftp ( resource $session )

すでに接続された SSH2 サーバから SFTP サブシステムを要求します。

パラメータ

session

ssh2_connect() のコールによって取得した SSH 接続リンク ID。

返り値

このメソッドは全ての他の ssh2_sftp_*() や ssh2.sftp:// fopen ラッパーで使用する SSH2 SFTP リソースを返します。

例1 SFTP 経由でのファイルのオープン

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

$sftp ssh2_sftp($connection);

$stream fopen("ssh2.sftp://$sftp/path/to/file"'r');
?>

参考



ssh2_shell> <ssh2_sftp_unlink
Last updated: Fri, 13 Nov 2009
 
add a note add a note User Contributed Notes
ssh2_sftp
sandipshah at vthrive dot com
17-Nov-2009 08:05
In

$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');

please make sure that you are specifying the "absolute" path to a file.

If not, you'll get errors like

"Unable to open file ..."

The reasoning is simple ... ssh2.sftp://$sftp points to the "root" directory on the remote server, where, most likely, one does not have access.

It is necessary to point it to your "home" directory.  For example, "ssh2.sftp://$sftp/home/username/filename" ... where "/home/username" is where your home directory is.
bas weerman
09-Jul-2008 07:13
I changed the read function to:

    public function receiveFile($remote_file, $local_file)
    {
        $sftp = $this->sftp;
        $stream = @fopen("ssh2.sftp://$sftp$remote_file", 'r');
        if (! $stream)
            throw new Exception("Could not open file: $remote_file");
        $size = $this->getFileSize($remote_file);           
        $contents = '';
        $read = 0;
        $len = $size;
        while ($read < $len && ($buf = fread($stream, $len - $read))) {
          $read += strlen($buf);
          $contents .= $buf;
        }       
        file_put_contents ($local_file, $contents);
        @fclose($stream);
    }

    public function getFileSize($file){
      $sftp = $this->sftp;
        return filesize("ssh2.sftp://$sftp$file");
    }
tom at r dot je
03-Jul-2008 01:33
Not sure if this is a bug of some kind of security feature.

When reading files using ssh2.sftp anything inside php tags is inexplicably stripped.

foo.php
one
<?
echo 'two';
?>
echo 'three';

$stream = fopen("ssh2.sftp://$sftp$file", 'r');
echo filesize("ssh2.sftp://$sftp$file"); //CORRECT
echo fread($stream, filesize("ssh2.sftp://$sftp$file")); //prints "onethree"

Not sure why this happens and haven't found a workaround.
bas weerman
14-May-2008 04:22
I added some functionality for scanning the filesystem and receiving and deleting files.

class SFTPConnection
{
    private $connection;
    private $sftp;

    public function __construct($host, $port=22)
    {
        $this->connection = @ssh2_connect($host, $port);
        if (! $this->connection)
            throw new Exception("Could not connect to $host on port $port.");
    }

    public function login($username, $password)
    {
        if (! @ssh2_auth_password($this->connection, $username, $password))
            throw new Exception("Could not authenticate with username $username " . "and password $password.");
        $this->sftp = @ssh2_sftp($this->connection);
        if (! $this->sftp)
            throw new Exception("Could not initialize SFTP subsystem.");
    }

    public function uploadFile($local_file, $remote_file)
    {
        $sftp = $this->sftp;
        $stream = @fopen("ssh2.sftp://$sftp$remote_file", 'w');
        if (! $stream)
            throw new Exception("Could not open file: $remote_file");
        $data_to_send = @file_get_contents($local_file);
        if ($data_to_send === false)
            throw new Exception("Could not open local file: $local_file.");
        if (@fwrite($stream, $data_to_send) === false)
            throw new Exception("Could not send data from file: $local_file.");
        @fclose($stream);
    }
   
        function scanFilesystem($remote_file) {
              $sftp = $this->sftp;
            $dir = "ssh2.sftp://$sftp$remote_file"; 
              $tempArray = array();
            $handle = opendir($dir);
          // List all the files
            while (false !== ($file = readdir($handle))) {
            if (substr("$file", 0, 1) != "."){
              if(is_dir($file)){
//                $tempArray[$file] = $this->scanFilesystem("$dir/$file");
               } else {
                 $tempArray[]=$file;
               }
             }
            }
           closedir($handle);
          return $tempArray;
        }   

    public function receiveFile($remote_file, $local_file)
    {
        $sftp = $this->sftp;
        $stream = @fopen("ssh2.sftp://$sftp$remote_file", 'r');
        if (! $stream)
            throw new Exception("Could not open file: $remote_file");
        $contents = fread($stream, filesize("ssh2.sftp://$sftp$remote_file"));           
        file_put_contents ($local_file, $contents);
        @fclose($stream);
    }
       
    public function deleteFile($remote_file){
      $sftp = $this->sftp;
      unlink("ssh2.sftp://$sftp$remote_file");
    }
}
duke1 at drakkon dot net
24-Apr-2008 12:38
if anyone is interested on how to get a directory listing:
$SSH_CONNECTION= ssh2_connect('shell.example.com', 22);
ssh2_auth_password($SSH_CONNECTION, 'username', 'password');
//-------------------------------------------------------------------
//this function finds all files within  given directory and returns them
function scanFilesystem($dir) {
    $tempArray = array();
    $handle = opendir($dir);
  // List all the files
    while (false !== ($file = readdir($handle))) {
    if (substr("$file", 0, 1) != "."){
           if(is_dir($file)){
            $tempArray[$file]=scanFilesystem("$dir/$file");
        } else {
            $tempArray[]=$file;
        }
    }
    }
   closedir($handle);
  return $tempArray;
}

//-------------------------------------------------------------------
$sftp = ssh2_sftp($SSH_CONNECTION);

//code to get listing of all OUTGOING files
$dir = "ssh2.sftp://$sftp/outgoing";
$outgoing = scanFilesystem($dir);
sort($outgoing);
print_r($outgoing);
Curtis Wyatt
29-Jan-2008 12:58
The sftp class provided by David Barnes works great.  However, if you get errors about fopen and it failing to open a stream, try the fully qualified path on the remote server.

For example, if you are uploading a file to /Users/username/Sites/file.txt this may not work:

<?php
try {
   
$sftp = new SFTPConnection("localhost", 22);
   
$sftp->login("username", "password");
   
$sftp->uploadFile("/tmp/to_be_sent", "Sites/file.txt");
}
catch (
Exception $e) {
    echo
$e->getMessage() . "\n";
}
?>

but this will:

<?php
try {
   
$sftp = new SFTPConnection("localhost", 22);
   
$sftp->login("username", "password");
   
$sftp->uploadFile("/tmp/to_be_sent", "/Users/username/Sites/file.txt");
}
catch (
Exception $e) {
    echo
$e->getMessage() . "\n";
}
?>

Don't assume that since you are connecting as that user that you are starting in its home space.

Another possible option is that you need to use http://us.php.net/manual/en/function.ssh2-sftp-mkdir.php first to make the directory if it does not exist already, and then upload the file into it.
David Barnes
16-Nov-2006 08:08
Here is an example of how to send a file with SFTP:

<?php

class SFTPConnection
{
    private
$connection;
    private
$sftp;

    public function
__construct($host, $port=22)
    {
       
$this->connection = @ssh2_connect($host, $port);
        if (!
$this->connection)
            throw new
Exception("Could not connect to $host on port $port.");
    }

    public function
login($username, $password)
    {
        if (! @
ssh2_auth_password($this->connection, $username, $password))
            throw new
Exception("Could not authenticate with username $username " .
                               
"and password $password.");

       
$this->sftp = @ssh2_sftp($this->connection);
        if (!
$this->sftp)
            throw new
Exception("Could not initialize SFTP subsystem.");
    }

    public function
uploadFile($local_file, $remote_file)
    {
       
$sftp = $this->sftp;
       
$stream = @fopen("ssh2.sftp://$sftp$remote_file", 'w');

        if (!
$stream)
            throw new
Exception("Could not open file: $remote_file");

       
$data_to_send = @file_get_contents($local_file);
        if (
$data_to_send === false)
            throw new
Exception("Could not open local file: $local_file.");

        if (@
fwrite($stream, $data_to_send) === false)
            throw new
Exception("Could not send data from file: $local_file.");

        @
fclose($stream);
    }
}

try
{
   
$sftp = new SFTPConnection("localhost", 22);
   
$sftp->login("username", "password");
   
$sftp->uploadFile("/tmp/to_be_sent", "/tmp/to_be_received");
}
catch (
Exception $e)
{
    echo
$e->getMessage() . "\n";
}

?>

ssh2_shell> <ssh2_sftp_unlink
Last updated: Fri, 13 Nov 2009
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites