shell.dart 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import 'dart:ffi';
  2. import 'dart:io';
  3. import 'package:flutter/services.dart';
  4. import 'package:process_run/shell.dart';
  5. import 'package:path/path.dart' as path;
  6. import 'package:naiyouwl/app/const/const.dart';
  7. import 'package:naiyouwl/app/utils/logger.dart';
  8. import 'package:wl_base_help/wl_base_help.dart';
  9. Future<void> killProcess(String name) async {
  10. log.debug("kill: ", name);
  11. if (Platform.isWindows) {
  12. await Process.run('taskkill', ["/F", "/FI", "IMAGENAME eq $name"]);
  13. } else {
  14. await Process.run('bash', ["-c", "ps -ef | grep $name | grep -v grep | awk '{print \$2}' | xargs kill -9"]);
  15. }
  16. }
  17. Future<bool> isRunningAsAdmin() async {
  18. final Shell shell = Shell();
  19. try {
  20. if (Platform.isWindows) {
  21. // Windows: 使用 "net session" 检查管理员权限
  22. final List<ProcessResult> results = await shell.run('net session');
  23. if (results.isNotEmpty && results[0].exitCode == 0) {
  24. return true;
  25. }
  26. } else if (Platform.isMacOS || Platform.isLinux) {
  27. // macOS / Linux: 使用 "id -u" 检查管理员权限
  28. final List<ProcessResult> results = await shell.run('id -u');
  29. if (results.isNotEmpty && results[0].stdout.trim() == '0') {
  30. return true;
  31. }
  32. }
  33. } catch (e) {
  34. // 如果出现异常 (如 ShellException),默认认为没有管理员权限
  35. return false;
  36. }
  37. return false;
  38. }
  39. Future<bool> killCCoreProcess(int pid) async {
  40. return Process.killPid(pid);
  41. }
  42. Future<ProcessResult> runCCore(String executable, List<String> arguments) async {
  43. String executablePath = shellArgument(executable).replaceAll(' ', r'\\ ');
  44. if (Platform.isMacOS) {
  45. return await Process.run(
  46. path.join(Paths.assetsBin.path, executablePath),
  47. [executable, ...arguments],
  48. );
  49. } else if (Platform.isWindows) {
  50. return await Process.run(
  51. path.join(Paths.assetsBin.path, executablePath),
  52. [executable, ...arguments],
  53. );
  54. } else {
  55. // https://blog.csdn.net/weixin_49867936/article/details/109612918
  56. // https://askubuntu.com/questions/287845/how-to-configure-pkexec
  57. return await Process.run("pkexec", [executable, ...arguments]);
  58. }
  59. }
  60. Future<ProcessResult> runCCoreAsAdmin(String executable, List<String> arguments) async {
  61. // String executablePath = shellArgument(executable).replaceAll(' ', r'\\ ');
  62. return await Process.run(
  63. path.join(Paths.assetsBin.path, "run-as-admin.bat"),
  64. [executable, ...arguments],
  65. );
  66. }
  67. Future<ProcessResult> runAsAdmin(String executable, List<String> arguments) async {
  68. String executablePath = shellArgument(executable).replaceAll(' ', r'\\ ');
  69. //executablePath = executablePath.substring(1, executablePath.length - 1);
  70. if (Platform.isMacOS) {
  71. return await Process.run(
  72. 'osascript',
  73. [
  74. '-e',
  75. shellArguments(['do', 'shell', 'script', '$executablePath ${shellArguments(arguments)}', 'with', 'administrator', 'privileges']),
  76. ],
  77. );
  78. } else if (Platform.isWindows) {
  79. return await Process.run(
  80. path.join(Paths.assetsBin.path, "run-as-admin.bat"),
  81. [executable, ...arguments],
  82. );
  83. } else {
  84. // https://blog.csdn.net/weixin_49867936/article/details/109612918
  85. // https://askubuntu.com/questions/287845/how-to-configure-pkexec
  86. return await Process.run("pkexec", [executable, ...arguments]);
  87. }
  88. }
  89. // Platform messages are asynchronous, so we initialize in an async method.
  90. Future<String> platformState() async {
  91. String platformVersion;
  92. if(Platform.isWindows){
  93. try {
  94. final _wlBaseHelpPlugin = WlBaseHelp();
  95. platformVersion =
  96. await _wlBaseHelpPlugin.getPlatformVersion() ?? 'Unknown platform version';
  97. platformVersion = platformVersion + ClashName.architecture.name;
  98. } on PlatformException {
  99. platformVersion = 'Failed to get platform version.';
  100. }
  101. return platformVersion;
  102. }
  103. else {
  104. return ClashName.os.name + "-" + ClashName.architecture.name;
  105. }
  106. }
  107. Future<void> onRunAdmin() async {
  108. if(Platform.isWindows){
  109. try {
  110. final _wlBaseHelpPlugin = WlBaseHelp();
  111. await _wlBaseHelpPlugin.runAsAdministrator();
  112. } on PlatformException {
  113. }
  114. }
  115. }
  116. Future<bool> onIsRunAdmin() async {
  117. bool isAdmin;
  118. try {
  119. final _wlBaseHelpPlugin = WlBaseHelp();
  120. isAdmin = await _wlBaseHelpPlugin.isRunningAsAdmin() ?? false;
  121. } on PlatformException {
  122. isAdmin = false;
  123. }
  124. return isAdmin;
  125. }
  126. Future<bool> onIsProcessRunning(String passName) async {
  127. bool isRun = false;
  128. if(Platform.isWindows){
  129. try {
  130. final _wlBaseHelpPlugin = WlBaseHelp();
  131. isRun = await _wlBaseHelpPlugin.isProcessRunning(passName) ?? false;
  132. if (isRun){
  133. await onKillProcess(passName);
  134. }
  135. } on PlatformException {
  136. isRun = false;
  137. }
  138. }
  139. return isRun;
  140. }
  141. Future<void> onKillProcess(String passName) async {
  142. try {
  143. final _wlBaseHelpPlugin = WlBaseHelp();
  144. await _wlBaseHelpPlugin.killProcess(passName);
  145. } on PlatformException {
  146. }
  147. }