Уведомления

Группа в Telegram: @pythonsu

#1 Март 21, 2018 13:56:10

@19michail90@
Зарегистрирован: 2018-03-21
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Перекодировка русский символов при выполнении скрипта python через Cron

Добрый день коллеги.

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

Очень буду благодарен в помощи, заранее спасибо всем откликнувшимся.

Офлайн

#2 Март 21, 2018 13:58:27

Ouroboros
Зарегистрирован: 2018-03-21
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Перекодировка русский символов при выполнении скрипта python через Cron

В кроне попробуй вручную указать локаль перед выполнением.

Офлайн

#3 Март 21, 2018 14:03:20

@19michail90@
Зарегистрирован: 2018-03-21
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Перекодировка русский символов при выполнении скрипта python через Cron

Добавил в конфиг cron'a следующее:

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

Но проблема не ушла.

Офлайн

#4 Март 21, 2018 14:05:03

Ouroboros
Зарегистрирован: 2018-03-21
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Перекодировка русский символов при выполнении скрипта python через Cron

@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

Офлайн

#5 Март 21, 2018 15:15:40

@19michail90@
Зарегистрирован: 2018-03-21
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Перекодировка русский символов при выполнении скрипта python через Cron

Сделал так, как описано, проблема не ушла

Офлайн

#6 Март 21, 2018 16:03:12

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Перекодировка русский символов при выполнении скрипта python через Cron

@19michail90@
получается следующее
u041cu0430u043au0441u0438u043c u0428u043au043eu043bu0430
Куда выводятся эти последовательности?

Опиши подробно: версия питона, система, как запускаешь вручную, куда идёт вывод. Текст скрипта тоже скинь.



Офлайн

#7 Март 21, 2018 16:38:45

@19michail90@
Зарегистрирован: 2018-03-21
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Перекодировка русский символов при выполнении скрипта python через Cron

Версия - 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)

Офлайн

#8 Март 21, 2018 16:39:58

@19michail90@
Зарегистрирован: 2018-03-21
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Перекодировка русский символов при выполнении скрипта python через Cron

Эта последовательность u041cu0430u043au0441u0438u043c u0428u043au043eu043bu0430
добавляется в базу вместо Имени и Фамилии.
Когда запускаю в ручную, такой проблемы нет, данные добавляются в базу корректно.

Офлайн

#9 Март 21, 2018 16:45:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Перекодировка русский символов при выполнении скрипта python через Cron

Поставь третий питон и запускай на нём.

@19michail90@
загружаются в таблицу mysql guacamole
В MySQL у тебя таблицы на русском создаются?



Отредактировано py.user.next (Март 21, 2018 16:47:35)

Офлайн

#10 Март 21, 2018 16:46:46

@19michail90@
Зарегистрирован: 2018-03-21
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Перекодировка русский символов при выполнении скрипта python через Cron

Для третьего питона MySQLdb другая?
Просто я пытался запустить через него, он отругался, что нет такого модуля.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version