tools.utils

Yohn Y. 2025-05-17 Parent:c4bc2d77d4be

6:9fc60d528049 Go to Latest

tools.utils/pw/aw_pw_tool

+ shell утилиты

History
1 #!/usr/bin/env python3
2 # devel.a0fs.ru -- TOOLS:SEC:aw_pw_tool -- v0.r202505.1
3 # devel.a0fs.ru -- TOOLS:SEC:safe_pw -- v0.r202409.2
4 # devel.a0fs.ru -- pwtrns.py -- v0.r202402.8
6 from sys import stdin, stdout, stderr
7 from random import seed as rnd_seed, choice as rnd_choice
8 from argparse import ArgumentParser
9 from string import ascii_letters, digits
10 from typing import List, Iterable, Optional
13 ### VAR
14 SAFECH= {
15 'def': '%-=_;:+/,.@',
16 'url': '-._',
17 }
19 TRDICT = {
20 'f': 'а', ',': 'б', 'd': 'в', 'u': 'г', 'l': 'д', 't': 'е', '`': 'ё',
21 ';': 'ж', 'p': 'з', 'b': 'и', 'q': 'й', 'r': 'к', 'k': 'л', 'v': 'м',
22 'y': 'н', 'j': 'о', 'g': 'п', 'h': 'р', 'c': 'с', 'n': 'т', 'e': 'у',
23 'a': 'ф', '[': 'х', 'w': 'ц', 'x': 'ч', 'i': 'ш', 'o': 'щ', 'm': 'ь',
24 's': 'ы', ']': 'ъ', "'": 'э', '.': 'ю', 'z': 'я', 'F': 'А', '<': 'Б',
25 'D': 'В', 'U': 'Г', 'L': 'Д', 'T': 'Е', '~': 'Ё', ':': 'Ж', 'P': 'З',
26 'B': 'И', 'Q': 'Й', 'R': 'К', 'K': 'Л', 'V': 'М', 'Y': 'Н', 'J': 'О',
27 'G': 'П', 'H': 'Р', 'C': 'С', 'N': 'Т', 'E': 'У', 'A': 'Ф', '{': 'Х',
28 'W': 'Ц', 'X': 'Ч', 'I': 'Ш', 'O': 'Щ', 'M': 'Ь', 'S': 'Ы', '}': 'Ъ',
29 '"': 'Э', '>': 'Ю', 'Z': 'Я',
30 }
32 GOODPWCH=ascii_letters + digits + ' '
35 ### FUNC
36 def err(msg: str):
37 for l in msg.splitlines():
38 stderr.write(f'ERR: {l}\n')
41 def out(s: str):
42 stdout.write(f'{s}\n')
45 def panic(code, msg):
46 err(msg)
47 exit(code)
50 def ptr_reverse(d: dict) -> dict:
51 return dict([(v, k) for k, v in d.items()])
54 def get_args(words: Optional[List[str]]) -> Iterable[str]:
55 if words and isinstance(words, (tuple, list)):
56 for i in words:
57 yield i.strip()
59 else:
60 for i in stdin:
61 yield i.strip()
63 def out_res(flag: bool, word: str, tr_word: str):
64 if flag:
65 out(f'"{word}" -> "{tr_word}"')
67 else:
68 out(f'{tr_word}')
71 # ARGS
72 ap = ArgumentParser(
73 prog='aw_pw_tool',
74 description='Инструмент для работы с паролями, их преобразованием и трансляцией'
75 )
77 ap.add_argument('-u', '--url', action='store_true', default=False,
78 help='Режим фильтрации пароля от опасных для url символов'
79 )
81 ap.add_argument('-S', '--show-passwd', action='store_true', default=False,
82 help='Показывать пароли до преобразования'
83 )
85 ap.add_argument('-t', '--pwtrans', action='store_true', default=False,
86 help='Режим трансляции паролей из английской в русскую раскладку')
88 ap.add_argument('-r', '--reverse', action='store_true', default=False,
89 help='Для трансляции паролей: переводим из русской в английскую раскладку')
92 ap.add_argument('word', nargs='*', help='Слово для перевода')
95 ### DO
96 try:
97 args = ap.parse_args()
99 if args.pwtrans:
100 if args.reverse:
101 d = ptr_reverse(TRDICT)
103 else:
104 d = TRDICT
106 for w in get_args(args.word):
107 out_res(
108 args.show_passwd,
109 w,
110 ''.join(map(lambda x: d[x] if x in d else x, w))
113 else:
114 # Init random generator
115 rnd_seed()
117 if args.url:
118 cur_safe_ch = SAFECH['url']
120 else:
121 cur_safe_ch = SAFECH['def']
123 GOODPWCH += cur_safe_ch
125 for w in get_args(args.word):
126 if len(w) == 0:
127 break
129 buf = ''
130 for c in w:
131 if c not in GOODPWCH:
132 c = rnd_choice(cur_safe_ch)
134 buf += c
136 out_res(
137 args.show_passwd,
138 w,
139 buf
142 except Exception as e:
143 err(f'{type(e).__name__}: {e}')
145 except KeyboardInterrupt:
146 exit()