做家乡网站代码,章丘做网站哪家强,自己的网络平台怎么做,如何创建网站服务器地址1.可行的Reboot方法
1.1 修改/etc/sudoers
假定当前用户是mimi#xff0c;增补这一行#xff1a; mimi ALL(ALL) NOPASSWD: ALL 这是为了免输指令。
sudoers文件尽量在覆盖前把它的权限改回去#xff1a; 原始权限 mimidebian-vm:~/test_app$ ls -l /tmp/sudoers -r--r-…1.可行的Reboot方法
1.1 修改/etc/sudoers
假定当前用户是mimi增补这一行 mimi ALL(ALL) NOPASSWD: ALL 这是为了免输指令。
sudoers文件尽量在覆盖前把它的权限改回去 原始权限 mimidebian-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(fsudo reboot, shellTrue) #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.shInvoke_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(fsudo {sh_path}, shellTrue, checkFalse)return Truereturn Falsedef Get_Invoke_Environment(script_releated_path):subprocess.run(fsudo printenv feng.txt, shellTrue) #sudo -E rebootreturn True2.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_filecfg/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(fsudo -u {exec_user} printenv reboot_log.txt, shellTrue)