Project Name | Stars | Downloads | Repos Using This | Packages Using This | Most Recent Commit | Total Releases | Latest Release | Open Issues | License | Language |
---|---|---|---|---|---|---|---|---|---|---|
X11docker | 4,642 | 2 months ago | 10 | mit | Shell | |||||
Run GUI applications and desktops in docker and podman containers. Focus on security. | ||||||||||
Xxh | 4,153 | a month ago | 52 | February 13, 2022 | 18 | bsd-2-clause | Python | |||
🚀 Bring your favorite shell wherever you go through the ssh. | ||||||||||
Webssh | 3,495 | 3 | 2 | 2 days ago | 47 | May 02, 2022 | 108 | mit | Python | |
:seedling: Web based ssh client | ||||||||||
Assh | 2,718 | 1 | a day ago | 29 | May 28, 2022 | 114 | mit | Go | ||
:computer: make your ssh client smarter | ||||||||||
Flightplan | 1,789 | 305 | 35 | 4 years ago | 53 | June 23, 2019 | 20 | mit | JavaScript | |
Run sequences of shell commands against local and remote hosts. | ||||||||||
Git Sync | 1,714 | 15 days ago | 8 | November 09, 2018 | 23 | apache-2.0 | Shell | |||
A sidecar app which clones a git repo and keeps it in sync with the upstream. | ||||||||||
Sshportal | 1,457 | 4 days ago | 45 | February 08, 2022 | 75 | apache-2.0 | Go | |||
:tophat: simple, fun and transparent SSH (and telnet) bastion server | ||||||||||
Goph | 1,296 | 25 | 11 days ago | 2 | October 31, 2021 | 22 | mit | Go | ||
🤘 The native golang ssh client to execute your commands over ssh connection. 🚀🚀 | ||||||||||
Dropbear | 1,266 | 22 days ago | 35 | other | C | |||||
Dropbear SSH | ||||||||||
Orgalorg | 876 | a year ago | 1 | March 31, 2021 | 10 | mit | Go | |||
Parallel SSH commands runner and file synchronization tool |
Xenadu is a tool for remotely managing system configurations, making it possible to keep track of configurations using a version control tool like git. Once your system configuration is managed by Xenadu, it is easy to crank out clone machines.
So let's say you want to use Xenadu to manage a machine on your network named "davidbowie".
Install Xenadu on something other than your target machine (like your laptop):
curl -L https://github.com/iandennismiller/xenadu/tarball/master -o xenadu.tgz
tar xvfz xenadu.tgz
cd iandennismiller-xenadu*
python setup.py install
Make a directory to store your configuration (we'll call it davidbowie, since that's the name of the machine). The files
subdirectory will contain a copy of all the remotely managed files.
mkdir davidbowie
cd davidbowie
mkdir files
Create a host definition file named davidbowie.py
(or whatever you want, but again since this machine is named davidbowie, that's what I'm calling it)
touch ./davidbowie.py
chmod 755 ./davidbowie.py
Edit davidbowie.py, and paste this skeletal host definition file:
#!/usr/bin/env python
from Xenadu import XenaduConfig, Perm
mapping = [
['/etc/hosts', "hosts", Perm.root_644],
['/etc/network/interfaces', "interfaces", Perm.root_644],
]
env = { 'ssh': { "user": "root", "address": "somewhere.example.com" } }
XenaduConfig(globals())
Set the ssh address
to point to your machine.
env = { 'ssh': { "user": "root", "address": "elsewhere.example.com" } }
Also, make sure you are familiar with ssh public key authentication. You need to log in as root in order for Xenadu to function correctly. If you are uncomfortable with being able to log in as root, then make sure your private key is password-protected, and use a ssh keychain manager.
Edit mapping
to list the files you want to track. mapping
is a python list, where each item in the list represents one file on the remote host. An item like ['/etc/network/interfaces', "interfaces", Perm.root_644]
consists of 3 values:
/etc/network/interfaces
is the complete path of the file on the remote hostinterfaces
is the local name of the file, which is in the ./files
directory.Perm.root_644
is the permissions that file should have on the remote host (here, owner is root
and permission is 644
).Grab all of those files from the remote host:
./davidbowie.py --getall
This will automatically go through every item in mapping
and download it to the local ./files
directory.
The files are in ./files
- save this configuration!
git init; git commit -m 'initial davidbowie config'
So let's say you edit ./files/interfaces
and you want to push this to the remote machine. This is way easier with Xenadu than manually copying the file with SSH, which requires you to type out the hostname and the paths for the local and remote files.
./davidbowie.py --push interfaces
Or, if you forget what you call the file locally but remember the remote name, use that:
./davidbowie.py --push /etc/network/interfaces
You'll probably end up learning to use the shorter version for files you commonly deal with.
In the "Getting started" example, /etc/network/interfaces
uses Perm.root_644
to set its permissions to a fairly standard level. What about a file like /etc/sudoers
, which needs stricter permissions? It's pretty easy to create new permission schemes:
# make a new permission
sudoers_perm = {"perm": "0440", "owner": "root", "group": "root"}
# use it as you append the sudoers file to the mapping
mapping.append(['/etc/sudoers', 'sudoers', sudoers_perm])
You could even go so far as to do something like:
mapping.append(['/etc/sudoers', 'sudoers', {"perm": "0440", "owner": "root", "group": "root"}])
In fact, Perm.root_644
is just a convenient equivalent to {"perm": "0644", "owner": "root", "group": "root"}
, so that's what it actually means when you say something like ['/etc/hosts', "hosts", Perm.root_644]
.
In web app development, it's pretty common to have a staging server that is almost identical to the production server. With Xenadu, it's pretty easy to use a single definition file to control both the staging and production servers. Here is a quick example of what you can put at the end of your definition file, right before the XenaduConfig(env, mapping)
directive:
if 'XENADU' in os.environ and os.environ['XENADU'] == 'dev':
env['ssh']['address'] = "dev.example.com"
custom_dev_files = [
['/etc/network/interfaces', "interfaces-dev", Perm.root_644],
]
mapping.extend(custom_dev_files)
XenaduConfig(env, mapping)
Now putting XENADU=dev
before your command will push the development version of /etc/network/interfaces
to dev.example.com
:
XENADU=dev ./davidbowie.py --push /etc/network/interfaces
This is useful because it lets you keep a single version control repository with all of the files for your stage and production server in one place.