Source code for piqueserver.ssh

# Copyright (c) Mathias Kaerlev 2011-2012.

# This file is part of pyspades.

# pyspades is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# pyspades is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with pyspades.  If not, see <http://www.gnu.org/licenses/>.

import sys
from os import path

try:
    from twisted.cred import portal, checkers
    from twisted.conch import manhole, manhole_ssh
    from twisted.conch.ssh import keys
except ImportError as e:
    print("ERROR: piqueserver was not installed with the [ssh] option")
    print("but SSH was enabled in the settings")
    print(e)
    sys.exit(1)

from piqueserver.config import config


[docs]def create_remote_factory(namespace, users): realm = manhole_ssh.TerminalRealm() def create_remote_protocol(_): return manhole.ColoredManhole(namespace) realm.chainedProtocolFactory.protocolFactory = create_remote_protocol p = portal.Portal(realm) users = {key: value.encode() for key, value in users.items()} p.registerChecker( checkers.InMemoryUsernamePasswordDatabaseDontUse(**users)) f = manhole_ssh.ConchFactory(p) ssh_key_base_path = path.join(config.config_dir, "ssh-keys") ssh_pubkey_path = path.join(ssh_key_base_path, "ssh_host_rsa_key.pub") ssh_privkey_path = path.join(ssh_key_base_path, "ssh_host_rsa_key") try: f.publicKeys[b"ssh-rsa"] = keys.Key.fromFile(ssh_pubkey_path) f.privateKeys[b"ssh-rsa"] = keys.Key.fromFile(ssh_privkey_path) except FileNotFoundError: print("ERROR: You don't have any keys in the host key location") print("Generate one with:") print(" mkdir {}".format(ssh_key_base_path)) print(" ssh-keygen -f {} -t rsa".format(ssh_privkey_path)) print("make sure to specify no password") sys.exit(1) return f
ssh_config = config.section("ssh")
[docs]class RemoteConsole: def __init__(self, server): users = ssh_config.option("users", {}) port = ssh_config.option("port", 38827) factory = create_remote_factory(locals(), users.get()) server.listenTCP(port.get(), factory)