You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无需root权限使用clock_settime设置系统时间的方法求助

解决Ubuntu 16.04下仅给时间同步程序赋予权限的方案

你遇到的核心问题是:修改系统时间需要root权限,但又不想让整个脚本(以及其中的其他程序)以root身份运行。最安全且高效的方式是给你的时间同步C程序单独赋予修改系统时间的权限,而不是给整个脚本提权。这里推荐使用Linux的capabilities机制,它能精细地给程序分配特定权限,无需全程root。

具体步骤:

  1. 编译你的时间同步程序
    假设你的C源文件名为gps_time_sync.c,编译生成可执行文件:

    gcc gps_time_sync.c -o gps_time_sync
    
  2. 给程序添加CAP_SYS_TIME权限
    Linux的CAP_SYS_TIME权限允许程序修改系统时间,我们可以用setcap命令给你的程序添加这个权限:

    sudo setcap cap_sys_time+ep /path/to/your/gps_time_sync
    
    • /path/to/your/替换成程序实际所在的绝对路径(比如/usr/local/bin/,推荐把程序放在系统目录下避免路径问题)。
    • +ep表示添加(+)这个权限的有效(e)和允许(p)位,确保程序运行时能使用该权限。
  3. 修改脚本调用方式
    现在你的脚本里直接调用这个程序即可,不需要加sudo

    # 脚本中的时间同步部分
    /path/to/your/gps_time_sync
    # 其他程序正常运行,无需root权限
    ./other_program1
    ./other_program2
    

注意事项:

  • 如果后续移动了这个时间同步程序,需要重新执行setcap命令,因为文件移动后capabilities会丢失。
  • 确保只有可信用户能修改这个程序文件,避免被恶意篡改(可以设置文件权限为chmod 755 gps_time_sync,只有所有者能修改)。
  • 桌面文件启动的脚本可能会使用不同的环境变量,建议调用程序时使用绝对路径,避免找不到可执行文件的问题。

备选方案(Polkit规则):

如果你更倾向于用Polkit控制权限,可以创建一个自定义规则:

  1. 创建文件/etc/polkit-1/localauthority/50-local.d/allow-gps-time-sync.pkla
  2. 写入以下内容:
    [Allow user to set system time via gps sync]
    Identity=unix-user:your_username
    Action=org.freedesktop.timedate1.set-time
    ResultActive=yes
    
    替换your_username为你的用户名,然后修改你的C程序调用timedatectl或者用DBus调用timedate1服务,但这种方式不如capabilities直接,适合更复杂的权限场景。

内容的提问来源于stack exchange,提问作者Morten Skovgaard

火山引擎 最新活动