Skip to content

remotefs-rs/remotefs-rs-smb

Repository files navigation

remotefs SMB

Changelog · Get started · Documentation

~ Remotefs SMB client ~

Developed by @veeso

Current version: 0.3.0 (30/09/2024)

License-MIT Repo stars Downloads counter Latest version Ko-fi

Linux CI MacOS CI Windows CI Coveralls Docs


About remotefs-smb ☁️

remotefs-smb is a client implementation for remotefs, providing support for the SMB protocol.


Get started 🚀

First of all, add remotefs-smb to your project dependencies:

remotefs = "0.3"
remotefs-smb = "^0.3"

these features are supported:

  • find: enable find() method on client (enabled by default)
  • no-log: disable logging. By default, this library will log via the log crate.

Install dependencies (UNIX based only)

remotefs-smb relies on pavao, which requires the libsmbclient library, which can be installed with the following instructions:

MacOS 🍎

Install samba with brew:

brew install samba

Debian based systems 🐧

Install libsmbclient with apt:

apt install -y libsmbclient-dev libsmbclient

⚠️ libsmbclient-dev is required only on the machine where you build the application

RedHat based systems 🐧

Install libsmbclient with dnf:

dnf install libsmbclient-devel libsmbclient

⚠️ libsmbclient-devel is required only on the machine where you build the application

Build from sources 📁

Install libsmbclient building from sources:

wget -O samba.tar.gz https://github.com/samba-team/samba/archive/refs/tags/samba-4.16.1.tar.gz
mkdir -p samba/
tar  xzvf samba.tar.gz -C samba/ --strip-components=1
rm samba.tar.gz
cd samba/
./configure
make
make install
cd ..
rm -rf samba/

Client implementation

UNIX client

// import remotefs trait and client
use remotefs::{RemoteFs, fs::UnixPex};
use remotefs_smb::{SmbFs, SmbOptions, SmbCredentials};
use std::path::Path;
let mut client = SmbFs::try_new(
    SmbCredentials::default()
        .server("smb://localhost:3445")
        .share("/temp")
        .username("test")
        .password("test")
        .workgroup("pavao"),
    SmbOptions::default()
        .case_sensitive(true)
        .one_share_per_server(true),
)
.unwrap();
// connect
assert!(client.connect().is_ok());
// get working directory
println!("Wrkdir: {}", client.pwd().ok().unwrap().display());
// make directory
assert!(client.create_dir(Path::new("/cargo"), UnixPex::from(0o755)).is_ok());
// change working directory
assert!(client.change_dir(Path::new("/cargo")).is_ok());
// disconnect
assert!(client.disconnect().is_ok());

Windows client

// import remotefs trait and client
use remotefs::{RemoteFs, fs::UnixPex};
use remotefs_smb::{SmbFs, SmbCredentials};
use std::path::Path;
let mut client = SmbFs::new(
    SmbCredentials::new("localhost:3445", "temp")
        .username("test")
        .password("test")
);
// connect
assert!(client.connect().is_ok());
// get working directory
println!("Wrkdir: {}", client.pwd().ok().unwrap().display());
// make directory
assert!(client.create_dir(Path::new("\\cargo"), UnixPex::from(0o755)).is_ok());
// change working directory
assert!(client.change_dir(Path::new("\\cargo")).is_ok());
// disconnect
assert!(client.disconnect().is_ok());

Client compatibility table ✔️

The following table states the compatibility for the client client and the remote file system trait method.

Note: connect(), disconnect() and is_connected() MUST always be supported, and are so omitted in the table.

Client/Method Support (UNIX) Support (Win )
append_file Yes Yes
append No Yes
change_dir Yes Yes
copy No Yes
create_dir Yes Yes
create_file Yes Yes
create No Yes
exec No No
exists Yes Yes
list_dir Yes Yes
mov Yes Yes
open_file Yes Yes
open No Yes
pwd Yes Yes
remove_dir_all Yes Yes
remove_dir Yes Yes
remove_file Yes Yes
setstat No Yes
stat Yes Yes
symlink Yes Yes

Support the developer ☕

If you like remotefs-smb and you're grateful for the work I've done, please consider a little donation 🥳

You can make a donation with one of these platforms:

ko-fi PayPal


Contributing and issues 🤝🏻

Contributions, bug reports, new features, and questions are welcome! 😉 If you have any questions or concerns, or you want to suggest a new feature, or you want just want to improve remotefs, feel free to open an issue or a PR.

Please follow our contributing guidelines


Changelog ⏳

View remotefs' changelog HERE


Powered by 💪

remotefs-smb is powered by these aweseome projects:


License 📃

remotefs-smb is licensed under the MIT license.

You can read the entire license HERE