thefly
bash/zsh/ksh 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 (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
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/activate
Add in your rc file (.profile .bash_profile .bashrc .zshrc):
. ~/.fly.d/fly source
Get some help
fly help
Plugins management
- add plugin
fly add joknarf/redoclones
https://github.com/joknarf/redoin~/.fly.d/plugins/redoand sources theplugin.<shell>
(all plugins in ~/fly.d/plugins/*/*.plugin.<shell> 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/<id>/.fly.d
files are owned by target user, $FLY_HOME is set to /tmp/.fly.$USER/<id>
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 <user> [shell]
or
$ fsu <user> [shell]
By default uses <user>’s shell.
To another host
ssh connect with interactive shell to another host with your env
$ flyto [<ssh opts>] <user>[<@host>]
or
$ fssh [<ssh opts>] <user>[<@host>]
by default uses <user> 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> # shell in bash ksh zsh
or fbash - fzsh - fksh
Customize env
Putting your env in ~/.fly.d/.flyrc will be automatically sourced (must be compatible with different shells)
Putting additional shell specific env in ~/.fly.d/.<shellname>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 <host> '. <(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 | nerd dynamic customizable nice prompt |
| seedee | access/search dir history with ctrl or shift down arrow, and many more |
| redo | access/search shell history command menu with shift-tab, and many more |
| complete-ng | autocompletion with interactive menu |
| shell-ng | optimized joknarf compilation of the above plugins |
| pgtree | process search / tree / kill command line |
| lsicon | ls command enhancer (colors/icons) |
| 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