sftpman-iced
is a GUI application for Linux systems that makes it easy to setup and mount sshfs/SFTP filesystems.
It's a GUI frontend to the sftpman command line application and library (libsftpman
). See the sftpman repository for more information.
-
libsftpman
, provided by sftpman -
an askpass application, so you can be asked to enter SSH key passphrases. Examples are: ksshaskpass (included in KDE Plasma), seahorse (included in GNOME). Also see Alternative passphrase dialogs on the ArchLinux wiki.
💡 Note: Installing the sftpman-iced
GUI application will automatically pull the libsftpman
library (provided by sftpman) as a dependency, but will not automatically install the sftpman
CLI binary.
For ArchLinux, there's an sftpman-iced package in the AUR.
For other Linux distributions you can install using cargo:
cargo install sftpman-iced
You also need to:
-
install sshfs yourself
-
make sure the
/mnt/sshfs
directory exists and is writable (e.g.mkdir /mnt/sshfs && chown root:users /mnt/sshfs && chmod 0775 /mnt/sshfs
)
Since the underlying CLI application and library (sftpman
) was rewritten from Python to Rust, we found ourselves having to rewrite the GUI application as well.
Also see:
- Why was iced chosen as a UI framework instead of Gtk?
- Why was iced chosen as a UI framework instead of Qt?
- Why was iced chosen as a UI framework instead of Slint?
Also see: Why was sftpman-gtk rewritten to sftpman-iced?.
GNOME has been becoming more dumbed-down and its Gtk UI framework has been starting to feel more alien on other Desktop Environments (like KDE).
Furthermore, the imperative nature of Gtk makes it an ugly mess to develop for. Choosing a declarative UI framework was deemed a better choice.
The Rust bindings for various UI frameworks (Gtk, Qt, etc.) are all poor and iced ticked all our boxes.
Also see: Why was sftpman-gtk rewritten to sftpman-iced?.
When working on this rewrite, we gave Qt a try via qmetaobject-rs. It felt like a very fragile and ugly way to write code.
Rust bindings for Qt are all in a poor state and are likely to remain this way.
Also see: Why was sftpman-gtk rewritten to sftpman-iced?.
When working on this rewrite, we gave Slint a try.
While it seems like a promising UI framework, we weren't sure another commerical Qt clone is an ideal choice.
We also found that Slint yielded very large executables even for simple "Hello world" application.
iced executables are not tiny either, but our complete sftpman-iced
binary appears to be on par with Slint's "Hello world" (~17 MB).
Accessibility support in iced is currently lacking. This is usually an important reason to look past it.
Since we provide a more accessible CLI application (see sftpman) which can serve as a substitute to various handicapped users, we believe the lack of accessibility support is not a deal-breaker for us.
Mounting is done by delegating to the sshfs command line application.
If sshfs
needs to ask you for an SSH key passphrase or password, it will create a dialog box (via ssh-askpass, etc.) that does it.
We start sshfs
on the main thread so that this dialog box can be displayed and interacted with correctly.
Unmounting (running fusermount -u ..
commands, etc.) can more easily be accomplished in the background, but we haven't implemented it because:
-
unmounting is usually quick and doing it sequentially does not impact performance too much
-
we don't yet support displaying multiple error alerts at the same time. If multiple filesystems are being unmounted in parallel and they all error out, we would need to notify you properly (something which we can't do yet).
-
not blocking the main thread while unmounting would allow you to (accidentally) trigger a mount operation while unmounting is still in progress. Handling this gracefully will need further work.
sftpman v2 (and the sftpman-iced GUI frontend) are still mostly-backward compatible with the old Python-based sftpman
software (sftpman-python and the associated sftman-gtk):
-
✅ The old configuration files can be read and used as-is
-
✨ You can now use custom local mount endpoints for filesystems, instead of just the default
/mnt/sshfs/{id}
directory
Also see: Is sftpman v2 compatible with sftpman v1?
sftpman-iced
is built with iced - a cross-platform GUI library for Rust focused on simplicity and type-safety.
The application includes icons from Bootstrap Icons, licensed under the MIT license. See the assets/bootstrap-icons directory.