Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.54 KB | None | 0 0
  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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement