Найти - Пользователи
Полная версия: Перекодировка русский символов при выполнении скрипта python через Cron
Начало » Python для новичков » Перекодировка русский символов при выполнении скрипта python через Cron
1 2
@19michail90@
Добрый день коллеги.

Возникла такая проблема. Написал скрипт, который делает выгрузку данных из Active Directory(AD).
Если я руками запускаю скрипт из консоли, то всё отлично работает, но стоит автоматизировать его выполнение через cron, так вместо русский букв, полученных из AD, получается следующее
u041cu0430u043au0441u0438u043c u0428u043au043eu043bu0430
Другие русские буквы в скрипте есть и он их обрабатывает нормально.
Проблема именно в выгрузке из AD

Очень буду благодарен в помощи, заранее спасибо всем откликнувшимся.
Ouroboros
В кроне попробуй вручную указать локаль перед выполнением.
@19michail90@
Добавил в конфиг cron'a следующее:

CONTENT_TYPE=“text/plain; charset=UTF-8”
CONTENT_TRANSFER_ENCODING=8bit
PYTHONIOENCODING=utf-8
LANG=ru_RU.UTF-8

Но проблема не ушла.
Ouroboros
@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
@19michail90@
Сделал так, как описано, проблема не ушла
py.user.next
@19michail90@
получается следующее
u041cu0430u043au0441u0438u043c u0428u043au043eu043bu0430
Куда выводятся эти последовательности?

Опиши подробно: версия питона, система, как запускаешь вручную, куда идёт вывод. Текст скрипта тоже скинь.
@19michail90@
Версия - 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)
@19michail90@
Эта последовательность u041cu0430u043au0441u0438u043c u0428u043au043eu043bu0430
добавляется в базу вместо Имени и Фамилии.
Когда запускаю в ручную, такой проблемы нет, данные добавляются в базу корректно.
py.user.next
Поставь третий питон и запускай на нём.

@19michail90@
загружаются в таблицу mysql guacamole
В MySQL у тебя таблицы на русском создаются?
@19michail90@
Для третьего питона MySQLdb другая?
Просто я пытался запустить через него, он отругался, что нет такого модуля.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB