Форум сайта python.su
0
Добрый день коллеги.
Возникла такая проблема. Написал скрипт, который делает выгрузку данных из Active Directory(AD).
Если я руками запускаю скрипт из консоли, то всё отлично работает, но стоит автоматизировать его выполнение через cron, так вместо русский букв, полученных из AD, получается следующее
u041cu0430u043au0441u0438u043c u0428u043au043eu043bu0430
Другие русские буквы в скрипте есть и он их обрабатывает нормально.
Проблема именно в выгрузке из AD
Очень буду благодарен в помощи, заранее спасибо всем откликнувшимся.
Офлайн
0
В кроне попробуй вручную указать локаль перед выполнением.
Офлайн
0
Добавил в конфиг cron'a следующее:
CONTENT_TYPE=“text/plain; charset=UTF-8”
CONTENT_TRANSFER_ENCODING=8bit
PYTHONIOENCODING=utf-8
LANG=ru_RU.UTF-8
Но проблема не ушла.
Офлайн
0
@19michail90@
Добавил в конфиг cron'a следующее:CONTENT_TYPE=“text/plain; charset=UTF-8”CONTENT_TRANSFER_ENCODING=8bitPYTHONIOENCODING=utf-8LANG=ru_RU.UTF-8Но проблема не ушла.
* * * * * LANG=ru_RU.UTF8 command
Офлайн
0
Сделал так, как описано, проблема не ушла
Офлайн
857
@19michail90@Куда выводятся эти последовательности?
получается следующее
u041cu0430u043au0441u0438u043c u0428u043au043eu043bu0430
Офлайн
0
Версия - Python 2.7.13
Система Debian 9
Ручной запуск - python /путь до скрипта/
Суть работы скрипта, добавляет пользователей из AD в систему удаленного доступа guacamole.
Полученные данные выгружаются из AD и загружаются в таблицу mysql guacamole.
#! /usr/bin/python # -*- coding: utf-8 -*- import re import MySQLdb import sys from ldap3 import Server, Connection, SIMPLE, SYNC, ASYNC, SUBTREE, ALL def create_new_user(name, local, ip): # Добавление в базу сотрудника для удаленного управления # Первая часть добавления сотрудника согласно логике работы Guacamole db = MySQLdb.connect(host='*********', user='*********', passwd='*********', db='*********', charset='utf8') cursor = db.cursor() sql = """INSERT INTO guacamole_connection(connection_name, parent_id, protocol) VALUES ('%(name)s', '%(local)d', 'vnc')"""%{"name":name, "local":local} cursor.execute(sql) # Получение connection_id последней записи из таблицы базы Guacamole last_id = """SELECT connection_id FROM guacamole_connection ORDER BY connection_id DESC LIMIT 1""" cursor.execute(last_id) data = cursor.fetchall() for rec in data: my_id = rec[0] # Добавление IP адреса сотрудника, полученного из Active Directory. sql_2 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value) VALUES ('%(my_id)d', 'hostname', '%(ip)s')"""%{"my_id":my_id, "ip":ip} cursor.execute(sql_2) # Добавление пароля сотрудника sql_3 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value) VALUES ('%(my_id)d', 'password', '**************')"""%{"my_id":my_id} cursor.execute(sql_3) # Добавление порта сотрудника sql_4 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value) VALUES ('%(my_id)d', 'port', 5900)"""%{"my_id":my_id} cursor.execute(sql_4) db.commit() db.close() def create_new_user_read_only(name, local, ip): # Добавление в базу сотрудника для удаленного управления # Первая часть добавления сотрудника согласно логике работы Guacamole db = MySQLdb.connect(host='*********', user='*********', passwd='*********', db='*********', charset='utf8') cursor = db.cursor() sql = """INSERT INTO guacamole_connection(connection_name, parent_id, protocol) VALUES ('%(name)s', '%(local)d', 'vnc')"""%{"name":name, "local":local} cursor.execute(sql) # Получение connection_id последней записи из таблицы базы Guacamole last_id = """SELECT connection_id FROM guacamole_connection ORDER BY connection_id DESC LIMIT 1""" cursor.execute(last_id) data = cursor.fetchall() for rec in data: my_id = rec[0] # Добавление IP адреса сотрудника, полученного из Active Directory. sql_2 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value) VALUES ('%(my_id)d', 'hostname', '%(ip)s')"""%{"my_id":my_id, "ip":ip} cursor.execute(sql_2) # Добавление пароля сотрудника sql_3 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value) VALUES ('%(my_id)d', 'password', '************')"""%{"my_id":my_id} cursor.execute(sql_3) # Добавление порта сотрудника sql_4 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value) VALUES ('%(my_id)d', 'port', 5900)"""%{"my_id":my_id} cursor.execute(sql_4) # Добавление статуса, только чтение sql_5 = """INSERT INTO guacamole_connection_parameter(connection_id, parameter_name, parameter_value) VALUES ('%(my_id)d', 'read-only', 'true')"""%{"my_id":my_id} cursor.execute(sql_5) db.commit() db.close() def delete_old_data(base): # Предварительная очистка таблиц от старых данных db = MySQLdb.connect(host='*********', user='*********', passwd='*********', db='*********', charset='utf8') cursor = db.cursor() sql = """DELETE FROM %(base)s WHERE connection_id >= 10"""%{"base":base} cursor.execute(sql) db.commit() db.close() def new_auto_increment(base): # Пересчет счетчика автоинкремента db = MySQLdb.connect(host='*********', user='*********', passwd='*********', db='*********', charset='utf8') cursor = db.cursor() sql = """ALTER TABLE %(base)s AUTO_INCREMENT = 11"""%{"base":base} cursor.execute(sql) db.commit() db.close() # DNS имя сервера Active Directory AD_SERVER = '**********' # Пользователь (логин) в Active Directory - нужно указать логин в AD AD_USER = '********' AD_PASSWORD = '********' AD_SEARCH_TREE = **********' server = Server(AD_SERVER) conn = Connection(server, user=AD_USER, password=AD_PASSWORD) conn.bind() # Должен вернуться ответ True # Поиск в Active Directory # примеры ldap фильтров можно посмотреть здесь conn.search(AD_SEARCH_TREE, '(&(objectCategory=Person)(objectClass=user)(employeeID=*))', SUBTREE, attributes = ['cn','employeeID']) base_1 = 'guacamole_connection' base_2 = 'guacamole_connection_parameter' delete_old_data(base_1) delete_old_data(base_2) new_auto_increment(base_1) new_auto_increment(base_2) create_new_user('Касса', 6, '*********') create_new_user_read_only('Касса', 10, '*********') create_new_user('Касса', 8, '*********') create_new_user_read_only('Касса', 12, '*********') create_new_user('Касса', 7, '*********') create_new_user_read_only('Касса', 11, '*********') for entry in conn.entries: name = str(entry.cn) ip = str(entry.employeeID) office = re.findall(r'*********', ip) office_1 = re.findall(r'*********', ip) alt = re.findall(r'*********', ip) krd = re.findall(r'172*********123', ip) ros = re.findall(r'172*********61', ip) if office: create_new_user(name, 3, ip) create_new_user_read_only(name, 9, ip) if office_1: create_new_user(name, 3, ip) create_new_user_read_only(name, 9, ip) if krd: create_new_user(name, 6, ip) create_new_user_read_only(name, 10, ip) if ros: create_new_user(name, 8, ip) create_new_user_read_only(name, 12, ip) if alt: create_new_user(name, 7, ip) create_new_user_read_only(name, 11, ip)
Офлайн
0
Эта последовательность u041cu0430u043au0441u0438u043c u0428u043au043eu043bu0430
добавляется в базу вместо Имени и Фамилии.
Когда запускаю в ручную, такой проблемы нет, данные добавляются в базу корректно.
Офлайн
857
Поставь третий питон и запускай на нём.
@19michail90@В MySQL у тебя таблицы на русском создаются?
загружаются в таблицу mysql guacamole
Отредактировано py.user.next (Март 21, 2018 16:47:35)
Офлайн
0
Для третьего питона MySQLdb другая?
Просто я пытался запустить через него, он отругался, что нет такого модуля.
Офлайн