当前位置: 首页 > news >正文

[备忘] Reboot Linux in python

1.可行的Reboot方法

1.1 修改/etc/sudoers

假定当前用户是mimi,增补这一行:

mimi ALL=(ALL) NOPASSWD: ALL

这是为了免输指令。

sudoers文件尽量在覆盖前把它的权限改回去:

原始权限

mimi@debian-vm:~/test_app$ ls -l /tmp/sudoers 
-r--r----- 1 root root 755 5月  30 16:04 /tmp/sudoers 

赋权:

sudo chmod 777 /tmp/sudoers

权限还原:

sudo chmod 640 /tmp/sudoers

1.2 将用户加入sudo,root组:

sudo usermod -aG sudo mimi

sudo usermod -aG root mimi

1.3 python执行设备复位

subprocess.run(f'sudo reboot', shell=True)  #'sudo -E reboot'

2.进阶:执行一个外部脚本

此时需要考虑相对路径的问题,脚本里用得到.py所在目录,进而得到.py主目录的方法实现,也就是那个:project_path,

在示例代码中,该.py位于python工程的一个下级目录。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 获取当前脚本文件所在目录的父目录,并构建相对路径
import os
import sys
current_dir = os.path.dirname(os.path.abspath(__file__))
project_path = os.path.join(current_dir, '..')
sys.path.append(project_path)
sys.path.append(current_dir)
import json
import subprocess
import shutil#推荐的执行外部指令的方法
def CMD_DOWNLOAD_APP(client:mqtt, fn, request_params):# 执行系统命令downloadapp_sh = "./ext_ep/on_mqtt_message_download_app.sh"Invoke_Script(downloadapp_sh)def Invoke_Script(script_releated_path):sh_path = os.path.join(project_path, script_releated_path)if(os.path.exists(sh_path)):subprocess.run(f'sudo {sh_path}', shell=True, check=False)return Truereturn Falsedef Get_Invoke_Environment(script_releated_path):subprocess.run(f'sudo  printenv > feng.txt', shell=True)  #'sudo -E reboot'return True

 2.1 示例:一个可用的远程升级.sh

这里包含了如下操作:

  • 脚本相对路径处理
  • json配置读取
  • ftp自动登陆,下载过程免交互的处理
  • tar升级过程。
#!/bin/bash
echo "this modle should download app from fix ftpserver, then tar zxvf, then reboot"# 获取脚本所在的目录
script_dir=$(dirname "$0")# 切换至应用程序所在的目录
cd "$script_dir/.." || exit# JSON文件路径
json_file="cfg/device_private.json"
# 使用jq解析JSON文件
ftp_server=$(jq -r ".ota_ftp.ip" $json_file)
ftp_user=$(jq -r ".ota_ftp.user" $json_file)
ftp_pass=$(jq -r ".ota_ftp.pass" $json_file)
upload_dir=$(jq -r ".ota_ftp.upload_dir" $json_file)
# 本地保存路径
local_incoming_dir=$(jq -r ".ota_ftp.local_incoming_dir" $json_file)
app_root=$(jq -r ".ota_ftp.app_root" $json_file)
mkdir -p $local_incoming_dir
mkdir -p $app_root# 登录FTP服务器
ftp -i -n $ftp_server <<END_SCRIPT
quote USER $ftp_user
quote PASS $ftp_pass
lcd $local_incoming_dir
cd $upload_dir
bin
mget *.tar.gz 
quit
END_SCRIPT
echo "ftp download..."# 获取最新的.tar.gz文件名
latest_file_local=$(ls -t $local_incoming_dir/*.tar.gz | head -n 1)
tar -xzf "$latest_file_local" -C $app_root
echo "extected!"exit 0

注意那个jq,这是一个sh用的json文件读取工具,它支持全路径名:

“.ota_ftp.ip”相当于: json["ota_ftp"]["ip"]

sudo apt-get install jq 

3.未解决的问题

1.我无法把用户加入比如operator的某个支持交互式登陆的组,让这个用户仅仅具备开关机权限。2.应用程序的执行用户可能是mimi,但是subprocess的缺省用户是root...?然后这个确认用户root居然无法直接具备开关机权限。。。

附录A 调试方法

1.可以利用类似的语句刺探调用环境的信息

#subprocess.run(f'sudo -u {exec_user} printenv > reboot_log.txt', shell=True) 

http://www.lryc.cn/news/358811.html

相关文章:

  • windows打开工程文件是顺序读写吗
  • 【Python】解决Python报错:AttributeError: ‘generator‘ object has no attribute ‘xxx‘
  • 【1800】【5.22-5.24】
  • 统计各个商品今年销售额与去年销售额的增长率及排名变化
  • 华为校招机试 - 矿车运输成本(20240522)
  • 【C++奇技淫巧】CRTP(奇特重现模板模式)
  • web学习笔记(六十一)
  • Nginx在Docker中的应用:容器化部署与扩展
  • vscode编译和调试wsl环境的c语言程序
  • (CPU/GPU)粒子继承贴图颜色发射
  • 【C#】 一个窗体能够显示、最小化、最大化、关闭时分别触发方法
  • pgsql基本操作
  • 3d渲染的常用概念和技术,渲染100邀请码1a12
  • 热敏电阻的设计
  • macOS上编译android的ffmpeg及ffmpeg.c
  • RxSwift - 实现一个MVVM架构的TableView
  • 在 CentOS 7 上安装并配置 Redis 允许远程连接的详细教程
  • 越来越多企业选择开源批发订货系统
  • KT6368A双模蓝牙芯片上电到正常发送AT指令或指令复位需要多久
  • 代码随想录算法训练营第38天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • 变现实谈,我要的不是灵光一现,而是真实的实现!——感悟篇
  • Matlab操作Excel筛选指定数据的对应数据
  • 对于C++STL及其时间复杂度的总结
  • Docker搭建FRP内网穿透服务器
  • 【NumPy】掌握NumPy的divide函数:执行高效的数组除法操作
  • 您的虚拟机未能继续运行,原因是遇到一个可纠正的错误。请保留挂起状态并纠正错误,或放弃挂起状态。
  • FPGA DMA IP核使用指南
  • 【博客20】缤果Matlab串口调试助手V1.0(中级篇)
  • 南京威雅学校:2024年度大戏《Tinkerbell(小叮当)》震撼落幕
  • Kotlin 函数