Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- # (c) Dirk Maric admin@hotlein.de
- # Das Skript wird ohne Garantie und ohne Anspruch auf Support kostenlos zur Verfügung gestellt.
- # Nutzung des Skripts auf eigene Gefahr! Der Autor haftet nicht für eventuelle Schäden, die
- # durch dieses Skript verursacht wurden.
- # Es gilt die GNU General Public License (GPL)
- # Version 2.980
- import subprocess
- import os
- import sys
- import shutil
- from time import *
- from_publish = "False"
- from configparser import ConfigParser
- def generate_config():
- dir_path = os.path.expanduser("~/.xssh/")
- config_path = os.path.expanduser("~/.xssh/xssh.ini")
- if not os.path.exists(os.path.expanduser(dir_path)):
- try:
- os.mkdir(dir_path)
- except:
- print("Der Ordner ", dir_path, "kann nicht erstellt werden!")
- sys.exit(0)
- print("Es besteht noch keine Konfigurations-Datei, es wird eine mit Standardeinstellungen generiert:")
- print("Diese findest du unter: ", config_path)
- config_path = os.path.expanduser("~/.xssh/xssh.ini")
- config = ConfigParser()
- config.optionxform = str
- config.add_section('settings')
- config.set('settings', 'SHOW_SERVERS', 'False')
- config.set('settings', 'CLEAR_SCREEN', 'False')
- config.set('settings', 'LOGGING', 'False')
- config.set('settings', 'XXL_LOGGING', 'False')
- with open(config_path, 'w') as configfile:
- config.write(configfile)
- def read_config():
- config_path = os.path.expanduser("~/.xssh/xssh.ini")
- config = ConfigParser()
- if not os.path.exists(os.path.expanduser(config_path)):
- generate_config()
- config.read(config_path)
- settings = {
- "show_servers": config.getboolean('settings', 'SHOW_SERVERS'),
- "clear_screen": config.getboolean('settings', 'CLEAR_SCREEN'),
- "logging": config.getboolean('settings', 'LOGGING'),
- "xxl_logging": config.getboolean('settings', 'XXL_LOGGING')
- }
- return settings
- def generate_servers():
- dir_path = os.path.expanduser("~/.xssh/")
- server_path = os.path.expanduser("~/.xssh/server.csv")
- print("""Möchten Sie jetzt ihren ersten Server eingeben?(J/N): """)
- auswahl = input()
- if auswahl == "J" or auswahl == "j":
- add_server()
- else:
- print("""Es besteht noch keine server.csv, es wird jetzt eine "server.csv" mit Beispieldaten erstellt.""")
- if not os.path.exists(os.path.expanduser(dir_path)):
- try:
- os.mkdir(dir_path)
- except:
- print("Der Ordner ", dir_path, "kann nicht erstellt werden!")
- sys.exit(0)
- try:
- d = open(server_path, "w")
- except:
- print("Zugriff auf ", server_path, " nicht erfolgreich")
- sys.exit(0)
- try:
- dli = [["Localhost", "127.0.0.1", "22"], ["Server2", "name@server.tld", "22"]]
- for element in dli:
- d.write(element[0] + ","
- + element[1] + ","
- + element[2] + "\n")
- except:
- print("Die Datei kann nicht bearbeitet werden")
- sys.exit(0)
- d.close()
- print("""Bitte fügen Sie bei Gelegenheit Server unter "More" > "Server hinzufügen" an.
- Die Datei""", server_path, """kann auch zum Beispiel mit "Libre Office Calc" bearbeitet werden.
- Dazu muss diese aber im Text-CSV-Format gespeichert werden.""")
- menu()
- def read_servers():
- server_path = os.path.expanduser("~/.xssh/server.csv")
- if not os.path.exists(os.path.expanduser(server_path)):
- generate_servers()
- try:
- d = open(server_path)
- except:
- print("Lesen der server.csv nicht möglich!")
- sys.exit(0)
- gesamtertext = d.read()
- d.close()
- # Liste zerlegen
- zeilenliste = gesamtertext.split(chr(10))
- servers = []
- for zeile in zeilenliste:
- if zeile:
- zwliste = zeile.split(",")
- servers.append([zwliste[0],
- zwliste[1], zwliste[2]])
- return servers
- def start_logging(server):
- try:
- d = open(log_path, "a")
- lt = localtime()
- entry = "\n", "-> Verbindung mit: ", str(server) + " Start: ", str(
- strftime("%d.%m.%Y Uhrzeit: %H:%M:%S", lt)) + " PID: ", str(os.getpid()) + "\n"
- d.writelines(entry)
- d.close()
- except:
- print("Es ist ein Fehler aufgetreten: Die Datei kann nicht geöffnet werden!")
- sys.exit(0)
- def stop_logging(server):
- settings = read_config()
- log_path = os.path.expanduser('~/xssh.log')
- try:
- d = open(log_path, "a")
- lt = localtime()
- if settings["xxl_logging"] == True:
- comment = "Bemerkung zu ", str(server) + ":", "\n", input("Bemerkung eingeben: ") + "\n"
- entry = "\n", "<- Getrennt von ", str(server), "Ende: ", str(strftime("%d.%m.%Y Uhrzeit: %H:%M:%S", lt)) \
- + " PID: ", str(os.getpid()) + "\n"
- d.writelines(entry)
- d.writelines(comment)
- d.close()
- else:
- entry = "\n", "<- Getrennt von ", str(server), " Ende: ", str(strftime("%d.%m.%Y Uhrzeit: %H:%M:%S", lt)) \
- + " PID: ", str(os.getpid()) + "\n"
- d.writelines(entry)
- d.close()
- except:
- print("Es ist ein Fehler aufgetreten: Die Datei kann nicht geöffnet werden!")
- sys.exit(0)
- def generate_sshkey():
- ssh_path = os.path.expanduser('~/.ssh')
- if os.path.exists(ssh_path):
- try:
- print("""Es existiert bereits ein .ssh-Verzeichnis. Es wird ein Backup erstellt (.ssh-xssh).
- Funktioniert der neue Schlüssel einwandfrei, bitte das Backup löschen um eventuellen Missbrauch zu verhindern!""")
- lt = localtime()
- bdate = (strftime("%d-%m-%Y-%H-%M-%S", lt))
- ssh_path_bak = os.path.expanduser('~/.ssh-xssh-')
- ssh_path_date = ssh_path_bak + bdate
- shutil.copytree(ssh_path, ssh_path_date)
- except KeyboardInterrupt:
- print("\n" "Unterbrochen!")
- sys.exit(0)
- print("""Es wird ein neuer SSH-Schlüssel generiert...
- Bitte alle Fragen mit ENTER bestätigen:
- Soll der Schlüssel mit einem Passwort versehen werden, kann dieses im Laufe des Vorgangs erledigt werden.
- Die Sprache des Dialogs hängt vom Betriebssystem ab.""")
- try:
- subprocess.call(["ssh-keygen", "-t", "rsa"])
- print()
- global from_publish
- if from_publish == "True":
- publish_sshkey()
- more()
- except KeyboardInterrupt:
- print("\n" "Unterbrochen!")
- sys.exit(0)
- def change_key():
- try:
- print("Passwort des SSH-Schlüssels ändern, Leereingabe um Passwort zu entfernen")
- command = "ssh-keygen -p"
- subprocess.call(command, shell=True)
- print()
- more()
- except KeyboardInterrupt:
- print("\n" "Unterbrochen!")
- sys.exit(0)
- def publish_sshkey():
- try:
- if os.path.exists(os.path.expanduser('~/.ssh/id_rsa')):
- print("Schlüssel vorhanden!")
- print()
- print("Bitte wählen Sie den Server auf den der Schlüssel hochgeladen werden soll:")
- else:
- print("Es existiert noch kein SSH-Schlüssel, dieser wird jetzt erstellt...")
- global from_publish
- from_publish = "True"
- generate_sshkey()
- pass
- print("SSH-Schlüssel hochladen")
- name, host, port = menu_gen()
- login = input("Login Namen auf dem Zielserver: ")
- keypath = os.path.expanduser('~/.ssh/id_rsa.pub')
- command = "ssh-copy-id -i %s %s@%s" % (keypath, login, host)
- subprocess.call(command, shell=True)
- more()
- except KeyboardInterrupt:
- print("\n" "Unterbrochen!")
- sys.exit(0)
- def del_log():
- log_path = os.path.expanduser('~/xssh.log')
- print("""Die Log-Datei wird gelöscht, bei aktivierter Loging-Funktion wird diese bei der nächsten Verbindung neu erstellt
- Soll die Log-Datei endgültig gelöscht werden? (J/N)""")
- auswahl = input()
- if auswahl == "J" or auswahl == "j":
- try:
- os.remove(log_path)
- print("Die Log-Datei wurde gelöscht")
- except:
- print("Beim Löschen der Datei ist ein Fehler aufgetreten!")
- else:
- print("Abgebrochen!")
- more()
- def more():
- settings = read_config()
- if settings["clear_screen"]:
- os.system('clear')
- functions = ["SSH-Schlüssel generieren", "Privaten Schlüssel auf Server hochladen", "Passwort des Schlüssels ändern", "Log-Datei löschen", "Server hinzufügen", "Server löschen",]
- print("{0:<4}{1:<14}".format("Nr.", "Funktion"))
- for index, (function) in enumerate(functions, 1):
- print("{0:<4}{1:<14}".format(index, function))
- print("Oder:", "e(x)it", "|", "(b)ack")
- while True:
- index = input("Bitte Auswählen: ")
- if index == "x":
- exit(0)
- if index == "1":
- generate_sshkey()
- if index == "2":
- publish_sshkey()
- if index == "3":
- change_key()
- if index == "4":
- del_log()
- if index == "5":
- add_server()
- if index == "6":
- del_server()
- if index == "b":
- main()
- exit(0)
- try:
- if 0 < int(index) <= len(functions):
- return functions[int(index) - 1]
- except (ValueError, IndexError):
- pass
- def connect(server, port):
- settings = read_config()
- if settings["logging"]:
- start_logging(server)
- print("Vebinde mit", str(server))
- subprocess.call(["ssh", server, "-p", str(port)])
- if settings["logging"]:
- stop_logging(server)
- def menu():
- try:
- settings = read_config()
- if settings["clear_screen"]:
- os.system('clear')
- if settings["show_servers"]:
- servers = read_servers()
- print("SSH-Verbindung herstellen zu:")
- print("{0:<4}{1:<19}{2:<25}{3:<5}".format("Nr.", "Servername", "Adresse", "Port"))
- for index, (name, host, port) in enumerate(servers, 1):
- print("{0:<4}{1:<19}{2:<25}{3:<5}".format(index, name, host, port))
- print("Oder:", "e(x)it", "|", "(m)ore")
- else:
- servers = read_servers()
- print("SSH-Verbindung herstellen zu:")
- print("{0:<4}{1:<19}{2:<5}".format("Nr.", "Servername", "Port"))
- for index, (name, host, port) in enumerate(servers, 1):
- print("{0:<4}{1:<19}{2:<5}".format(index, name, port))
- print("Oder:", "e(x)it", "|", "(m)ore")
- while True:
- index = input("Bitte Servernummer eingeben: ")
- if index == "x":
- exit(0)
- if index == "m":
- more()
- try:
- if 0 < int(index) <= len(servers):
- return servers[int(index) - 1]
- except (ValueError, IndexError):
- pass
- except KeyboardInterrupt:
- print("\n" "Unterbrochen!")
- sys.exit(0)
- def menu_gen():
- settings = read_config()
- try:
- if settings["clear_screen"]:
- os.system('clear')
- if settings["show_servers"]:
- servers = read_servers()
- print("{0:<4}{1:<19}{2:<25}{3:<5}".format("Nr.", "Servername", "Adresse", "Port"))
- for index, (name, host, port) in enumerate(servers, 1):
- print("{0:<4}{1:<14}{2:<25}{3:<5}".format(index, name, host, port))
- print("Oder:", "e(x)it", "|", "(b)ack")
- else:
- servers = read_servers()
- print("{0:<4}{1:<19}{2:<5}".format("Nr.", "Servername", "Port"))
- for index, (name, host, port) in enumerate(servers, 1):
- print("{0:<4}{1:<19}{2:<5}".format(index, name, port))
- print("Oder:", "e(x)it", "|", "(b)ack")
- while True:
- index = input("Bitte Servernummer eingeben: ")
- if index == "b":
- main()
- exit(0)
- if index == "x":
- exit(0)
- try:
- if 0 < int(index) <= len(servers):
- return servers[int(index) - 1]
- except (ValueError, IndexError):
- pass
- except KeyboardInterrupt:
- print("\n" "Unterbrochen!")
- sys.exit(0)
- def add_server():
- server_path = os.path.expanduser("~/.xssh/server.csv")
- serv_name = ""
- serv_add = ""
- try:
- print("Serveradresse hinzufügen:")
- while serv_name == "":
- serv_name = input("Bitte Servernamen eingeben: ")
- while serv_add == "":
- serv_add = input(
- "Bitte Serveradresse eingeben" + "\n" + "(Bei abweichenden Login Namen, diesen mit angeben, z.B. login@servername.de)" + "\n" + ": ")
- serv_port = input("Bitte Port eingeben [22]: ")
- if serv_port == "":
- serv_port = "22"
- try:
- d = open(server_path, "a")
- lt = localtime()
- entry = serv_name, ",", serv_add, ",", serv_port, "\n"
- d.writelines(entry)
- d.close()
- except:
- print("Es ist ein Fehler aufgetreten: Die Datei kann nicht geöffnet werden!")
- sys.exit(0)
- except KeyboardInterrupt:
- print("\n" "Unterbrochen!")
- more()
- more()
- def del_server():
- server_path = os.path.expanduser("~/.xssh/server.csv")
- servers = read_servers()
- try:
- print("Server löschen")
- print("{0:<4}{1:<19}{2:<5}".format("Nr.", "Servername", "Port"))
- for index, (name, host, port) in enumerate(servers, 1):
- print("{0:<4}{1:<19}{2:<5}".format(index, name, port))
- rmsrv = input("Welcher Server soll gelöscht werden? ")
- rmsrv = int(rmsrv) - 1
- f = open(server_path, 'r')
- lines = f.readlines()
- f.close()
- del lines[rmsrv]
- f = open(server_path, 'w')
- for l in lines:
- f.write(l)
- f.close()
- more()
- except KeyboardInterrupt:
- print("\n" "Unterbrochen!")
- more()
- def init_server():
- server_path = os.path.expanduser("~/.xssh/server.csv")
- serv_name = ""
- serv_add = ""
- try:
- print("Serveradresse hinzufügen:")
- while serv_name == "":
- serv_name = input("Bitte Servernamen eingeben: ")
- while serv_add == "":
- serv_add = input(
- "Bitte Serveradresse eingeben" + "\n" + "(Bei abweichenden Login Namen, diesen mit angeben, z.B. login@servername.de)" + "\n" + ": ")
- serv_port = input("Bitte Port eingeben [22]: ")
- if serv_port == "":
- serv_port = "22"
- try:
- d = open(server_path, "a")
- lt = localtime()
- entry = serv_name, ",", serv_add, ",", serv_port, "\n"
- d.writelines(entry)
- d.close()
- except:
- print("Es ist ein Fehler aufgetreten: Die Datei kann nicht geöffnet werden!")
- sys.exit(0)
- except KeyboardInterrupt:
- print("\n" "Unterbrochen!")
- more()
- def main():
- name, host, port = menu()
- connect(host, port)
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement