OpenHarmony应用层调用Shell指令指南

张开发
2026/4/17 6:43:43 15 分钟阅读

分享文章

OpenHarmony应用层调用Shell指令指南
OpenHarmony应用层调用Shell指令指南文档概述说明1.文章由移远通信技术股份有限公司提供2.以下内容包含了个人理解仅供参考如有不合理处请联系笔者修改18770704023(微信同号)目录前言与背景开发环境调用方法方法一使用C/C标准库函数system()方法二使用C/C标准库函数popen()方法三通过系统属性触发指令注意事项总结前言与背景在OpenHarmony应用开发过程中开发者经常会遇到系统API无法直接实现某些功能但通过Shell命令可以实现的场景。本文档旨在提供几种在应用层调用Shell命令的方法帮助开发者解决这类问题。开发环境系统版本OpenHarmony 5.0.3开发语言ArkTS (ETS)、C编译环境Ubuntu 20.04.6 LTS涉及模块ArkUI、Native C调用方法方法一使用C/C标准库函数system()实现步骤创建Native C工程在napi_init.cpp文件中添加实现#includecstdlibstaticnapi_valueExecuteShell(napi_env env,napi_callback_info info){size_targc1;napi_value args[1]{nullptr};napi_get_cb_info(env,info,argc,args,nullptr,nullptr);if(argc1){napi_value result;napi_create_int32(env,-1,result);returnresult;}size_tstr_len0;napi_get_value_string_utf8(env,args[0],nullptr,0,str_len);char*commandnewchar[str_len1];napi_get_value_string_utf8(env,args[0],command,str_len1,nullptr);intresultsystem(command);delete[]command;napi_value ret;napi_create_int32(env,result,ret);returnret;}在ArkTS中调用// 示例调用bootanimation指令letresult:numbertestNapi.executeShell(/system/bin/bootanimation);// 其他可调用的命令示例reboot等特点优点实现简单适用于不需要获取命令输出的场景缺点无法获取命令执行的输出信息仅返回执行状态码注意要在build-profile.json5文件里对abiFilters进行配置不然调用接口的时候应用会闪退并报错方法二使用C/C标准库函数popen()实现步骤在napi_init.cpp文件中添加实现#includecstdio#includestringstaticnapi_valueExecuteShell2(napi_env env,napi_callback_info info){size_targc1;napi_value args[1]{nullptr};napi_get_cb_info(env,info,argc,args,nullptr,nullptr);if(argc1){napi_value result;napi_create_string_utf8(env,Error: No command provided,NAPI_AUTO_LENGTH,result);returnresult;}size_tstr_len0;napi_get_value_string_utf8(env,args[0],nullptr,0,str_len);char*commandnewchar[str_len1];napi_get_value_string_utf8(env,args[0],command,str_len1,nullptr);// 使用popen捕获命令输出FILE*pipepopen(command,r);if(!pipe){delete[]command;napi_value result;napi_create_string_utf8(env,Error: Failed to execute command,NAPI_AUTO_LENGTH,result);returnresult;}charbuffer[128];std::string output;while(fgets(buffer,sizeof(buffer),pipe)!nullptr){outputbuffer;}pclose(pipe);delete[]command;napi_value ret;napi_create_string_utf8(env,output.c_str(),NAPI_AUTO_LENGTH,ret);returnret;}在ArkTS中调用// 示例获取当前日期时间letdateResult:stringtestNapi.executeShell2(/system/bin/date);// 示例列出目录内容letlsResult:stringtestNapi.executeShell2(/system/bin/ls);// 示例获取当前工作目录letpwdResult:stringtestNapi.executeShell2(pwd);特点优点可以获取命令执行的输出信息适用于需要处理命令结果的场景缺点实现相对复杂需要处理文件流方法三通过系统属性触发指令实现步骤创建配置文件创建amixer_commands.cfg文件通过build.gn内置到system/etc/init目录{jobs:[{name:param:sys.amixer.commands0,condition:sys.amixer.commands0,cmds:[start execute_amixer_command0]}],services:[{name:execute_amixer_command0,start-mode:condition,path:[/system/bin/sh,-c,amixer cset nameVBC DAC0 DG Set 0 0],disabled:1,sandbox:0,uid:root,gid:[shell],once:1,secon:u:r:su:s0}]}在ArkTS中调用importsystemParameterEnhancefromohos.systemParameterEnhance;// 设置系统属性触发指令systemParameterEnhance.setSync(sys.amixer.commands,0);添加白名单在vendor/产品名/high_privilege_process_list.json中添加以下内容{name:execute_amixer_command0,uid:root,gid:root}特点优点可以以root权限执行命令适用于需要高权限的操作缺点需要修改系统配置适用于系统级应用开发注意事项权限问题应用层调用Shell命令可能受到权限限制某些命令需要特定权限才能执行安全风险执行Shell命令存在安全风险尤其是当命令参数来自用户输入时建议对输入参数进行严格验证性能考虑频繁执行Shell命令可能影响应用性能建议合理控制命令执行频率错误处理应妥善处理命令执行失败的情况对于popen方法要确保正确关闭文件流系统差异不同OpenHarmony版本可能存在差异请根据实际系统版本调整实现总结本文介绍了三种在OpenHarmony应用层调用Shell命令的方法system()函数适用于简单执行命令且不需要获取输出的场景popen()函数适用于需要获取命令输出的场景系统属性触发适用于需要高权限执行命令的场景开发者可以根据具体需求选择合适的方法。在使用过程中请注意权限管理、安全防护和错误处理确保应用的稳定性和安全性。附件有笔者的测试用例源码供大家参考。

更多文章