SSH tunnels to remote server.

Overview

CircleCI AppVeyor Documentation Status coveralls version

pyversions license

Author: Pahaz

Repo: https://github.com/pahaz/sshtunnel/

Inspired by https://github.com/jmagnusson/bgtunnel, which doesn't work on Windows.

See also: https://github.com/paramiko/paramiko/blob/master/demos/forward.py

Requirements

Installation

sshtunnel is on PyPI, so simply run:

pip install sshtunnel

or

easy_install sshtunnel

or

conda install -c conda-forge sshtunnel

to have it installed in your environment.

For installing from source, clone the repo and run:

python setup.py install

Testing the package

In order to run the tests you first need tox and run:

python setup.py test

Usage scenarios

One of the typical scenarios where sshtunnel is helpful is depicted in the figure below. User may need to connect a port of a remote server (i.e. 8080) where only SSH port (usually port 22) is reachable.

----------------------------------------------------------------------

                            |
-------------+              |    +----------+
    LOCAL    |              |    |  REMOTE  | :22 SSH
    CLIENT   | <== SSH ========> |  SERVER  | :8080 web service
-------------+              |    +----------+
                            |
                         FIREWALL (only port 22 is open)

----------------------------------------------------------------------

Fig1: How to connect to a service blocked by a firewall through SSH tunnel.

If allowed by the SSH server, it is also possible to reach a private server (from the perspective of REMOTE SERVER) not directly visible from the outside (LOCAL CLIENT's perspective).

----------------------------------------------------------------------

                            |
-------------+              |    +----------+               +---------
    LOCAL    |              |    |  REMOTE  |               | PRIVATE
    CLIENT   | <== SSH ========> |  SERVER  | <== local ==> | SERVER
-------------+              |    +----------+               +---------
                            |
                         FIREWALL (only port 443 is open)

----------------------------------------------------------------------

Fig2: How to connect to PRIVATE SERVER through SSH tunnel.

Usage examples

API allows either initializing the tunnel and starting it or using a with context, which will take care of starting and stopping the tunnel:

Example 1

Code corresponding to Fig1 above follows, given remote server's address is pahaz.urfuclub.ru, password authentication and randomly assigned local bind port.

from sshtunnel import SSHTunnelForwarder

server = SSHTunnelForwarder(
    'alfa.8iq.dev',
    ssh_username="pahaz",
    ssh_password="secret",
    remote_bind_address=('127.0.0.1', 8080)
)

server.start()

print(server.local_bind_port)  # show assigned local port
# work with `SECRET SERVICE` through `server.local_bind_port`.

server.stop()

Example 2

Example of a port forwarding to a private server not directly reachable, assuming password protected pkey authentication, remote server's SSH service is listening on port 443 and that port is open in the firewall (Fig2):

import paramiko
import sshtunnel

with sshtunnel.open_tunnel(
    (REMOTE_SERVER_IP, 443),
    ssh_username="",
    ssh_pkey="/var/ssh/rsa_key",
    ssh_private_key_password="secret",
    remote_bind_address=(PRIVATE_SERVER_IP, 22),
    local_bind_address=('0.0.0.0', 10022)
) as tunnel:
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect('127.0.0.1', 10022)
    # do some operations with client session
    client.close()

print('FINISH!')

Example 3

Example of a port forwarding for the Vagrant MySQL local port:

from sshtunnel import open_tunnel
from time import sleep

with open_tunnel(
    ('localhost', 2222),
    ssh_username="vagrant",
    ssh_password="vagrant",
    remote_bind_address=('127.0.0.1', 3306)
) as server:

    print(server.local_bind_port)
    while True:
        # press Ctrl-C for stopping
        sleep(1)

print('FINISH!')

Or simply using the CLI:

(bash)$ python -m sshtunnel -U vagrant -P vagrant -L :3306 -R 127.0.0.1:3306 -p 2222 localhost

Example 4

Opening an SSH session jumping over two tunnels. SSH transport and tunnels will be daemonised, which will not wait for the connections to stop at close time.

import sshtunnel
from paramiko import SSHClient


with sshtunnel.open_tunnel(
    ssh_address_or_host=('GW1_ip', 20022),
    remote_bind_address=('GW2_ip', 22),
) as tunnel1:
    print('Connection to tunnel1 (GW1_ip:GW1_port) OK...')
    with sshtunnel.open_tunnel(
        ssh_address_or_host=('localhost', tunnel1.local_bind_port),
        remote_bind_address=('target_ip', 22),
        ssh_username='GW2_user',
        ssh_password='GW2_pwd',
    ) as tunnel2:
        print('Connection to tunnel2 (GW2_ip:GW2_port) OK...')
        with SSHClient() as ssh:
            ssh.connect('localhost',
                port=tunnel2.local_bind_port,
                username='target_user',
                password='target_pwd',
            )
            ssh.exec_command(...)

CLI usage

$ sshtunnel --help
usage: sshtunnel [-h] [-U SSH_USERNAME] [-p SSH_PORT] [-P SSH_PASSWORD] -R
                 IP:PORT [IP:PORT ...] [-L [IP:PORT [IP:PORT ...]]]
                 [-k SSH_HOST_KEY] [-K KEY_FILE] [-S KEY_PASSWORD] [-t] [-v]
                 [-V] [-x IP:PORT] [-c SSH_CONFIG_FILE] [-z] [-n]
                 [-d [FOLDER [FOLDER ...]]]
                 ssh_address

Pure python ssh tunnel utils
Version 0.4.0

positional arguments:
  ssh_address           SSH server IP address (GW for SSH tunnels)
                        set with "-- ssh_address" if immediately after -R or -L

optional arguments:
  -h, --help            show this help message and exit
  -U SSH_USERNAME, --username SSH_USERNAME
                        SSH server account username
  -p SSH_PORT, --server_port SSH_PORT
                        SSH server TCP port (default: 22)
  -P SSH_PASSWORD, --password SSH_PASSWORD
                        SSH server account password
  -R IP:PORT [IP:PORT ...], --remote_bind_address IP:PORT [IP:PORT ...]
                        Remote bind address sequence: ip_1:port_1 ip_2:port_2 ... ip_n:port_n
                        Equivalent to ssh -Lxxxx:IP_ADDRESS:PORT
                        If port is omitted, defaults to 22.
                        Example: -R 10.10.10.10: 10.10.10.10:5900
  -L [IP:PORT [IP:PORT ...]], --local_bind_address [IP:PORT [IP:PORT ...]]
                        Local bind address sequence: ip_1:port_1 ip_2:port_2 ... ip_n:port_n
                        Elements may also be valid UNIX socket domains:
                        /tmp/foo.sock /tmp/bar.sock ... /tmp/baz.sock
                        Equivalent to ssh -LPORT:xxxxxxxxx:xxxx, being the local IP address optional.
                        By default it will listen in all interfaces (0.0.0.0) and choose a random port.
                        Example: -L :40000
  -k SSH_HOST_KEY, --ssh_host_key SSH_HOST_KEY
                        Gateway's host key
  -K KEY_FILE, --private_key_file KEY_FILE
                        RSA/DSS/ECDSA private key file
  -S KEY_PASSWORD, --private_key_password KEY_PASSWORD
                        RSA/DSS/ECDSA private key password
  -t, --threaded        Allow concurrent connections to each tunnel
  -v, --verbose         Increase output verbosity (default: ERROR)
  -V, --version         Show version number and quit
  -x IP:PORT, --proxy IP:PORT
                        IP and port of SSH proxy to destination
  -c SSH_CONFIG_FILE, --config SSH_CONFIG_FILE
                        SSH configuration file, defaults to ~/.ssh/config
  -z, --compress        Request server for compression over SSH transport
  -n, --noagent         Disable looking for keys from an SSH agent
  -d [FOLDER [FOLDER ...]], --host_pkey_directories [FOLDER [FOLDER ...]]
                        List of directories where SSH pkeys (in the format `id_*`) may be found
Comments
  • Hangs with Python 3.7

    Hangs with Python 3.7

    I'm using SSHTunnelForwarder with Python 3.7. After finishing my work, I run server.stop() and hangs.

    I believe it caused by socketserver.ThreadingMixIn https://docs.python.org/3.7/library/socketserver.html#socketserver.ThreadingMixIn

    Changed in version 3.7: socketserver.ForkingMixIn.server_close() and socketserver.ThreadingMixIn.server_close() now waits until all child processes and non-daemonic threads complete. Add a new socketserver.ForkingMixIn.block_on_close class attribute to opt-in for the pre-3.7 behaviour.

    Here's my work around. I changed the attribute server._server_list[0].block_on_close = False, and it behave like usual. It closed normally and not being hang.

    I'm not sure if setting block_on_close = False is a good way or not.

    Issue #135 may have the same cause.

    bug 
    opened by cjltsod 31
  • psycopg2 conn.poll() hangs when used with sshtunnel

    psycopg2 conn.poll() hangs when used with sshtunnel

    Hello

    I am using psycopg2 2.7.4 to connect to the PostgreSQL database server using asynchronous support. It is working absolutely fine. I have used sshtunnel v0.1.3 in pgAdmin4. When I connect the PostgreSQL database server using ssh tunnel and run the valid/correct query it works fine, but when I run any wrong query(invalid column of table) my application gets hang on conn.poll() function.

    Please refer the code how we use conn.poll() with timeouts https://git.postgresql.org/gitweb/?p=pgadmin4.git;a=blob;f=web/pgadmin/utils/driver/psycopg2/connection.py;h=4f11c12b30882209c308cb3558e67189c97ea31e;hb=15fe26a7106610b710f3de5b604cd038302c926a#l1363

    Can anyone please provide some pointers, suggestions? Similar question I have asked on psycopg2 ML.

    To figure out the solution, I have performed following test case:

    • Issue is reproducible only when server is connected using SSH Tunnel and any wrong query will be executed.
    • Create SSH Tunnel using ssh command "ssh -L 3333:127.0.0.1:5444 172.16.195.213". Create new server with Host = 127.0.0.1 and port = 3333. Open Query Tool and run the wrong query. Issue is not reproducible.
    • Enable logging of sshtunnel module by providing logger object in SSHTunnelForwarder() call. No useful logs found.
    • Enable logging of psycopg2 connection. No useful logs found.

    Note: I have verified the database server log and every time query gets executed.

    question wontfix 
    opened by akshay-joshi 16
  • Script won't exit because paramiko thread is still running

    Script won't exit because paramiko thread is still running

    The following script works and "FINISH" is printed, but it never exits to the shell:

    import threading
    
    from sshtunnel import SSHTunnelForwarder
    
    with SSHTunnelForwarder(
        "localhost",
        ssh_username="localuser",
        ssh_password="localpass",
        remote_bind_address=('127.0.0.1', 5984),
        local_bind_address=('127.0.0.1', 9000)
    ) as server:
    
        print(server.local_bind_port)
        # these don't help
        # server.stop()
        # server.close()
    
    # [t.close() for t in threading.enumerate() if t.__class__.__name__ == "Transport"]
    
    print('FINISH!')
    

    Python is waiting on threads to finish, but they never do. After running this script in iPython I can see the threads:

    threading.enumerate()
    [<_MainThread(MainThread, started 140735243972608)>,
     <HistorySavingThread(IPythonHistorySavingThread, started 123145307557888)>,
     <paramiko.Transport at 0x3880470 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>,
     <paramiko.Transport at 0x3874630 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>,
     <paramiko.Transport at 0x3191ba8 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>,
     <paramiko.Transport at 0x3874550 (cipher aes128-ctr, 128 bits) (active; 0 open channel(s))>,
     <paramiko.Transport at 0x3191c88 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>,
     <paramiko.Transport at 0x387bac8 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>,
     <paramiko.Transport at 0x3803e48 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>,
     <paramiko.Transport at 0x3874f60 (cipher aes128-ctr, 128 bits) (connected; awaiting auth)>]
    

    If I uncomment the last line which explicitly closes the paramiko.Transport threads, the script exits correctly. It seems like I'm missing something, but even so this default behavior is confusing.

    bug 
    opened by jsheedy 16
  • sshtunnel 0.7

    sshtunnel 0.7

    Since the addition of is_use_local_check_up parameter in 64af238 the default behaviour is not to check the local side of the tunnel. I see here two issues:

    • Being not backwards compatible with versions prior to 0.0.5 (which may be a decision made by @pahaz which I respect)
    • Not being able to set directly the way we want it to behave. Now we've first to create an SSHTunnelForwarder object, then change its is_use_local_check_up value to True.

    I added a new method for SSHTunnelForwarder to force those checks.

    opened by fernandezcuesta 15
  • Connection to remote MySQL db from Python 3.4

    Connection to remote MySQL db from Python 3.4

    Hi All, I posted a question about using SSH Tunnel on Stack Exchange recently, but I'm not sure if that was the right place for it (and I didn't get any answer). Would it have been better to post it on here? This is the "Issues" section which doesn't really seem right... I'm a bit lost :-(

    Thanks in advance. Stuart.

    question 
    opened by stuart258 14
  • User private keys are not found in default directory

    User private keys are not found in default directory

    This line of code

    https://github.com/pahaz/sshtunnel/blob/bd4ae32344a3a68ce27b1ad27c992687613b3182/sshtunnel.py#L1021

    prevents the or at

    https://github.com/pahaz/sshtunnel/blob/bd4ae32344a3a68ce27b1ad27c992687613b3182/sshtunnel.py#L1026

    to kick in and allow for DEFAULT_SSH_DIRECTORY to be searched. With the result that no keys are found even when there are plenty!

    bug 
    opened by mapio 13
  • Added silent setting to prevent raising exceptions

    Added silent setting to prevent raising exceptions

    When running sshtunnel as a thread, exceptions from the handler are printed to the console directly. This is often not a desired feature, since the console will become cluttered by error messages for any connection in error -- even when the majority of connections are successful. This pull request adds a boolean flag silent, that suppresses the exceptions while continuing to correctly log these errors using the Python logging module.

    With the addition of the logging.raiseExceptions flag, sshtunnel can now be operated in a completely silent way.

    import paramiko
    from sshtunnel import *
    import logging
    
    logging.raiseExceptions = False
    
    server = SSHTunnelForwarder(
        ssh_address=('1.2.3.4', 22),
        ssh_username='username',
        ssh_private_key=paramiko.RSAKey.from_private_key_file('...'),
        remote_bind_address=('127.0.0.1', 80),
        local_bind_address=('127.0.0.1', 80),
        silent=True,
    )
    
    server.start()
    
    question 
    opened by cjermain 12
  • Is there a way to make it work with Pageant on Windows ?

    Is there a way to make it work with Pageant on Windows ?

    I could not manage it.. Has anybody tried that ? Which options should be used ?

    I was (seemingly) able to connect to SSH using paramiko with Pageant, but I could not establish working tunnel for MySQL

    I can provide more details if anyone is interested.

    enhancement question 
    opened by 62mkv 11
  • [Regression] script hangs in 0.2.0, not 0.1.5 when not using context manager

    [Regression] script hangs in 0.2.0, not 0.1.5 when not using context manager

    I'm finding that my scripts are hanging forever even after I close the tunnel. This happens in versions 0.2.1 and 0.2.0, but not 0.1.5. So I think something has happened to break this.

    Note that in my use case I do not want to use a context manager. I'm deploying inside an AWS Lambda function, and I want to cache the connection between Lambda invocations, which means I need to assign the tunnel object to a global variable. I also have some unit tests with the unittest module's setUp() and tearDown() functions.

    The difference between .start() and the context manager seems to be:

    .daemon_forward_servers = True
    .daemon_transport = True
    

    What's the meaning of these parameters? Why are the defaults different between context manager and a function?

    Steps to reproduce

    We'll SSH to localhost, so run:

    ssh key-gen
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    

    Then run this script:

    from sshtunnel import SSHTunnelForwarder
    from time import sleep
    
    server = SSHTunnelForwarder(
        ssh_address_or_host='localhost',
        remote_bind_address=('localhost', 80),
        local_bind_address=('localhost', 8088),
        ssh_username='ec2-user',
        ssh_port=22,
        ssh_pkey='~/.ssh/epic_ssh_unit_test_key.private',
        ssh_config_file=None,
        allow_agent=False,
        set_keepalive=10,
        threaded=True
    )
    print("About to start")
    server.start()
    
    while not server.is_active:
        sleep(1)
        
    print("SSH up")
    
    server.stop()
    while server.is_active:
        sleep(1)
    print("Server stopped")
    

    If I add:

    server.daemon_forward_servers = True
    server.daemon_transport = True
    

    just before server.start() then it does work.

    Note that it does work with the context manager:

    import sshtunnel
    
    with sshtunnel.open_tunnel(
            ssh_address_or_host='localhost',
            remote_bind_address=('localhost', 80),
            local_bind_address=('localhost', 8088),
            ssh_username='ec2-user',
            ssh_port=22,
            ssh_pkey='~/.ssh/epic_ssh_unit_test_key.private',
            ssh_config_file=None,
            allow_agent=False,
            set_keepalive=10,
            threaded=True
        ) as tunnel:
    
        print("SSH up")
    
    print("Server stopped")
    

    I think this is related to #169 , but hard to tell since there's no detail there.

    bug duplicate wontfix 
    opened by mdavis-xyz 10
  • Tunnel hangs on database connect

    Tunnel hangs on database connect

    I'm connecting to a variety of database (Oracle, PostgreSQL und MS SQL) via SQLAlchemy. Connecting to an Oracle database makes the tunnel hang. This does not happen for PostgreSQL or MS SQL or when using plink to create the tunnel.

    I've created a trace log.

    oracle-hang.txt

    This is Python 3.6.2 64-bit on Windows. All modules have the latest version. Regards, Thorsten

    paramiko issue? 
    opened by thorstenkampe 10
  • SSHTunnelForwarder closing deadlocks if tunnel leads to self and a connection is left open

    SSHTunnelForwarder closing deadlocks if tunnel leads to self and a connection is left open

    This is a bit of a heisenbug. If I open a tunnel on my laptop from localhost:65000 to dbserver:1521 through server jumpserv, and then open a connection through it (in my case it was cx_Oracle accessing dbserver), closing the SSHTunnelForwarder without closing the dbserver connection prior works fine - the connection drops and the closing finishes. However, if the same tunnel is opened on jumpserv, from localhost:6500 to server dbserver:1521 through server jumpserv, and then I open the same connection through it, closing the SSHTunnelForwarder without closing the dbserver connection prior leads to a deadlock. This can lead to strange behaviour, as the same code works fine when executed on one machine and deadlocks on another. If you'd like, I can try to provide minimal code samples.

    bug 
    opened by chedatomasz 9
  • Modern packaging

    Modern packaging

    It would be nice if sshtunnel was packaged in a more modern way - inside it's own sshtunnel package directory with __init__.py, and the ability to break up the package into multiple .py modules. I also believe this would be helpful with adding of mypy static type checking support.

    opened by keithel-qt 1
  • Add types and type checking so mypy type checking is happy

    Add types and type checking so mypy type checking is happy

    Mypy is presently not happy with sshtunnel, as it is not annotated with python types in it's variables and function signatures.

    If you try importing sshtunnel in a project, and you run mypy against it, you will get messages similar to this:

    myproject/ssh_tunnel.py:2: error: Skipping analyzing "sshtunnel": module is installed, but missing library stubs or py.typed marker
    myproject/main.py:13: error: Skipping analyzing "sshtunnel": module is installed, but missing library stubs or py.typed marker
    myproject/main.py:13: note: See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports
    Found 2 errors in 2 files (checked 32 source files)
    [cargo-make] ERROR - Error while executing command, exit code: 1
    [cargo-make] WARN - Build Failed.
    

    I created this issue to track progress of sshtunnel working well with Mypy - being able to check sshtunnel's static typing. This also would encompass adding static typing to sshtunnel, which will aid testing.

    opened by keithel-qt 0
  • opentunnel with -N parameter

    opentunnel with -N parameter

    Hello dear

    I am working on a client-side connection that will open a tunnel on a server with a user that doesn't have permission to run command and the user only can use port forwarding so on client-side ssh most run with the -N argument

    now where I open my tunnel the tunnel will close by the server because the ssh tunnel didn't pass -N

    how can I solve this issue?

    opened by B14ckP4nd4 0
  • SSHTunnel able to log in even with wrong credentials

    SSHTunnel able to log in even with wrong credentials

    I'm trying to use SSH agent to tunnel to a remote machine, but I want to explicitly ONLY allow key-based authentication (from the client side) based on a key passed in at runtime, not based off of whatever the OS has saved at the time. However, SSHTunnelForwarder appears to be ignoring these directives and is successfully connecting every time, even when I deliberately pass in the incorrect key. Minimum viable example below:

    import time
    
    from sshtunnel import SSHTunnelForwarder
    
    tunnel = SSHTunnelForwarder(
        'my.server.ip.address',
        ssh_config_file=None,
        ssh_username='edgeot',
        ssh_pkey='/home/fshriver/test_keys/test_key',
        local_bind_address=('127.0.0.1', 9555),
        remote_bind_address=('127.0.0.1', 9555),
        allow_agent=False
    )
    
    tunnel.start()
    
    print(tunnel.tunnel_is_up)
    
    time.sleep(10)
    
    tunnel.close()
    

    As stated, if I've ssh'd into the server before then sshtunnel will never fail to ssh in, even when I change the key to some non-existent filepath. I believe this is because it's still using the ssh agent, but my understanding is allow_agent=False should disable that. Is that incorrect behavior? Am I missing something?

    opened by fshriver 0
Releases(0.4.0)
  • 0.4.0(Jan 11, 2021)

    • Change the daemon mod flag for all tunnel threads to prevent unexpected hangs (#219) (is not fully backward compatible!)
    • Add docker based end to end functional tests for Mongo/Postgres/MySQL (#219)
    • Add docker based end to end hangs tests (#219)
    Source code(tar.gz)
    Source code(zip)
  • 0.3.2(Jan 11, 2021)

  • 0.3.1(Nov 15, 2020)

  • 0.3.0(Nov 15, 2020)

    • Change default with context behavior to use .stop(force=True) on exit (is not fully backward compatible)
    • Remove useless daemon_forward_servers = True hack for hangs prevention (is not fully backward compatible)
    • Set transport keepalive to 5 second by default (disabled for version < 0.3.0)
    • Set default transport timeout to 0.1
    • Deprecate and remove block_on_close option
    • Fix "deadlocks" / "tunneling hangs" (#173, #201, #162, #211)
    Source code(tar.gz)
    Source code(zip)
  • 0.2.2(Oct 31, 2020)

  • 0.2.1(Oct 24, 2020)

    v.0.2.1

    • Fixes bug with orphan thread for a tunnel that is DOWN (#170). (@pahaz, @eddie-chiang and @kkrasovskii)

    NOTE:: regression https://github.com/pahaz/sshtunnel/issues/201

    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Oct 24, 2020)

    v.0.2.0

    • Support IPv6 without proxy command. Use built-in paramiko create socket logic. The logic tries to use ipv6 socket family first, then ipv4 socket family. (Georgy Rylov) https://github.com/pahaz/sshtunnel/pull/195

    NOTE: possible regression https://github.com/pahaz/sshtunnel/issues/201

    Source code(tar.gz)
    Source code(zip)
  • 0.0.7.3(Feb 16, 2015)

Owner
Pavel White
Entrepreneurship. Founder and CTO of 8IQ Software. FullStack DevOps Security Engineer %) And IT 💘lover
Pavel White
Manage your SSH like a boss.

--- storm is a command line tool to manage your ssh connections. features adding, editing, deleting, listing, searching across your SSHConfig. command

Emre Yılmaz 3.9k Jan 3, 2023
Asynchronous parallel SSH client library.

parallel-ssh Asynchronous parallel SSH client library. Run SSH commands over many - hundreds/hundreds of thousands - number of servers asynchronously

null 1.1k Dec 31, 2022
SSH to WebSockets Bridge

wssh wssh is a SSH to WebSockets Bridge that lets you invoke a remote shell using nothing but HTTP. The client connecting to wssh doesn't need to spea

Andrea Luzzardi 1.3k Dec 25, 2022
Simple, Pythonic remote execution and deployment.

Welcome to Fabric! Fabric is a high level Python (2.7, 3.4+) library designed to execute shell commands remotely over SSH, yielding useful Python obje

Fabric 13.8k Jan 6, 2023
Remote Desktop Protocol in Twisted Python

RDPY Remote Desktop Protocol in twisted python. RDPY is a pure Python implementation of the Microsoft RDP (Remote Desktop Protocol) protocol (client a

Sylvain Peyrefitte 1.6k Dec 30, 2022
Cobbler is a versatile Linux deployment server

Cobbler Cobbler is a Linux installation server that allows for rapid setup of network installation environments. It glues together and automates many

Cobbler 2.4k Dec 24, 2022
gunicorn 'Green Unicorn' is a WSGI HTTP Server for UNIX, fast clients and sleepy applications.

Gunicorn Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It's a pre-fork worker model ported from Ruby's Unicorn project. The Gunicorn

Benoit Chesneau 8.7k Jan 8, 2023
A lobby boy will create a VPS server when you need one, and destroy it after using it.

Lobbyboy What is a lobby boy? A lobby boy is completely invisible, yet always in sight. A lobby boy remembers what people hate. A lobby boy anticipate

null 226 Dec 29, 2022
Some automation scripts to setup a deployable development database server (with docker).

Postgres-Docker Database Initializer This is a simple automation script that will create a Docker Postgres database with a custom username, password,

Pysogge 1 Nov 11, 2021
📦 Powerful Package manager which updates plugins & server software for minecraft servers

pluGET A powerful package manager which updates Plugins and Server Software for minecraft servers. Screenshots check all to check installed plugins fo

null 106 Dec 16, 2022
This Docker container is build to run on a server an provide an easy to use interface for every student to vote for their councilors

This Docker container is build to run on a server and provide an easy to use interface for every student to vote for their councilors.

Robin Adelwarth 7 Nov 23, 2022
SSH-Restricted deploys an SSH compliance rule (AWS Config) with auto-remediation via AWS Lambda if SSH access is public.

SSH-Restricted SSH-Restricted deploys an SSH compliance rule with auto-remediation via AWS Lambda if SSH access is public. SSH-Auto-Restricted checks

Adrian Hornsby 30 Nov 8, 2022
Simple ssh overlay for easy, remote server management written in Python GTK with paramiko

Simple "ssh" overlay for easy, remote server management written in Python GTK with paramiko

kłapouch 3 May 1, 2022
Add a Web Server based on Rogue Mysql Server to allow remote user get

介绍 对于需要使用 Rogue Mysql Server 的漏洞来说,若想批量检测这种漏洞的话需要自备一个服务器。并且我常用的Rogue Mysql Server 脚本 不支持动态更改读取文件名、不支持远程用户访问读取结果、不支持批量化检测网站。于是乎萌生了这个小脚本的想法 Rogue-MySql-

null 6 May 17, 2022
Transparent proxy server that works as a poor man's VPN. Forwards over ssh. Doesn't require admin. Works with Linux and MacOS. Supports DNS tunneling.

sshuttle: where transparent proxy meets VPN meets ssh As far as I know, sshuttle is the only program that solves the following common case: Your clien

null 9.4k Jan 4, 2023
MPV remote controller is a program for remote controlling mpv player with device in your local network through web browser.

MPV remote controller is a program for remote controlling mpv player with device in your local network through web browser.

null 5 May 26, 2022
Remote execution of a simple function on the server

FunFetch Remote execution of a simple function on the server All types of Python support objects.

Decave 4 Jun 30, 2022