16 changed files with 554 additions and 1 deletions
-
2.gitignore
-
3tests/constants.py
-
111tests/sample_configs/config_test
-
15tests/sample_configs/crucial
-
65tests/sample_configs/gist1
-
73tests/sample_configs/gist2
-
21tests/sample_configs/linuxize
-
11tests/sample_configs/nerderati
-
45tests/sample_configs/nixcraft
-
19tests/test_class.py
-
110tests/test_config
-
8tests/test_config_file_read.py
-
17tests/test_config_file_read_write.py
-
9tests/test_config_file_write.py
-
34tests/test_host_class_from_parsed_config.py
-
12tests/test_ssh_config_file_parse.py
@ -1,2 +1,2 @@ |
|||
/tests |
|||
__pycache__ |
|||
/tests/write_test |
|||
@ -0,0 +1,3 @@ |
|||
import os |
|||
|
|||
user_ssh_config_path = os.path.join(os.environ["HOME"], ".ssh", "config") |
|||
@ -0,0 +1,111 @@ |
|||
Host attachpoint |
|||
Hostname 192.168.1.25 |
|||
IdentityFile ~/.ssh/keys/attachpoint |
|||
Port 333 |
|||
User root |
|||
|
|||
Host camille |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/virtual |
|||
Port 2223 |
|||
User raphael |
|||
|
|||
Host camille_tablet |
|||
Hostname 192.168.1.115 |
|||
IdentityFile ~/.ssh/keys/camille_tablet |
|||
Port 8022 |
|||
|
|||
Host cloud |
|||
Hostname rlbr-gcloud.ddns.net |
|||
IdentityFile ~/.ssh/keys/cloud |
|||
User raphael_roberts48 |
|||
|
|||
Host dbox |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/vbox |
|||
Port 2225 |
|||
User raphael |
|||
|
|||
Host downstairs |
|||
Hostname 192.168.1.140 |
|||
IdentityFile ~/.ssh/keys/downstairs-wsl |
|||
Port 2222 |
|||
User server |
|||
|
|||
Host downstairs-windows |
|||
Hostname 192.168.1.140 |
|||
IdentityFile ~/.ssh/keys/downstairs |
|||
User raphael |
|||
|
|||
Host mac_vm |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/virtual |
|||
Port 1984 |
|||
User fuckboi |
|||
|
|||
Host moto |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/moto |
|||
Port 8023 |
|||
|
|||
Host room |
|||
Hostname rlbrhost.ddns.net |
|||
IdentityFile ~/.ssh/keys/room |
|||
Port 22 |
|||
User raphael |
|||
|
|||
Host room-local |
|||
Hostname 192.168.1.120 |
|||
IdentityFile ~/.ssh/keys/room |
|||
User raphael |
|||
|
|||
Host router |
|||
Hostname rlbrhost.ddns.net |
|||
IdentityFile ~/.ssh/keys/router |
|||
Port 1025 |
|||
User root |
|||
|
|||
Host router-local |
|||
Hostname 192.168.1.1 |
|||
IdentityFile ~/.ssh/keys/router |
|||
Port 1025 |
|||
User root |
|||
|
|||
Host termux |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/termux |
|||
Port 8022 |
|||
|
|||
Host termux-lan |
|||
Hostname 192.168.1.121 |
|||
IdentityFile ~/.ssh/keys/termux |
|||
Port 8022 |
|||
|
|||
Host termux-remote |
|||
Hostname rlbr.phone |
|||
IdentityFile ~/.ssh/keys/termux |
|||
ProxyCommand ssh -W %h:%p serveo.net |
|||
|
|||
Host ubuntu |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/virtual |
|||
Port 2226 |
|||
User raphael |
|||
|
|||
Host vbox |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/vbox |
|||
Port 5139 |
|||
User booooooooi |
|||
|
|||
Host wsl |
|||
Hostname rlbrhost.ddns.net |
|||
IdentityFile ~/.ssh/keys/wsl |
|||
Port 2222 |
|||
User raphael |
|||
|
|||
Host wsl-local |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/wsl |
|||
Port 2222 |
|||
User raphael |
|||
@ -0,0 +1,15 @@ |
|||
# My Web Server |
|||
Host web |
|||
User example |
|||
Port 22 |
|||
HostName www.example.com |
|||
ServerAliveInterval 60 |
|||
ServerAliveCountMax 30 |
|||
|
|||
# My Database Server |
|||
Host db |
|||
User example |
|||
Port 22 |
|||
HostName db.example.com |
|||
ServerAliveInterval 60 |
|||
ServerAliveCountMax 30 |
|||
@ -0,0 +1,65 @@ |
|||
#### Example SSH config file |
|||
|
|||
# Host = a list of domains, IPs and personalized aliases that use this config |
|||
# entry. These alias names follow "Host" and are space delimited. |
|||
# e.g. Host 192.168.1.1 example.com example1 myalias1 |
|||
# Hostname = the IP or real hostname |
|||
# e.g. Hostname 192.168.1.1 |
|||
# User = the username |
|||
# e.g. User jdoe |
|||
# Port = if this is a non standard port, i.e. not 22 |
|||
# e.g. Port 2345 |
|||
|
|||
# The above would allow you to use 'ssh exp1' or 'ssh myalias1' which are now |
|||
# both equivalent commands for 'ssh jdoe@192.168.1.1 -p2345' |
|||
|
|||
#### Example entries |
|||
|
|||
# Example 1 |
|||
Host 192.168.1.1 example1 |
|||
Hostname 192.168.1.1 |
|||
# Non standard port |
|||
Port 2222 |
|||
# Enable forwarding |
|||
ForwardAgent yes |
|||
# Proxy forwarding of the connection via 192.168.1.3 |
|||
ProxyCommand ssh jdoe@192.168.1.3 nc %h %p 2> /dev/null |
|||
|
|||
# Example 2 |
|||
Host 192.168.1.2 example2 |
|||
Hostname 192.168.1.2 |
|||
# Enable forwarding |
|||
ForwardAgent yes |
|||
|
|||
###################################### |
|||
# Defaults / catchall options. Add this block to the end of your config file to |
|||
# enable these options for all unspecified connections. |
|||
Host * |
|||
# Default user |
|||
User jdoe |
|||
|
|||
# Default identity, usually id_rsa which will be a sys default anyway. |
|||
IdentityFile ~/.ssh/id_rsa |
|||
|
|||
# Enable compression. |
|||
Compression yes |
|||
|
|||
# Hash known-host names for additional security. |
|||
HashKnownHosts yes |
|||
|
|||
# Keep connection alive may benefit some connections. |
|||
ServerAliveInterval 15 |
|||
ServerAliveCountMax 3 |
|||
|
|||
# Allow local and proxy commands |
|||
PermitLocalCommand yes |
|||
|
|||
# Forward agent for pushing your ssh-agent. You will need to add your ssh key |
|||
# to the authorized_keys file on the remote system. |
|||
# Normally not a great idea to make this a global always on option unless you |
|||
# are sure the remote systems are secure. |
|||
#ForwardAgent yes |
|||
|
|||
# Multiplexing shared connections to improve speed. |
|||
#ControlPath ~/.ssh/master-%l-%r@%h:%p |
|||
#ControlMaster auto |
|||
@ -0,0 +1,73 @@ |
|||
# ssh(1) obtains configuration data from the following sources in the following order: |
|||
# |
|||
# 1. command-line options |
|||
# 2. user's configuration file (~/.ssh/config) |
|||
# 3. system-wide configuration file (/etc/ssh/ssh_config) |
|||
# |
|||
# For each parameter, the first obtained value will be used. The configuration files contain sections separated |
|||
# by “Host” specifications, and that section is only applied for hosts that match one of the patterns given in the |
|||
# specification. The matched host name is the one given on the command line. |
|||
# |
|||
# Since the first obtained value for each parameter is used, more host-specific declarations should be given near |
|||
# the beginning of the file, and general defaults at the end. |
|||
|
|||
# Example for one that uses ssh keys |
|||
# Without specifying IdentityFile it will use the default list |
|||
Host reallysecure reallysecure.example.com |
|||
HostName reallysecure.example.com |
|||
User mysecureuser |
|||
PreferredAuthentications publickey |
|||
PasswordAuthentication no |
|||
KbdInteractiveAuthentication no |
|||
|
|||
# This is used to rsync data over lan |
|||
Host backupserver |
|||
HostName 10.20.30.40 |
|||
User backupuser |
|||
BatchMode yes |
|||
Ciphers arcfour,blowfish-cbc,aes128-ctr |
|||
IdentityFile ~/.ssh/backupserver.pem |
|||
# Generally compression over lan slows things down |
|||
Compression no |
|||
|
|||
|
|||
# See man ssh_config for all options and descriptions, this just lists what may |
|||
# be useful to do on a per-host basis. Defaults from Ubuntu 12.04 |
|||
Host * |
|||
# Can speed up logins to some servers |
|||
GSSAPIAuthentication no |
|||
GSSAPIKeyExchange no |
|||
ChallengeResponseAuthentication no |
|||
HashKnownHosts no |
|||
Protocol 2 |
|||
# Some servers will force log out if you haven't typed anything in a while |
|||
# This means send a packet every 60 seconds, after 3 of those without a |
|||
# response then drop the connection |
|||
ServerAliveCountMax 3 |
|||
ServerAliveInterval 60 |
|||
TCPKeepAlive yes |
|||
#BatchMode [yes|no] # Def: no |
|||
#CheckHostIP [yes|no] # Def: yes - no is useful on a host who's key changes (rebuilding a dev machine) |
|||
#Ciphers (see ssh_config(5)) # (sshv2) Def: (see man page) - (speed: arcfour > blowfish > aes) |
|||
#Compression [yes|no] # Def: no |
|||
#ControlMaster [yes|ask|auto|autoask] # Best to just google ControlMaster or check man pages |
|||
#ControlPath <path> |
|||
#ControlPersist [yes|no] |
|||
#DynamicForward <[bind_addres:]port> # sets up a local socks proxy over ssh |
|||
#ExitOnForwardFailure [yes|no] # Def: no |
|||
#ForwardX11 [yes|no] # Def: no |
|||
#ForwardX11Timeout (see sshd_config "Time Formats") # Def: 20 minutes |
|||
#ForwardX11Trust [yes|no] # Def: yes (debian specific) |
|||
#HostKeyAlias <name> # Useful if have several Host sections for single server |
|||
#HostName [<dns_name>|<ip>] # Also supports %h for given on command line (eg: %h.example.com) |
|||
#IdentityFile <path> # Def: (see ssh_config(5)) - several escape sequences are supported, see man page |
|||
#KbdInteractiveAuthentication [yes|no] # Def: yes - can disable if only using ssh keys |
|||
#LocalForward <[local bind_address:]local_port> <remote_host>:<remote_port> |
|||
# An example that forwards local 8080 to port 8443 on remote server: |
|||
# LocalForward localhost:8080 127.0.0.1:8443 |
|||
#PasswordAuthentication [yes|no] # Def: yes - Another thing to disable if using keys |
|||
#Port <server_port> # Def: 22 |
|||
#PreferredAuthentications <list> # Can set this to 'publickey' to disable all other methods |
|||
#StrictHostKeyChecking [yes|no|ask] # Def: ask |
|||
#VerifyHostKeyDNS [yes|no|ask] # Def: no - useful but rarely used, google it for info |
|||
|
|||
@ -0,0 +1,21 @@ |
|||
Host targaryen |
|||
HostName 192.168.1.10 |
|||
User daenerys |
|||
Port 7654 |
|||
IdentityFile ~/.ssh/targaryen.key |
|||
|
|||
Host tyrell |
|||
HostName 192.168.10.20 |
|||
|
|||
Host martell |
|||
HostName 192.168.10.50 |
|||
|
|||
Host *ell |
|||
user oberyn |
|||
|
|||
Host * !martell |
|||
LogLevel INFO |
|||
|
|||
Host * |
|||
User root |
|||
Compression yes |
|||
@ -0,0 +1,11 @@ |
|||
Host github-project1 |
|||
User git |
|||
HostName github.com |
|||
IdentityFile ~/.ssh/github.project1.key |
|||
Host github-org |
|||
User git |
|||
HostName github.com |
|||
IdentityFile ~/.ssh/github.org.key |
|||
Host github.com |
|||
User git |
|||
IdentityFile ~/.ssh/github.key |
|||
@ -0,0 +1,45 @@ |
|||
### default for all ## |
|||
Host * |
|||
ForwardAgent no |
|||
ForwardX11 no |
|||
ForwardX11Trusted yes |
|||
User nixcraft |
|||
Port 22 |
|||
Protocol 2 |
|||
ServerAliveInterval 60 |
|||
ServerAliveCountMax 30 |
|||
|
|||
## override as per host ## |
|||
Host server1 |
|||
HostName server1.cyberciti.biz |
|||
User nixcraft |
|||
Port 4242 |
|||
IdentityFile /nfs/shared/users/nixcraft/keys/server1/id_rsa |
|||
|
|||
## Home nas server ## |
|||
Host nas01 |
|||
HostName 192.168.1.100 |
|||
User root |
|||
IdentityFile ~/.ssh/nas01.key |
|||
|
|||
## Login AWS Cloud ## |
|||
Host aws.apache |
|||
HostName 1.2.3.4 |
|||
User wwwdata |
|||
IdentityFile ~/.ssh/aws.apache.key |
|||
|
|||
## Login to internal lan server at 192.168.0.251 via our public uk office ssh based gateway using ## |
|||
## $ ssh uk.gw.lan ## |
|||
Host uk.gw.lan uk.lan |
|||
HostName 192.168.0.251 |
|||
User nixcraft |
|||
ProxyCommand ssh nixcraft@gateway.uk.cyberciti.biz nc %h %p 2> /dev/null |
|||
|
|||
## Our Us Proxy Server ## |
|||
## Forward all local port 3128 traffic to port 3128 on the remote vps1.cyberciti.biz server ## |
|||
## $ ssh -f -N proxyus ## |
|||
Host proxyus |
|||
HostName vps1.cyberciti.biz |
|||
User breakfree |
|||
IdentityFile ~/.ssh/vps1.cyberciti.biz.key |
|||
LocalForward 3128 127.0.0.1:3128 |
|||
@ -0,0 +1,19 @@ |
|||
class DictThing: |
|||
def __init__(self, init_dict): |
|||
self.d = init_dict |
|||
|
|||
def __setattr__(self, name, value): |
|||
if name == "d": |
|||
super().__setattr__("d", value) |
|||
else: |
|||
|
|||
self.d[name] = value |
|||
|
|||
def __getattr__(self, name): |
|||
if name == "d": |
|||
return super().__getattribute__("d") |
|||
return self.d[name] |
|||
|
|||
|
|||
if __name__ == "__main__": |
|||
e = DictThing(dict(a="a", b="b", c="c")) |
|||
@ -0,0 +1,110 @@ |
|||
Host attachpoint |
|||
Hostname 192.168.1.25 |
|||
IdentityFile ~/.ssh/keys/attachpoint |
|||
Port 333 |
|||
User root |
|||
|
|||
Host camille |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/virtual |
|||
Port 2223 |
|||
User raphael |
|||
|
|||
Host camille_tablet |
|||
Hostname 192.168.1.115 |
|||
IdentityFile ~/.ssh/keys/camille_tablet |
|||
Port 8022 |
|||
|
|||
Host cloud |
|||
Hostname rlbr-gcloud.ddns.net |
|||
IdentityFile ~/.ssh/keys/cloud |
|||
User raphael_roberts48 |
|||
|
|||
Host dbox |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/vbox |
|||
Port 2225 |
|||
User raphael |
|||
|
|||
Host downstairs |
|||
Hostname 192.168.1.140 |
|||
IdentityFile ~/.ssh/keys/downstairs-wsl |
|||
Port 2222 |
|||
User server |
|||
|
|||
Host downstairs-windows |
|||
Hostname 192.168.1.140 |
|||
IdentityFile ~/.ssh/keys/downstairs |
|||
User raphael |
|||
|
|||
Host mac_vm |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/virtual |
|||
Port 1984 |
|||
User fuckboi |
|||
|
|||
Host moto |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/moto |
|||
Port 8023 |
|||
|
|||
Host room |
|||
Hostname rlbrhost.ddns.net |
|||
IdentityFile ~/.ssh/keys/room |
|||
User raphael |
|||
|
|||
Host room-local |
|||
Hostname 192.168.1.120 |
|||
IdentityFile ~/.ssh/keys/room |
|||
User raphael |
|||
|
|||
Host router |
|||
Hostname rlbrhost.ddns.net |
|||
IdentityFile ~/.ssh/keys/router |
|||
Port 1025 |
|||
User root |
|||
|
|||
Host router-local |
|||
Hostname 192.168.1.1 |
|||
IdentityFile ~/.ssh/keys/router |
|||
Port 1025 |
|||
User root |
|||
|
|||
Host termux |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/termux |
|||
Port 8022 |
|||
|
|||
Host termux-lan |
|||
Hostname 192.168.1.121 |
|||
IdentityFile ~/.ssh/keys/termux |
|||
Port 8022 |
|||
|
|||
Host termux-remote |
|||
Hostname rlbr.phone |
|||
IdentityFile ~/.ssh/keys/termux |
|||
ProxyCommand ssh -W %h:%p serveo.net |
|||
|
|||
Host ubuntu |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/virtual |
|||
Port 2226 |
|||
User raphael |
|||
|
|||
Host vbox |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/vbox |
|||
Port 5139 |
|||
User booooooooi |
|||
|
|||
Host wsl |
|||
Hostname rlbrhost.ddns.net |
|||
IdentityFile ~/.ssh/keys/wsl |
|||
Port 2222 |
|||
User raphael |
|||
|
|||
Host wsl-local |
|||
Hostname localhost |
|||
IdentityFile ~/.ssh/keys/wsl |
|||
Port 2222 |
|||
User raphael |
|||
@ -0,0 +1,8 @@ |
|||
import sys |
|||
|
|||
sys.path.append("..") |
|||
from ssh_config_utils.config_file import ConfigFile |
|||
|
|||
from constants import user_ssh_config_path |
|||
|
|||
config_file = ConfigFile.read_file(user_ssh_config_path) |
|||
@ -0,0 +1,17 @@ |
|||
import sys |
|||
|
|||
sys.path.append("..") |
|||
|
|||
import os |
|||
from ssh_config_utils.config_file import ConfigFile |
|||
|
|||
base = "./sample_configs" |
|||
write_base = "./write_test" |
|||
for file in os.listdir(base): |
|||
print(file) |
|||
fullpath = os.path.join(base, file) |
|||
with open(fullpath, encoding="utf-8") as read_file: |
|||
config_file = ConfigFile.read_file(read_file) |
|||
|
|||
with open(os.path.join(write_base, file), "w", encoding="utf-8") as write_file: |
|||
config_file.write_file(write_file) |
|||
@ -0,0 +1,9 @@ |
|||
import sys |
|||
|
|||
sys.path.append("..") |
|||
from ssh_config_utils.config_file import ConfigFile |
|||
|
|||
from constants import user_ssh_config_path |
|||
|
|||
config_file = ConfigFile.read_file(user_ssh_config_path) |
|||
config_file.write_file("test_config") |
|||
@ -0,0 +1,34 @@ |
|||
import sys |
|||
|
|||
sys.path.append("..") |
|||
import os |
|||
|
|||
from ssh_config_utils.parser import parse_config_text |
|||
from ssh_config_utils.host import Host, GlobalHost |
|||
|
|||
from constants import user_ssh_config_path |
|||
|
|||
with open(user_ssh_config_path) as your_ssh_config_file: |
|||
text = your_ssh_config_file.read() |
|||
data = parse_config_text(text) |
|||
|
|||
|
|||
def from_parsed_config_file(data): |
|||
global_host = None |
|||
hosts = [] |
|||
|
|||
for host_data in data: |
|||
for key, values in host_data.items(): |
|||
if len(values) == 1: |
|||
host_data[key] = values[0] |
|||
if host_data["host"] == "*": |
|||
if global_host is None: |
|||
del host_data["host"] |
|||
global_host = GlobalHost(host_data) |
|||
else: |
|||
name = host_data.pop("host") |
|||
hosts.append(Host(name, host_data)) |
|||
return global_host, hosts |
|||
|
|||
|
|||
global_host, hosts = from_parsed_config_file(data) |
|||
@ -0,0 +1,12 @@ |
|||
import sys |
|||
|
|||
sys.path.append("..") |
|||
import os |
|||
|
|||
from ssh_config_utils.parser import parse_config_text |
|||
|
|||
from constants import user_ssh_config_path |
|||
|
|||
with open(user_ssh_config_path) as your_ssh_config_file: |
|||
text = your_ssh_config_file.read() |
|||
data = parse_config_text(text) |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue