7
ноябрь
2025
15:50

Установка времени компьютера с помощью GPS на смартфоне через SSH

7 ноябрь 2025 15:50

Данный способ обеспечивает точность до 2-3 секунд, т.к. запрос-ответ через ssh занимает время.

Введение. Общая идея

Установка даты и времени является актуальной задачей, если нет передачи данных 4G.

Данный способ использует спутники GPS:

  • вначале синхронизируется смартфон по спутникам GPS/GLONASS.
  • затем через ssh к смартфону подключается компьютер и устанавливает время в операционной системе по часам смартфона (но часы ПК будут отставать в итоге на 2-3 секунды из-за запроса-ответа).

Почему не NTP или SNTP сервер?

  • В Android пользователю разрешены для использования порты выше 1024 включительно, поэтому в Android невозможно запустить сервер NTP таким образом, чтобы его порт стал 123. Все утилиты linux подключаются для синхронизации времени к порту 123.

Поэтому использовал другой вариант - SSH с произвольным портом выше 1023. В данном случае используется порт, предложенный SSHdaemon — 8022, но он может быть любым в промежутке 1024—49151.

Проверка, что порт прослушивается (открыт):

nmap 192.168.1.57 -p 1025

Должно быть так:
Starting Nmap 7.80 ( https://nmap.org ) at 2025-11-07 16:16 MSK
Nmap scan report for ... (192.168.1.57)
Host is up (0.45s latency).

PORT STATE SERVICE
1025/tcp open NFS-or-IIS

Nmap done: 1 IP address (1 host up) scanned in 0.77 seconds

В качестве SSH-сервера в Android использовал приложение SSHDaemon, доступное в Play Market - https://play.google.com/store/apps/details?id=com.daemon.ssh.

Доступ к SSH - по паролю.

Мобильная точка доступа Wi-Fi или маршрутизатор Wi-Fi, где ПК и смартфон находятся в одной локальной сети.

Решение

Данный код был отлажен мной в Linux Mint и Android:

sudo date +"%Y-%m-%d %T" --set "$(echo date +'%Y-%m-%d_%T' | sshpass -fpwd ssh -q 192.168.1.57 -p 8022 -l user | sed -e 's/_/ /')"

где
setpass - утилита для использования пароля вместо ключей,
pwd - имя файла. в котором хранится пароль ssh. pwd можно заменить на другой текст, в соотвествии с именем файла например, "1" или "a".
ssh - утилита командной строки для подключения к серверу ssh,
8022 - порт ssh сервера в ОС Android,
-l user - имя логина пользователя ssh,
q - тихий режим ssh без выдачи лишних сообщений,
192.168.1.57 - IP адрес сервера SSH (под Android),
sed - для замены подчеркивания на пробел,
date --set - команда для установки времени на локальном компьютере.

Перед запуском утилиты отключите синхронизацию времени NTP по сети:

timedatectl set-ntp false
timedatectl

Объяснение принципа действия

В Интернете на форумах встретил упрощённый способ установки времени ПК через консоль SSH — Secure Socket Shell, через которую выполняется команда date на удалённом ПК.

Варианты следующие:

date --set="$(ssh user@server date)"

ssh user@server sudo date -s @`( date -u +"%s" )`

date +%Y%m%d%T -s "`ssh user@server 'date "+%Y%m%d %T"'`"

date --set="$(ssh user@server 'date -u')"

Занялся отладкой первого варианта команды "date --set=".

Установка времени из командной строки в Linux вручную:

sudo date +"%Y-%m-%d %H:%M:%S" --set "2025-11-07 14:40:00"

Вывод текущей даты и времени в нужном формате в Android или Linux

date +"%Y-%m-%d %H:%M:%S"

(Результат: 2025-11-07 16:09:45).

Подключение к серверу SSH из Linux

Ручное подключение с запросом пароля:

ssh user@192.168.1.57 -p 8022

или

ssh 192.168.1.57 -p 8022 -l user

где user - имя логина пользователя ssh на сервере, которому предоставлен доступ,
192.168.1.57 - IP адрес сервера SSH,
8022 - порт TCP, который использует сервер SSH.

Автоматизированное подключение к серверу ssh с паролем:

sshpass -fpwd ssh -q 192.168.1.57 -p 8022 -l user

где pwd - текстовый файл в текущем каталоге, содержащий пароль ssh.

(Вместо -fpwd можно использовать пароль в открытом виде -ppassword, что не рекомендую. Между -f и именем файла, или ключом -p и паролем нет пробела. См. справку man sshpass).

Недостаток

Часы ПК при таком способе отстают от мирового времени на 2-3 секунды.

Включение NTP (при наличии Интернета)

Если Интернет появился, включите штатную синхронизацию времени Linux (в системах на основе SystemD):

timedatectl set-ntp true

Просмотр результата синхронизации времени:

timedatectl

Проверка отклонения времени ПК от мирового

Веб-сайт для проверки часов ПК: https://time.is.



Похожие публикации