https://github.com/joknarf/thefly
shell teleporter plugin/dotfiles manager (bash/zsh/ksh)
https://github.com/joknarf/thefly
bash dotfiles-manager ksh multihost multiuser plugin-manager shell shell-environment ssh sudo teleportation zsh
Last synced: about 1 month ago
JSON representation
shell teleporter plugin/dotfiles manager (bash/zsh/ksh)
- Host: GitHub
- URL: https://github.com/joknarf/thefly
- Owner: joknarf
- License: mit
- Created: 2024-09-15T22:10:04.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2026-02-28T16:04:48.000Z (about 1 month ago)
- Last Synced: 2026-02-28T18:05:21.804Z (about 1 month ago)
- Topics: bash, dotfiles-manager, ksh, multihost, multiuser, plugin-manager, shell, shell-environment, ssh, sudo, teleportation, zsh
- Language: Shell
- Homepage: https://joknarf.github.io/joknarf-tools
- Size: 197 KB
- Stars: 56
- Watchers: 1
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://joknarf.github.io/joknarf-tools)
[](https://github.com/joknarf/thefly/actions/workflows/release.yml)
[]()
[]()
[](https://shields.io/)
[](https://github.com/joknarf/thefly/releases/latest)
# thefly

bash/zsh/ksh/fish plugin/dotfiles manager and teleporter
Your shell env and plugins are available everywhere (hosts/users)
bzzz bzzz !
What's the point to have a fine tuned local shell environment if you lose it as soon as you connect to another server / sudo to another user ?
## Demo

## features
Keep your full shell environment anywhere you go.
* supports bash / zsh / ksh / fish (on Linux / MacOS / ...)
* multi-shell plugin manager to install / update / uninstall shell plugins
* multi-shell dotfiles manager
* teleport dotfiles and plugins through sudo (`flyas`)
* teleport dotfiles and plugins through ssh (`flyto`)
* force specific destination shell when sudo or ssh (not using target user shell)
* create a single pak env file including dotfiles and plugins to be used anywhere (`flypack >pak`, `. ./pak`)
## Install
```
. <(curl https://raw.githubusercontent.com/joknarf/thefly/main/thefly) install
```
or
```
git clone https://github.com/joknarf/thefly
. thefly/thefly install
```
Creates `~/.fly.d/fly` and activate thefly manager for current user
under `fish` do not source, execute `thefly install` then `. ~/.fly.d/fly.fish activate`
or use your prefered method according to your OS:
```
brew install joknarf/tools/thefly
```
```
sudo dnf install https://github.com/joknarf/thefly/releases/latest/download/thefly.rpm
```
```
curl -OL https://github.com/joknarf/thefly/releases/latest/download/thefly.deb
sudo dpkg -i thefly.deb
```
```
curl -OL https://github.com/joknarf/thefly/releases/latest/download/thefly.apk
sudo apk add --allow-untrusted thefly.apk
```
```
curl -OL https://github.com/joknarf/thefly/releases/latest/download/thefly.pkg
sudo installer -pkg thefly.pkg -target /
```
then run:
```
thefly install
. ~/.fly.d/fly activate
```
Add in your rc file (.profile .bash_profile .bashrc .zshrc):
```
. ~/.fly.d/fly source
```
for `fish` add in your `.config/fish/config.fish`:
```
. ~/.fly.d/fly.fish source
```
Get some help
```
fly help
```
## Plugins management
* add plugin
```
fly add joknarf/redo
```
clones `https://github.com/joknarf/redo` in `~/.fly.d/plugins/redo` and sources the `plugin.`
(all plugins in `~/fly.d/plugins/*/*.plugin.` will be sourced at login with `fly source` in your shell rc file)
* update plugin
```
fly update [plugin]
```
* remove plugin
```
fly del [plugin]
```
* update user fly
```
fly upgrade
```
## Teleport plugins/shell env
thefly is able to duplicate your .fly.d directory through sudo and ssh to login with your full environment.
When teleporting the .fly.d is duplicated (without cvs files/tests) in :
```
/tmp/.fly.$USER//.fly.d
```
files are owned by target user, `$FLY_HOME` is set to `/tmp/.fly.$USER/`
You can use all teleport method multiple times (`flyto host` then `flyas user`...)
### To another user
sudo login interactive shell to another user with your env
(current user need to have sudo privilege to target user)
```
$ flyas [shell]
or
$ fsu [shell]
```
By default uses ``'s shell.
### To another host
ssh connect with interactive shell to another host with your env
```
$ flyto [] [<@host>]
or
$ fssh [] [<@host>]
```
by default uses `` shell, to force your favorite shell use `fsshb` (bash) - `fsshz` (zsh) - `fsshk` (ksh)
### To another shell
Change current shell and load your env/plugins :
```
$ flysh # shell in bash ksh zsh
```
or `fbash` - `fzsh` - `fksh`
## Customize env
* You can use `FLY_TMPDIR` variable to set the teleportation destination directory instead of default `/tmp` (/tmp could be mounted as noexec, or being full...):
```
FLY_TMPDIR=/var/tmp
flyto myserver
flyas myuser
````
* `FLY_TARZ` variable can be set to customize tar compression used for teleportation (default `-z` uses gzip, recommended `-J` to use xz is your servers have xz installed).
`thefly` is using a ssh embedded RemoteCommand containing compressed tar/base64 of your `.fly.d` if size under 128K (maximum command size), if size exceeds 128K, thefly will need to connect twice (once to transfer fly package, then spawn shell)
* Putting your env in `~/.fly.d/.flyrc` will be automatically sourced (must be compatible with different shells, using fish won't source `.flyrc`)
* Putting additional shell specific env in `~/.fly.d/.rc` (.bashrc/.kshrc/.zshrc), will be automatically sourced for shell.
anything in `~/.fly.d` will be available through ssh/sudo (flyto/flyas) in `$FLY_HOME/.fly.d`
For example, just put your `.vimrc` in `~/.fly.d` and add in `~/.fly.d/.flyrc`:
```
export VIMINIT="source $FLY_HOME/.fly.d/.vimrc"
```
same for `.inputrc`, put it in `~/.fly.d` and add in `~/.fly.d/.flyrc`:
```
export INPUTRC="$FLY_HOME/.fly.d/.inputrc"
```
You can create a `.fly.d/bin` directory and put scripts you want to teleport and add in your `.fly.d/.flyrc`:
```
export PATH="$PATH:$FLY_HOME/.fly.d/bin"
```
## Standalone fly package
Save your whole shell environment to use everywhere with standalone fly package.
All your ~/.fly.d environment saved in autoextractable file. The fly package enables your env when sourced.
Build your fly package (you can copy and use it directly to get your env or make it available on web server to remote download)
```
flypack >fly.pak
```
Then use your fly.pak anywhere :
`. ./fly.pak` : to activate your environment (in `/tmp/.fly.$USER`)
`. ./fly.pak install` : to extract in ~/.fly.d and activate
To activate from url:
```
. <(curl -sL https://raw.githubusercontent.com/joknarf/flypack/main/fly.pak)
```
to connect to a server with your env in `/tmp/.fly.$USER`, your can use:
```
$ ssh -t '. <(curl -sL https://raw.githubusercontent.com/joknarf/flypack/main/fly.pak) [bash|ksh|zsh]'
```
Connect to all servers with your fly pak from url with ssh config:
```
RequestTTY yes
RemoteCommand . <(curl -sL https://raw.githubusercontent.com/joknarf/flypack/main/fly.pak)
```
## Activate from git repo or url
put your .fly.d directory into a git repo and activate all your env/plugins in your current user
```
. <(curl https://raw.githubusercontent.com/joknarf/thefly/main/thefly) install joknarf/myfly
```
create a tgz file with your .fly.d exposed on web server and activate env/plugins in your current user
```
. <(curl https://raw.githubusercontent.com/joknarf/thefly/main/thefly) install https://myserver/myfly.tgz
```
## joknarf cool plugins
```
$ fly add joknarf/nerdp # bash/ksh/zsh nerd prompt
$ fly add joknarf/seedee # bash/ksh/zsh cd history
$ fly add joknarf/redo # bash/zsh command history
$ fly add joknarf/complete-ng # bash/zsh completion next-gen
or just add the optimized compilation of these shell plugins using just:
$ fly add joknarf/shell-ng
$ fly add joknarf/pgtree # bash/ksh/zsh process hierarchy
$ fly add joknarf/lsicon # ls enhancer (colors/icons)
$ fly add joknarf/dfbar # df enhancer (colors/usage bar)
```
|link |description |
|-----------------------------------------------------|------------------------------------------------------------------------|
|[nerdp](https://github.com/joknarf/nerdp) |nerd dynamic customizable nice prompt |
|[seedee](https://github.com/joknarf/seedee) |access/search dir history with ctrl or shift down arrow, and many more |
|[redo](https://github.com/joknarf/redo) |access/search shell history command menu with shift-tab, and many more |
|[complete-ng](https://github.com/joknarf/complete-ng)|autocompletion with interactive menu |
|__[shell-ng](https://github.com/joknarf/shell-ng)__ |__optimized joknarf compilation of the above plugins__ |
|[pgtree](https://github.com/joknarf/pgtree) |process search / tree / kill command line |
|[lsicon](https://github.com/joknarf/lsicon) |ls command enhancer (colors/icons) |
|[dfbar](https://github.com/joknarf/dfbar) |df command enhancer (colors/usage bar) |
## Don't teleport a human with your fly !
Remember that `~/.fly.d` directory will be duplicated in `/tmp` when teleporting, don't put huge data in your `~/.fly.d` directory, the consequences could be dramatic ! (ask Jeff G. ;-)
By choice, the `/tmp/.fly.$USER` is not removed at end of shell session, as multiple session may use the same fly env (other choice would be to duplicate same .fly.d for each session but can be overkill)
The files will remain and will be only be cleared by OS tmpfiles mechanism, the ideal size is to stay below 128K.
(typically thefly will use a ssh config RemoteCommand for the duplication+connect, but if size is over 128K, will use 2 ssh connection, ssh duplicate + ssh interactive connect)
Bzzz Bzzz