SHARE
TWEET

Untitled

a guest Jun 25th, 2019 60 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # (c) Dirk Maric admin@hotlein.de
  4. # Das Skript wird ohne Garantie und ohne Anspruch auf Support kostenlos zur VerfĂĽgung gestellt.
  5. # Nutzung des Skripts auf eigene Gefahr! Der Autor haftet nicht für eventuelle Schäden, die
  6. # durch dieses Skript verursacht wurden.
  7. # Es gilt die GNU General Public License (GPL)
  8. # Version 2.980
  9. import subprocess
  10. import os
  11. import sys
  12. import shutil
  13. from time import *
  14.  
  15. from_publish = "False"
  16.  
  17. from configparser import ConfigParser
  18.  
  19.  
  20.  
  21. def generate_config():
  22.     dir_path = os.path.expanduser("~/.xssh/")
  23.     config_path = os.path.expanduser("~/.xssh/xssh.ini")
  24.  
  25.     if not os.path.exists(os.path.expanduser(dir_path)):
  26.         try:
  27.             os.mkdir(dir_path)
  28.         except:
  29.             print("Der Ordner ", dir_path, "kann nicht erstellt werden!")
  30.             sys.exit(0)
  31.  
  32.     print("Es besteht noch keine Konfigurations-Datei, es wird eine mit Standardeinstellungen generiert:")
  33.     print("Diese findest du unter: ", config_path)
  34.     config_path = os.path.expanduser("~/.xssh/xssh.ini")
  35.     config = ConfigParser()
  36.     config.optionxform = str
  37.     config.add_section('settings')
  38.     config.set('settings', 'SHOW_SERVERS', 'False')
  39.     config.set('settings', 'CLEAR_SCREEN', 'False')
  40.     config.set('settings', 'LOGGING', 'False')
  41.     config.set('settings', 'XXL_LOGGING', 'False')
  42.     with open(config_path, 'w') as configfile:
  43.         config.write(configfile)
  44.  
  45.  
  46. def read_config():
  47.     config_path = os.path.expanduser("~/.xssh/xssh.ini")
  48.     config = ConfigParser()
  49.  
  50.     if not os.path.exists(os.path.expanduser(config_path)):
  51.         generate_config()
  52.  
  53.     config.read(config_path)
  54.  
  55.     settings = {
  56.         "show_servers": config.getboolean('settings', 'SHOW_SERVERS'),
  57.         "clear_screen": config.getboolean('settings', 'CLEAR_SCREEN'),
  58.         "logging": config.getboolean('settings', 'LOGGING'),
  59.         "xxl_logging": config.getboolean('settings', 'XXL_LOGGING')
  60.     }
  61.     return settings
  62.  
  63.  
  64. def generate_servers():
  65.     dir_path = os.path.expanduser("~/.xssh/")
  66.     server_path = os.path.expanduser("~/.xssh/server.csv")
  67.     print("""Möchten Sie jetzt ihren ersten Server eingeben?(J/N): """)
  68.     auswahl = input()
  69.  
  70.     if auswahl == "J" or auswahl == "j":
  71.         add_server()
  72.     else:
  73.         print("""Es besteht noch keine server.csv, es wird jetzt eine "server.csv" mit Beispieldaten erstellt.""")
  74.         if not os.path.exists(os.path.expanduser(dir_path)):
  75.             try:
  76.                 os.mkdir(dir_path)
  77.             except:
  78.                 print("Der Ordner ", dir_path, "kann nicht erstellt werden!")
  79.                 sys.exit(0)
  80.  
  81.         try:
  82.             d = open(server_path, "w")
  83.  
  84.         except:
  85.             print("Zugriff auf ", server_path, " nicht erfolgreich")
  86.             sys.exit(0)
  87.  
  88.         try:
  89.             dli = [["Localhost", "127.0.0.1", "22"], ["Server2", "name@server.tld", "22"]]
  90.             for element in dli:
  91.                 d.write(element[0] + ","
  92.                         + element[1] + ","
  93.                         + element[2] + "\n")
  94.  
  95.         except:
  96.             print("Die Datei kann nicht bearbeitet werden")
  97.             sys.exit(0)
  98.  
  99.         d.close()
  100.         print("""Bitte fĂĽgen Sie bei Gelegenheit Server unter "More" > "Server hinzufĂĽgen" an.
  101. Die Datei""", server_path, """kann auch zum  Beispiel mit "Libre Office Calc" bearbeitet werden.
  102. Dazu muss diese aber im Text-CSV-Format gespeichert werden.""")
  103.         menu()
  104.  
  105.  
  106. def read_servers():
  107.     server_path = os.path.expanduser("~/.xssh/server.csv")
  108.  
  109.     if not os.path.exists(os.path.expanduser(server_path)):
  110.         generate_servers()
  111.  
  112.     try:
  113.         d = open(server_path)
  114.  
  115.     except:
  116.         print("Lesen der server.csv nicht möglich!")
  117.         sys.exit(0)
  118.  
  119.     gesamtertext = d.read()
  120.     d.close()
  121.     # Liste zerlegen
  122.     zeilenliste = gesamtertext.split(chr(10))
  123.  
  124.     servers = []
  125.     for zeile in zeilenliste:
  126.         if zeile:
  127.             zwliste = zeile.split(",")
  128.             servers.append([zwliste[0],
  129.                             zwliste[1], zwliste[2]])
  130.     return servers
  131.  
  132.  
  133. def start_logging(server):
  134.  
  135.  
  136.     try:
  137.         d = open(log_path, "a")
  138.         lt = localtime()
  139.         entry = "\n", "-> Verbindung mit: ", str(server) + " Start: ", str(
  140.             strftime("%d.%m.%Y Uhrzeit: %H:%M:%S", lt)) + " PID: ", str(os.getpid()) + "\n"
  141.         d.writelines(entry)
  142.         d.close()
  143.  
  144.     except:
  145.         print("Es ist ein Fehler aufgetreten: Die Datei kann nicht geöffnet werden!")
  146.         sys.exit(0)
  147.  
  148.  
  149. def stop_logging(server):
  150.     settings = read_config()
  151.     log_path = os.path.expanduser('~/xssh.log')
  152.  
  153.     try:
  154.         d = open(log_path, "a")
  155.         lt = localtime()
  156.         if settings["xxl_logging"] == True:
  157.             comment = "Bemerkung zu ", str(server) + ":", "\n", input("Bemerkung eingeben: ") + "\n"
  158.             entry = "\n", "<- Getrennt von ", str(server), "Ende: ", str(strftime("%d.%m.%Y Uhrzeit: %H:%M:%S", lt)) \
  159.                     + " PID: ", str(os.getpid()) + "\n"
  160.             d.writelines(entry)
  161.             d.writelines(comment)
  162.             d.close()
  163.  
  164.         else:
  165.             entry = "\n", "<- Getrennt von ", str(server), " Ende: ", str(strftime("%d.%m.%Y Uhrzeit: %H:%M:%S", lt)) \
  166.                     + " PID: ", str(os.getpid()) + "\n"
  167.             d.writelines(entry)
  168.             d.close()
  169.  
  170.     except:
  171.         print("Es ist ein Fehler aufgetreten: Die Datei kann nicht geöffnet werden!")
  172.         sys.exit(0)
  173.  
  174.  
  175. def generate_sshkey():
  176.     ssh_path = os.path.expanduser('~/.ssh')
  177.     if os.path.exists(ssh_path):
  178.         try:
  179.             print("""Es existiert bereits ein .ssh-Verzeichnis. Es wird ein Backup erstellt (.ssh-xssh).
  180.         Funktioniert der neue SchlĂĽssel einwandfrei, bitte das Backup löschen um eventuellen Missbrauch zu verhindern!""")
  181.             lt = localtime()
  182.             bdate = (strftime("%d-%m-%Y-%H-%M-%S", lt))
  183.             ssh_path_bak = os.path.expanduser('~/.ssh-xssh-')
  184.             ssh_path_date = ssh_path_bak + bdate
  185.             shutil.copytree(ssh_path, ssh_path_date)
  186.  
  187.         except KeyboardInterrupt:
  188.             print("\n" "Unterbrochen!")
  189.             sys.exit(0)
  190.  
  191.     print("""Es wird ein neuer SSH-SchlĂĽssel generiert...
  192. Bitte alle Fragen mit ENTER bestätigen:
  193. Soll der SchlĂĽssel mit einem Passwort versehen werden, kann dieses im Laufe des Vorgangs erledigt werden.
  194. Die Sprache des Dialogs hängt vom Betriebssystem ab.""")
  195.     try:
  196.         subprocess.call(["ssh-keygen", "-t", "rsa"])
  197.         print()
  198.         global from_publish
  199.         if from_publish == "True":
  200.             publish_sshkey()
  201.  
  202.         more()
  203.     except KeyboardInterrupt:
  204.         print("\n" "Unterbrochen!")
  205.         sys.exit(0)
  206.  
  207.  
  208. def change_key():
  209.     try:
  210.         print("Passwort des SSH-SchlĂĽssels ändern, Leereingabe um Passwort zu entfernen")
  211.         command = "ssh-keygen -p"
  212.         subprocess.call(command, shell=True)
  213.         print()
  214.         more()
  215.  
  216.     except KeyboardInterrupt:
  217.         print("\n" "Unterbrochen!")
  218.         sys.exit(0)
  219.  
  220.  
  221. def publish_sshkey():
  222.     try:
  223.         if os.path.exists(os.path.expanduser('~/.ssh/id_rsa')):
  224.             print("SchlĂĽssel vorhanden!")
  225.             print()
  226.             print("Bitte wählen Sie den Server auf den der SchlĂĽssel hochgeladen werden soll:")
  227.  
  228.         else:
  229.             print("Es existiert noch kein SSH-SchlĂĽssel, dieser wird jetzt erstellt...")
  230.             global from_publish
  231.             from_publish = "True"
  232.             generate_sshkey()
  233.             pass
  234.  
  235.         print("SSH-SchlĂĽssel hochladen")
  236.         name, host, port = menu_gen()
  237.         login = input("Login Namen auf dem Zielserver: ")
  238.         keypath = os.path.expanduser('~/.ssh/id_rsa.pub')
  239.         command = "ssh-copy-id -i %s %s@%s" % (keypath, login, host)
  240.         subprocess.call(command, shell=True)
  241.         more()
  242.  
  243.     except KeyboardInterrupt:
  244.         print("\n" "Unterbrochen!")
  245.         sys.exit(0)
  246.  
  247.  
  248. def del_log():
  249.     log_path = os.path.expanduser('~/xssh.log')
  250.     print("""Die Log-Datei wird gelöscht, bei aktivierter Loging-Funktion wird diese bei der nächsten Verbindung neu erstellt
  251.  
  252. Soll die Log-Datei endgültig gelöscht werden? (J/N)""")
  253.     auswahl = input()
  254.  
  255.     if auswahl == "J" or auswahl == "j":
  256.         try:
  257.             os.remove(log_path)
  258.             print("Die Log-Datei wurde gelöscht")
  259.         except:
  260.             print("Beim Löschen der Datei ist ein Fehler aufgetreten!")
  261.     else:
  262.         print("Abgebrochen!")
  263.  
  264.     more()
  265.  
  266.  
  267. def more():
  268.     settings = read_config()
  269.     if settings["clear_screen"]:
  270.         os.system('clear')
  271.  
  272.     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",]
  273.     print("{0:<4}{1:<14}".format("Nr.", "Funktion"))
  274.     for index, (function) in enumerate(functions, 1):
  275.         print("{0:<4}{1:<14}".format(index, function))
  276.     print("Oder:", "e(x)it", "|", "(b)ack")
  277.  
  278.     while True:
  279.         index = input("Bitte Auswählen: ")
  280.         if index == "x":
  281.             exit(0)
  282.         if index == "1":
  283.             generate_sshkey()
  284.         if index == "2":
  285.             publish_sshkey()
  286.         if index == "3":
  287.             change_key()
  288.         if index == "4":
  289.             del_log()
  290.         if index == "5":
  291.             add_server()
  292.         if index == "6":
  293.             del_server()
  294.         if index == "b":
  295.             main()
  296.             exit(0)
  297.         try:
  298.             if 0 < int(index) <= len(functions):
  299.                 return functions[int(index) - 1]
  300.         except (ValueError, IndexError):
  301.             pass
  302.  
  303.  
  304. def connect(server, port):
  305.     settings = read_config()
  306.     if settings["logging"]:
  307.         start_logging(server)
  308.     print("Vebinde mit", str(server))
  309.     subprocess.call(["ssh", server, "-p", str(port)])
  310.     if settings["logging"]:
  311.         stop_logging(server)
  312.  
  313.  
  314. def menu():
  315.     try:
  316.         settings = read_config()
  317.  
  318.         if settings["clear_screen"]:
  319.             os.system('clear')
  320.  
  321.         if settings["show_servers"]:
  322.             servers = read_servers()
  323.             print("SSH-Verbindung herstellen zu:")
  324.             print("{0:<4}{1:<19}{2:<25}{3:<5}".format("Nr.", "Servername", "Adresse", "Port"))
  325.             for index, (name, host, port) in enumerate(servers, 1):
  326.                 print("{0:<4}{1:<19}{2:<25}{3:<5}".format(index, name, host, port))
  327.             print("Oder:", "e(x)it", "|", "(m)ore")
  328.         else:
  329.             servers = read_servers()
  330.             print("SSH-Verbindung herstellen zu:")
  331.             print("{0:<4}{1:<19}{2:<5}".format("Nr.", "Servername", "Port"))
  332.             for index, (name, host, port) in enumerate(servers, 1):
  333.                 print("{0:<4}{1:<19}{2:<5}".format(index, name, port))
  334.             print("Oder:", "e(x)it", "|", "(m)ore")
  335.         while True:
  336.             index = input("Bitte Servernummer eingeben: ")
  337.             if index == "x":
  338.                 exit(0)
  339.             if index == "m":
  340.                 more()
  341.             try:
  342.                 if 0 < int(index) <= len(servers):
  343.                     return servers[int(index) - 1]
  344.             except (ValueError, IndexError):
  345.                 pass
  346.  
  347.     except KeyboardInterrupt:
  348.         print("\n" "Unterbrochen!")
  349.         sys.exit(0)
  350.  
  351.  
  352. def menu_gen():
  353.     settings = read_config()
  354.  
  355.     try:
  356.         if settings["clear_screen"]:
  357.             os.system('clear')
  358.         if settings["show_servers"]:
  359.             servers = read_servers()
  360.             print("{0:<4}{1:<19}{2:<25}{3:<5}".format("Nr.", "Servername", "Adresse", "Port"))
  361.             for index, (name, host, port) in enumerate(servers, 1):
  362.                 print("{0:<4}{1:<14}{2:<25}{3:<5}".format(index, name, host, port))
  363.             print("Oder:", "e(x)it", "|", "(b)ack")
  364.         else:
  365.             servers = read_servers()
  366.             print("{0:<4}{1:<19}{2:<5}".format("Nr.", "Servername", "Port"))
  367.             for index, (name, host, port) in enumerate(servers, 1):
  368.                 print("{0:<4}{1:<19}{2:<5}".format(index, name, port))
  369.             print("Oder:", "e(x)it", "|", "(b)ack")
  370.         while True:
  371.             index = input("Bitte Servernummer eingeben: ")
  372.             if index == "b":
  373.                 main()
  374.                 exit(0)
  375.             if index == "x":
  376.                 exit(0)
  377.             try:
  378.                 if 0 < int(index) <= len(servers):
  379.                     return servers[int(index) - 1]
  380.             except (ValueError, IndexError):
  381.                 pass
  382.     except KeyboardInterrupt:
  383.         print("\n" "Unterbrochen!")
  384.         sys.exit(0)
  385.  
  386. def add_server():
  387.     server_path = os.path.expanduser("~/.xssh/server.csv")
  388.     serv_name = ""
  389.     serv_add = ""
  390.  
  391.     try:
  392.         print("Serveradresse hinzufĂĽgen:")
  393.         while serv_name == "":
  394.             serv_name = input("Bitte Servernamen eingeben: ")
  395.  
  396.         while serv_add == "":
  397.             serv_add = input(
  398.                 "Bitte Serveradresse eingeben" + "\n" + "(Bei abweichenden Login Namen, diesen mit angeben, z.B. login@servername.de)" + "\n" + ": ")
  399.  
  400.  
  401.         serv_port = input("Bitte Port eingeben [22]: ")
  402.         if serv_port == "":
  403.             serv_port = "22"
  404.  
  405.  
  406.         try:
  407.             d = open(server_path, "a")
  408.             lt = localtime()
  409.             entry = serv_name, ",", serv_add, ",", serv_port, "\n"
  410.             d.writelines(entry)
  411.             d.close()
  412.  
  413.         except:
  414.             print("Es ist ein Fehler aufgetreten: Die Datei kann nicht geöffnet werden!")
  415.             sys.exit(0)
  416.  
  417.     except KeyboardInterrupt:
  418.         print("\n" "Unterbrochen!")
  419.         more()
  420.     more()
  421.  
  422.  
  423. def del_server():
  424.     server_path = os.path.expanduser("~/.xssh/server.csv")
  425.     servers = read_servers()
  426.  
  427.     try:
  428.         print("Server löschen")
  429.         print("{0:<4}{1:<19}{2:<5}".format("Nr.", "Servername", "Port"))
  430.         for index, (name, host, port) in enumerate(servers, 1):
  431.             print("{0:<4}{1:<19}{2:<5}".format(index, name, port))
  432.         rmsrv = input("Welcher Server soll gelöscht werden? ")
  433.         rmsrv = int(rmsrv) - 1
  434.         f = open(server_path, 'r')
  435.         lines = f.readlines()
  436.         f.close()
  437.         del lines[rmsrv]
  438.         f = open(server_path, 'w')
  439.         for l in lines:
  440.             f.write(l)
  441.         f.close()
  442.         more()
  443.  
  444.     except KeyboardInterrupt:
  445.         print("\n" "Unterbrochen!")
  446.         more()
  447.  
  448. def init_server():
  449.     server_path = os.path.expanduser("~/.xssh/server.csv")
  450.     serv_name = ""
  451.     serv_add = ""
  452.  
  453.     try:
  454.         print("Serveradresse hinzufĂĽgen:")
  455.         while serv_name == "":
  456.             serv_name = input("Bitte Servernamen eingeben: ")
  457.  
  458.         while serv_add == "":
  459.             serv_add = input(
  460.                 "Bitte Serveradresse eingeben" + "\n" + "(Bei abweichenden Login Namen, diesen mit angeben, z.B. login@servername.de)" + "\n" + ": ")
  461.  
  462.  
  463.         serv_port = input("Bitte Port eingeben [22]: ")
  464.         if serv_port == "":
  465.             serv_port = "22"
  466.  
  467.  
  468.         try:
  469.             d = open(server_path, "a")
  470.             lt = localtime()
  471.             entry = serv_name, ",", serv_add, ",", serv_port, "\n"
  472.             d.writelines(entry)
  473.             d.close()
  474.  
  475.         except:
  476.             print("Es ist ein Fehler aufgetreten: Die Datei kann nicht geöffnet werden!")
  477.             sys.exit(0)
  478.  
  479.     except KeyboardInterrupt:
  480.         print("\n" "Unterbrochen!")
  481.         more()
  482.  
  483.  
  484. def main():
  485.     name, host, port = menu()
  486.     connect(host, port)
  487.  
  488.  
  489. if __name__ == '__main__':
  490.     main()
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top