[备忘] 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.mzph.cn/news/845405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

故障——pod状态为pending该如何解决

一、报错问题 当您的虚拟机出现如下报错&#xff0c;您首先快照一下虚拟机如果仍然报错 二、解决方法 2.1 任务管理器 首先进入任务管理器&#xff08;CtrlAltDel&#xff09;内&#xff0c;查看所有vmware是否都处在运行的状态&#xff0c;可能会跳出一个比较突兀的进程&#…

【Spring Cloud】微服务链路跟踪Sleuth

目录 为什么要使用微服务链路跟踪微服务的现状多服务协同工作复杂的调用链条容易出错 微服务链路跟踪需要实现的需求实现监控决策避免技术债务快速定位故障 微服务链路跟踪的技术要求低消耗应用透明延展性可控采样率可视化 Spring Cloud Sleuth简介Spring Cloud Sleuth的4个特点…

通过Redis实现防止接口重复提交功能

本功能是在切面执行链基础上实现的功能&#xff0c;如果不知道切面执行链的同学&#xff0c;请看一下我之前专门介绍切面执行链的文章。 在SpringBoot项目中实现切面执行链功能-CSDN博客 1.定义防重复提交handler /*** 重复提交handler**/ AspectHandlerOrder public class …

自动控制:控制系统的稳定性

自动控制&#xff1a;控制系统的稳定性 在自动控制领域&#xff0c;控制系统的稳定性是一个至关重要的问题。稳定性决定了系统在受到扰动后是否能够恢复到平衡状态。本文将介绍控制系统稳定性的基本概念、如何利用特征值分析稳定性&#xff0c;并通过具体示例和Python代码展示…

【洛谷B3643】图的存储 解题报告

洛谷B3643 - 图的存储 题目描述 给定一个 n n n 个顶点 m m m 条边的无向图。请以邻接矩阵和邻接表的形式输出这一张图。 输入格式 第一行输入两个正整数 n n n 和 m m m&#xff0c;表示图的顶点数和边数。 第二行开始&#xff0c;往后 m m m 行&#xff0c;每行输入…

Docker中布置Jenkins实现Android项目的自动化构建

因项目需要&#xff0c;要在服务器上使用Jenkins完成Android项目的自动化构建&#xff0c;但服务器上登录的账户没有管理员权限&#xff0c;无法用sudo命令&#xff0c;因此需要把相应环境布置在docker中。 环境搭建 docker容器相关命令 创建容器 docker create -it contai…

解决 Git commit 或 Git merge 跑到 VIM 里面去了

像 git commit 分支名字 或 git merge 分支名字这个命令后面最好加上 -m "消息"&#xff0c;如果你不加上 -m "消息"的话&#xff0c;它会打开一个程序让你去加上消息&#xff0c;这个程序还是在控制台里面&#xff0c;只不过是 Linux 里面一个叫做 VIM 的…

【Python】解决Python报错:AttributeError: ‘function‘ object has no attribute ‘xxx‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

Linux中使用vi编辑器自动缩进4个字符

平常在Linux操作系统下书写shell脚本内容&#xff0c;或是把写好的shell内容直接复制到vi编辑器中&#xff0c;本来缩进好的字符&#xff0c;复制进去之后会自动变乱&#xff0c;这是因为Linux的vi编辑器默认是缩进8个字符造成&#xff0c;可以使用下面2个方法解决该问题的发生…

未来已来, AI将作为超级工具?

人工智能时代已来 1.AI将作为超级工具&#xff1a;AI是推动全产业数字化转型的高效工具&#xff0c;机遇比互联网时代大10倍&#xff0c;但只有1/3的机会留给初创企业。 2.硅谷AI市场分类中&#xff0c;特别看好开源平台&#xff0c;其将为初创企业和大企业提供更多选择。 3.…

C# 字节数组(byte[])拼接的性能对比测试

将C#中的三种字节数组拼接方式的性能做了一个对比测试&#xff0c;DEMO程序代码如下&#xff1a; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Byte数组拼接测…

使用 DuckDuckGo API 实现多种搜索功能

在日常生活中&#xff0c;我经常使用搜索引擎来查找信息&#xff0c;如谷歌和百度。然而&#xff0c;当我想通过 API 来实现这一功能时&#xff0c;会发现这些搜索引擎并没有提供足够的免费 API 服务。如果有这样的免费 API, 就能定时获取“关注实体”的相关内容&#xff0c;并…

Gbase 国产数据库

参考&#xff1a;参考&#xff1a; 5分钟学会Linux环境GBase 8t安装和部署 - 光洋山 - twt企业IT交流平台 (talkwithtrend.com)https://www.talkwithtrend.com/Article/197237 视频 GBase 8s快速入门-功能简介与演示-大数据教程-腾讯课堂 (qq.com)https://ke.qq.com/course/…

ADB日常使用命令

【ADB全称 Android Debug Bridge】 是Android SDK中的一个命令行工具adb命令可以直接操作管理Android模拟器或真实的Android设备&#xff08;手机&#xff09; 建立PC和模拟器连接 # 建立连接 adb connect 127.0.1: 模拟器端口号〈逍遥模拟器21503〉 # 验证是否连接成功 adb d…

整数乘除法练习题

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> #include<Windows.h>void show1(); .//开始界面 int getchoice(); //选择界面 int dowork(int n); //随机做乘除法 int num(); //用户确定做题的数量 v…

OrangePi AIpro 变身 Android 打包机

主板基本信息介绍 OrangePi AIpro&#xff0c;是香橙派联合华为精心打造&#xff0c;建设人工智能新生态而设计的一款开发板&#xff0c;这次为大家分享下我上手的这款 OrangePi AIpro 8GB&#xff08;算力达8TOPS&#xff09; 的一些小小的经验。 基本参数如下&#xff1a; …

首创十八道工艺,口味王引领槟榔产业高质量发展

说到槟榔&#xff0c;相信大伙都不会陌生&#xff0c;槟榔的历史可以追溯到汉代&#xff0c;不少文献有过记载&#xff0c;如汉代的沈约著的《咏竹槟榔盘》中提到“荐羞虽百品&#xff0c;所贵浮天实”&#xff1b;唐朝“诗仙”李白更是写道“何时黄金盘&#xff0c;一斛荐槟榔…

分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法

不废话&#xff0c;直接上正文。_ 方法一 思路&#xff1a;利用 BodyReader 直接读取 HttpContext 的 Request Body&#xff0c;再反序列化 var reqStream context.Request.BodyReader.AsStream(); var jsonObj JsonSerializer.Deserialize<CheckAndParsingMiddlewareM…

掌握正则表达式的力量:全方位解析PCRE的基础与进阶技能

Perl 兼容正则表达式&#xff08;PCRE&#xff09;是 Perl scripting language 中所使用的正则表达式语法标准。这些正则表达式在 Linux 命令行工具&#xff08;如 grep -P&#xff09;及其他编程语言和工具中也有广泛应用。以下是一些基础和进阶特性&#xff0c;帮你掌握和使用…

C++容器之前向链表(std::forward_list)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 assigns3.3 iterators3.4 capacity3.5 access3.6 assign3.7 emplace_front3.8 push_front3.9 pop_front3.10 emplace_after3.11 insert_after