2014-08-26 20:46:07 +04:00
SMB
===
2021-03-10 17:31:09 +03:00
[![CI ](https://github.com/icewind1991/SMB/actions/workflows/ci.yaml/badge.svg )](https://github.com/icewind1991/SMB/actions/workflows/ci.yaml)
[![codecov ](https://codecov.io/gh/icewind1991/SMB/branch/master/graph/badge.svg?token=eTg0P466k6 )](https://codecov.io/gh/icewind1991/SMB)
2014-08-26 20:46:07 +04:00
PHP wrapper for `smbclient` and [`libsmbclient-php` ](https://github.com/eduardok/libsmbclient-php )
- Reuses a single `smbclient` instance for multiple requests
- Doesn't leak the password to the process list
- Simple 1-on-1 mapping of SMB commands
- A stream-based api to remove the need for temporary files
- Support for using libsmbclient directly trough [`libsmbclient-php` ](https://github.com/eduardok/libsmbclient-php )
Examples
----
2018-06-21 17:02:51 +03:00
### Connect to a share ###
2014-08-26 20:46:07 +04:00
```php
< ?php
2018-06-21 17:02:51 +03:00
use Icewind\SMB\ServerFactory;
use Icewind\SMB\BasicAuth;
2014-08-26 20:46:07 +04:00
require('vendor/autoload.php');
2018-06-21 17:02:51 +03:00
$serverFactory = new ServerFactory();
2020-03-27 18:57:55 +03:00
$auth = new BasicAuth('user', 'workgroup', 'password');
2018-06-21 17:02:51 +03:00
$server = $serverFactory->createServer('localhost', $auth);
2014-08-26 20:46:07 +04:00
$share = $server->getShare('test');
```
2018-06-21 17:02:51 +03:00
The server factory will automatically pick between the `smbclient` and `libsmbclient-php`
based backend depending on what is available.
### Using anonymous authentication ###
2014-08-26 20:46:07 +04:00
```php
2018-06-21 17:02:51 +03:00
$serverFactory = new ServerFactory();
$auth = new AnonymousAuth();
$server = $serverFactory->createServer('localhost', $auth);
```
2014-08-26 20:46:07 +04:00
2018-06-21 17:02:51 +03:00
### Using kerberos authentication ###
```php
$serverFactory = new ServerFactory();
$auth = new KerberosAuth();
$server = $serverFactory->createServer('localhost', $auth);
```
2014-08-26 20:46:07 +04:00
2018-06-21 17:02:51 +03:00
Note that this requires a valid kerberos ticket to already be available for php
2014-08-26 20:46:07 +04:00
2018-06-21 17:02:51 +03:00
### Upload a file ###
```php
$share->put($fileToUpload, 'example.txt');
2014-08-26 20:46:07 +04:00
```
2018-06-21 17:02:51 +03:00
### Download a file ###
2014-08-26 20:46:07 +04:00
```php
2018-06-21 17:02:51 +03:00
$share->get('example.txt', $target);
```
2014-08-26 20:46:07 +04:00
2018-06-21 17:02:51 +03:00
### List shares on the remote server ###
2014-08-26 20:46:07 +04:00
2018-06-21 17:02:51 +03:00
```php
2014-08-26 20:46:07 +04:00
$shares = $server->listShares();
foreach ($shares as $share) {
echo $share->getName() . "\n";
}
```
### List the content of a folder ###
```php
$content = $share->dir('test');
foreach ($content as $info) {
2016-03-17 15:54:26 +03:00
echo $info->getName() . "\n";
2014-08-26 20:46:07 +04:00
echo "\tsize :" . $info->getSize() . "\n";
}
```
### Using read streams
```php
$fh = $share->read('test.txt');
echo fread($fh, 4086);
fclose($fh);
```
### Using write streams
```php
$fh = $share->write('test.txt');
fwrite($fh, 'bar');
fclose($fh);
```
2019-02-06 17:36:06 +03:00
**Note**: write() will truncate your file to 0bytes. You may open a writeable stream with append() which will point
2021-03-10 17:31:09 +03:00
the cursor to the end of the file or create it if it does not exist yet. (append() is only compatible with libsmbclient-php)
2019-02-06 17:36:06 +03:00
```php
$fh = $share->append('test.txt');
fwrite($fh, 'bar');
fclose($fh);
```
2016-12-14 18:22:33 +03:00
### Using notify
```php
$share->notify('')->listen(function (\Icewind\SMB\Change $change) {
echo $change->getCode() . ': ' . $change->getPath() . "\n";
});
```
2018-06-21 17:02:51 +03:00
2019-02-06 17:36:06 +03:00
### Changing network timeouts
```php
$options = new Options();
$options->setTimeout(5);
$serverFactory = new ServerFactory($options);
```
2021-03-10 17:31:09 +03:00
### Setting protocol version
```php
$options = new Options();
$options->setMinProtocol(IOptions::PROTOCOL_SMB2);
$options->setMaxProtocol(IOptions::PROTOCOL_SMB3);
$serverFactory = new ServerFactory($options);
```
Note, setting the protocol version is not supported with php-smbclient version 1.0.1 or lower.
2019-02-06 17:36:06 +03:00
### Customizing system integration
The `smbclient` backend needs to get various information about the system it's running on to function
such as the paths of various binaries or the system timezone.
2021-03-10 17:31:09 +03:00
While the default logic for getting this information should work on most systems, it is possible to customize this behaviour.
2019-02-06 17:36:06 +03:00
In order to customize the integration you provide a custom implementation of `ITimezoneProvider` and/or `ISystem` and pass them as arguments to the `ServerFactory` .
2018-06-21 17:02:51 +03:00
## Testing SMB
Use the following steps to check if the library can connect to your SMB share.
1. Clone this repository or download the source as [zip ](https://github.com/icewind1991/SMB/archive/master.zip )
2. Make sure [composer ](https://getcomposer.org/ ) is installed
3. Run `composer install` in the root of the repository
4. Edit `example.php` with the relevant settings for your share.
5. Run `php example.php`
If everything works correctly then the contents of the share should be outputted.