mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 23:34:24 +01:00
new: shutdown | reboot on rootless user
This commit is contained in:
@@ -2,19 +2,24 @@ import 'dart:async';
|
||||
|
||||
import 'package:dartssh2/dartssh2.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:toolbox/core/extension/stringx.dart';
|
||||
import 'package:toolbox/core/extension/uint8list.dart';
|
||||
import 'package:toolbox/core/utils/ui.dart';
|
||||
|
||||
typedef OnStd = void Function(String data, StreamSink<Uint8List> sink);
|
||||
typedef OnStdin = void Function(StreamSink<Uint8List> sink);
|
||||
import '../../data/res/misc.dart';
|
||||
|
||||
typedef _OnStdout = void Function(String data, StreamSink<Uint8List> sink);
|
||||
typedef _OnStdin = void Function(StreamSink<Uint8List> sink);
|
||||
|
||||
typedef PwdRequestFunc = Future<String?> Function(String? user);
|
||||
|
||||
extension SSHClientX on SSHClient {
|
||||
Future<int?> exec(
|
||||
String cmd, {
|
||||
OnStd? onStderr,
|
||||
OnStd? onStdout,
|
||||
OnStdin? stdin,
|
||||
_OnStdout? onStderr,
|
||||
_OnStdout? onStdout,
|
||||
_OnStdin? stdin,
|
||||
}) async {
|
||||
final session = await execute(cmd);
|
||||
|
||||
@@ -49,4 +54,33 @@ extension SSHClientX on SSHClient {
|
||||
session.close();
|
||||
return session.exitCode;
|
||||
}
|
||||
|
||||
Future<int?> execWithPwd(
|
||||
String cmd, {
|
||||
BuildContext? context,
|
||||
_OnStdout? onStdout,
|
||||
_OnStdout? onStderr,
|
||||
_OnStdin? stdin,
|
||||
}) async {
|
||||
var isRequestingPwd = false;
|
||||
return await exec(
|
||||
cmd,
|
||||
onStderr: (data, sink) async {
|
||||
onStderr?.call(data, sink);
|
||||
if (isRequestingPwd) return;
|
||||
isRequestingPwd = true;
|
||||
if (data.contains('[sudo] password for ')) {
|
||||
final user = pwdRequestWithUserReg.firstMatch(data)?.group(1);
|
||||
if (context == null) return;
|
||||
final pwd = await showPwdDialog(context, user);
|
||||
if (pwd == null || pwd.isEmpty) {
|
||||
return;
|
||||
}
|
||||
sink.add('$pwd\n'.uint8List);
|
||||
}
|
||||
},
|
||||
onStdout: onStdout,
|
||||
stdin: stdin,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user