Форум сайта python.su
Привет!
Получил время с NTP - сервера. Как его сделать системным?
На это:
os.system('date ‘ + time.strftime(’%m%d%H%M%Y.%S', time.localtime(response.tx_time)))
или это:
os.system('date -s “2 OCT 2010 18:00:00”')
Ответ:
date: невозможно установить дату: Операция не позволена
Спасибо за ответы.
Офлайн
ForrestВаша операционная система требует наличия определенных прав на выполнение операции. Как вы хотите питоном это исправить? Запускайте скрипт с sudo.
date: невозможно установить дату: Операция не позволена
Офлайн
FishHookЭто как бы понятно. Для меня вопрос больше в модуле и синтаксисе. Чем и как вызвать SUDO, и передать пароль SUDO, и чтоб все было автоматом.
Запускайте скрипт с sudo.
Офлайн
У вас есть питонья программа которую вы пишите. У программы не хватает прав на совершение неких операций. Вы спрашиваете, как запустить программу с повышением прав?
Ну как-то так видимо
domain@user/home$ sudo python my_program.py
Отредактировано FishHook (Май 22, 2020 13:26:32)
Офлайн
FishHook
Вот код, собрал из того что нашел в нэте. Делал под свои цели. Проверяет готовность сервера, если нет, спрашивает другой сервер. Если пропинговался, отправляем запрос - получить время. Потом через СУДО меняем время в системе.
Правьте под себя, товатрисчи, и будет вам счастье.
from time import strftime, localtime from ntplib import NTPClient from os import system from datetime import datetime ################################################################################### # кусок кода выполняет синхронизацию по времени с NTP- сервером # в случае не ответа одного пытается подключится к другому sudo_password = 'mypass' # sudo пароль hostnames = ["1.ua.pool.ntp.org", "0.ua.pool.ntp.org", # адреса серверов "3.ua.pool.ntp.org", "2.ua.pool.ntp.org"] minute_ntp = range(14, 60, 15) # список минут обновления времени min_now = range(0, 60) # список текущих минут для теста, в функ-ции заменить на текущую минуту cecond_main = 0.5 # секунды окончательного расчета cecond_first_update_data = [22, 44] # секунды для предварительного обновления cecond_ntp_end = 14 # после * секунды прекратить пинговать сервер NTP # В системе выставляем время по Гринвичу client = NTPClient() # создать класс клиента # не доконца понятно как работает опция -w , https://www.opennet.ru/man.shtml?topic=ping&category=8&russian=0 def time_ntp_sys(): # Проверка работоспособности сервера, если нет, попытка найти другой сервер # завершается если превысит cecond_ntp_end секунд response = None while True: now_time = datetime.now() # Текущая дата со временем cur_minute = now_time.minute # Минута текущая cur_second = now_time.second # Секунда текущие if response == 0 or cur_minute in minute_ntp and cur_second > cecond_ntp_end: break # условия выхода из ф-ии for hostname in hostnames: response = system("ping -c 1 -w 4 " + hostname) # пингуем if response == 0: # and then check the response... now_ntp = client.request(hostname, version=3) # полученные данные (класс) now_ntp_glob = now_ntp.tx_time # получ. время в глоб-ом форм.(секунд.микросек от эпохи) mlsec_txt = repr(now_ntp_glob).split('.')[1][:3] # получаю мили-да в тексте (избежать импорта datatime) now_ntp = strftime("%Y-%m-%d %H:%M:%S.{}".format(mlsec_txt), localtime(now_ntp_glob)) # формат-ие для передачи # now_ntp = "2020-05-23 10:08:51.399229" # тест пример comand = 'date -s ' # команда изменения системной даты # преобразование в строку вида: sudo date -s "2020-05-23 10:08:51.399229" comand = '%s "%s"' % (comand, now_ntp) system('echo %s|sudo -S %s' % (sudo_password, comand)) # Выполнение команды изменения даты системы break else: print('-------------------------------------------------') print(hostname, 'is down!') print("Не удача", response) print('-------------------------------------------------') time_ntp_sys()
Офлайн
FishHook
пробовал свой скрипт в другой системе, под Pycharm 2020(работает под 2018, модули все есть). Получал ошибку : ping : нет такой команды.
Спасибо если подскажите в чем причина, но нэте ответа так и не нашел или не понял.
Спасибо за ответ.
Офлайн
ForrestДа, она в пакете находится, а он может быть не установлен.
Получал ошибку : ping : нет такой команды.
ForrestВообще, тебе надо сделать два скрипта: один добывает время, которое надо поставить; второй получает время и устанавливает его в системе. Первый скрипт запускается без прав, а второй с правами.
Правьте под себя, товатрисчи, и будет вам счастье.
Офлайн
py.user.next
Не разобрался как работать с shell, но цель - все должно работать в вечном цикле, а алгоритм и обработка исключений не дают коду “упасть”. С shell это возможно?
P.S. Надо чтобы код работал в разных системах без проблем.
Спасибо.
Офлайн
ForrestВ консоли набери
все должно работать в вечном цикле
i=0; while true; do echo "number #$((++i))"; sleep 1; done
func() { local i=0 for i in `seq 1 10`; do echo "number #$i" sleep 1 done } while true; do func; done
ForrestВ Shell исключений нет, есть коды возврата из функций и из программ, которые можно проверять.
а алгоритм и обработка исключений не дают коду “упасть”. С shell это возможно?
cat x echo $? cat /etc/passwd echo $?
help [
help test
func() { local filename=$1 if cat "$filename" &>/dev/null; then echo "See file $filename" else echo "Can't see file $filename" fi } func x func /etc/passwd
[guest@localhost ~]$ func x
Can't see file x
[guest@localhost ~]$ func /etc/passwd
See file /etc/passwd
[guest@localhost ~]$
func1() { for i in `seq $1`; do echo -n abc done } func2() { sed 's/.*/&'"$1"'&/' } func3() { awk '{ print char_left $0 char_right }' char_left="$1" char_right="$2" } run() { func1 1 | func2 x | func3 "|" "|" func1 2 | func2 X | func3 "-===" "===-" } run
[guest@localhost ~]$ run
|abcxabc|
-===abcabcXabcabc===-
[guest@localhost ~]$
ForrestДля каждой системы обычно своя версия программы пишется. Питон также не поможет сделать кроссплатформенное приложение, так как разные операционные системы различаются по своей работе с файлами, с сетями и прочим вещам. Питон в лине при записи в файл пишет с LF на конце строки, а в винде при записи в файл пишет с CR LF на конце строки. При чтении в бинарном режиме в лине из файла, созданного в винде, код ломается, хотя файл писался этим же кодом, просто запущенным в той системе в то время. То есть сам питон, его интерпретатор по-разному работает в разных операционных системах. Также, например, программа ping в одной операционной системе и программа ping в другой операционной системе имеют разные опции, хотя и называются одинаково.
Надо чтобы код работал в разных системах без проблем.
Отредактировано py.user.next (Май 27, 2020 08:29:12)
Офлайн
py.user.next
Да, пробовал на разных версиях Pycharm (18-работает, на 20-й нет) и ОС Ubuntu вс ОК, а Linux Mint 19 -нет. А мне надо чтоб как в облаке, тут поработал переехал в другое место тоже работает под другой ОС. Пока все печально. Попробую версию Pycharm.
Офлайн