From 73611dacf199d0c8c075563c0b0a042d553e3442 Mon Sep 17 00:00:00 2001 From: calvin Date: Sat, 5 Aug 2023 14:12:08 +0800 Subject: [PATCH] FEAT:Support call system terminal(Macos&Linux) --- lib/view/page/server/tab.dart | 7 ++++--- lib/view/page/ssh/term.dart | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/lib/view/page/server/tab.dart b/lib/view/page/server/tab.dart index 0817b8df..462ad7bb 100644 --- a/lib/view/page/server/tab.dart +++ b/lib/view/page/server/tab.dart @@ -224,6 +224,7 @@ class _ServerPageState extends State _buildTopRightText(ss, cs), width7, _buildSSHBtn(spi), +// SizedBox(width: 5,), _buildMoreBtn(spi), ], ) @@ -268,12 +269,12 @@ class _ServerPageState extends State } Widget _buildSSHBtn(ServerPrivateInfo spi) { - return GestureDetector( - child: const Icon( + return IconButton( + icon: const Icon( Icons.terminal, size: 21, ), - onTap: () => AppRoute(SSHPage(spi: spi), 'ssh page').go(context), + onPressed: () => startSSH(spi, context), ); } diff --git a/lib/view/page/ssh/term.dart b/lib/view/page/ssh/term.dart index 88d13393..947c8c7c 100644 --- a/lib/view/page/ssh/term.dart +++ b/lib/view/page/ssh/term.dart @@ -1,3 +1,4 @@ +import 'dart:io' show Process, File; import 'dart:async'; import 'dart:convert'; @@ -25,6 +26,33 @@ import '../../../data/store/setting.dart'; import '../../../locator.dart'; import '../storage/sftp.dart'; +startSSH(ServerPrivateInfo spi, BuildContext context) { + if (isLinux || isMacOS) { + unawaited(() async { + List extarArgs = []; + if (spi.pubKeyId != null) { + String path = "/tmp/.serverbox_pk_${spi.pubKeyId}"; + File(path).openWrite().write(getPrivateKey(spi.pubKeyId!)); + extarArgs += ["-i", path]; + } + List sshCommand = ["ssh", spi.user + "@" + spi.ip] + extarArgs; + if (isLinux) { + Process.start("x-terminal-emulator", ["-e"] + sshCommand); + return; + } + if (isMacOS) { + Process.start("osascript", [ + "-e", + 'tell application "Terminal" to do script "${sshCommand.join(" ")}"' + ]); + return; + } + }()); + return; + } + AppRoute(SSHPage(spi: spi), 'ssh page').go(context); +} + class SSHPage extends StatefulWidget { final ServerPrivateInfo spi; final String? initCmd;