Уведомления

Группа в Telegram: @pythonsu

#1 Май 22, 2020 05:12:41

Forrest
Зарегистрирован: 2015-04-09
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Как изменить системное время?

Привет!
Получил время с 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: невозможно установить дату: Операция не позволена
Спасибо за ответы.

Офлайн

#2 Май 22, 2020 11:07:46

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как изменить системное время?

Forrest
date: невозможно установить дату: Операция не позволена
Ваша операционная система требует наличия определенных прав на выполнение операции. Как вы хотите питоном это исправить? Запускайте скрипт с sudo.



Офлайн

#3 Май 22, 2020 11:27:48

Forrest
Зарегистрирован: 2015-04-09
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Как изменить системное время?

FishHook
Запускайте скрипт с sudo.
Это как бы понятно. Для меня вопрос больше в модуле и синтаксисе. Чем и как вызвать SUDO, и передать пароль SUDO, и чтоб все было автоматом.
Спасибо.

Офлайн

#4 Май 22, 2020 13:26:07

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как изменить системное время?

У вас есть питонья программа которую вы пишите. У программы не хватает прав на совершение неких операций. Вы спрашиваете, как запустить программу с повышением прав?
Ну как-то так видимо

domain@user/home$ sudo python my_program.py 



Отредактировано FishHook (Май 22, 2020 13:26:32)

Офлайн

#5 Май 26, 2020 21:42:04

Forrest
Зарегистрирован: 2015-04-09
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Как изменить системное время?

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()

Офлайн

#6 Май 26, 2020 21:47:39

Forrest
Зарегистрирован: 2015-04-09
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Как изменить системное время?

FishHook
пробовал свой скрипт в другой системе, под Pycharm 2020(работает под 2018, модули все есть). Получал ошибку : ping : нет такой команды.
Спасибо если подскажите в чем причина, но нэте ответа так и не нашел или не понял.
Спасибо за ответ.

Офлайн

#7 Май 27, 2020 01:03:23

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

Как изменить системное время?

Forrest
Получал ошибку : ping : нет такой команды.
Да, она в пакете находится, а он может быть не установлен.

Forrest
Правьте под себя, товатрисчи, и будет вам счастье.
Вообще, тебе надо сделать два скрипта: один добывает время, которое надо поставить; второй получает время и устанавливает его в системе. Первый скрипт запускается без прав, а второй с правами.

И тогда тут уже возникает вопрос, нужно ли это писать на питоне. Для таких вещей Shell (язык) подходит лучше всего, так как там это всё удобно делать. И он как раз подходит для системных администраторов, которые ничего не смыслят в программировании.



Офлайн

#8 Май 27, 2020 05:37:18

Forrest
Зарегистрирован: 2015-04-09
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Как изменить системное время?

py.user.next
Не разобрался как работать с shell, но цель - все должно работать в вечном цикле, а алгоритм и обработка исключений не дают коду “упасть”. С shell это возможно?
P.S. Надо чтобы код работал в разных системах без проблем.
Спасибо.

Офлайн

#9 Май 27, 2020 08:00:08

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

Как изменить системное время?

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 $?
И обычно программа левая квадратная скобка (сокращение имени программы test) используется для проверки кода возврата, существования файла и так далее.
help [
help test

Но также и сами конструкции Shell могут проверять коды возврата программ, что даже программа 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)

Офлайн

#10 Май 27, 2020 09:49:57

Forrest
Зарегистрирован: 2015-04-09
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Как изменить системное время?

py.user.next
Да, пробовал на разных версиях Pycharm (18-работает, на 20-й нет) и ОС Ubuntu вс ОК, а Linux Mint 19 -нет. А мне надо чтоб как в облаке, тут поработал переехал в другое место тоже работает под другой ОС. Пока все печально. Попробую версию Pycharm.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version