From c42b105fd61eed3811420f5fb8c7b1853bbc3b49 Mon Sep 17 00:00:00 2001 From: ProxySU Date: Tue, 8 Sep 2020 19:54:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0SSR+TLS+Caddy=E6=96=B9?= =?UTF-8?q?=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProxySU/MainWindow.xaml | 73 +- ProxySU/MainWindow.xaml.cs | 1341 ++++++++++++++++++++++- ProxySU/Properties/AssemblyInfo.cs | 4 +- ProxySU/ResultClientInformation.xaml | 71 +- ProxySU/ResultClientInformation.xaml.cs | 206 +++- ProxySU/Translations/ProxySU.en-US.xaml | 14 +- ProxySU/Translations/ProxySU.zh-CN.xaml | 15 +- ProxySU/Translations/ProxySU.zh-TW.xaml | 13 +- ProxySU/TrojanGoTemplateWindow.xaml | 4 +- ProxySU/V2RayTemplateWindow.xaml.cs | 6 +- ProxySU/bin/Beta/Beta.zip | Bin 519338 -> 522505 bytes 11 files changed, 1662 insertions(+), 85 deletions(-) diff --git a/ProxySU/MainWindow.xaml b/ProxySU/MainWindow.xaml index b0704e0..1cbe228 100644 --- a/ProxySU/MainWindow.xaml +++ b/ProxySU/MainWindow.xaml @@ -5,7 +5,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:ProxySU" mc:Ignorable="d" - Title="ProxySU - v2.0.4" Height="625" Width="530"> + Title="ProxySU - v2.1.0" Height="625" Width="530"> @@ -126,7 +126,7 @@ - + @@ -185,7 +185,7 @@ - + @@ -238,7 +238,7 @@ - + @@ -277,9 +277,9 @@ - - - + + + @@ -294,7 +294,7 @@ - + @@ -331,8 +331,8 @@ - - + + @@ -343,6 +343,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/ProxySU/MainWindow.xaml.cs b/ProxySU/MainWindow.xaml.cs index e361dc6..9e9ab70 100644 --- a/ProxySU/MainWindow.xaml.cs +++ b/ProxySU/MainWindow.xaml.cs @@ -107,6 +107,9 @@ namespace ProxySU TextBoxNaivePassword.Text = RandomUUID(); TextBoxNaiveUser.Text = RandomUserName(); + //初始化SSR的密码 + TextBoxSSRPassword.Text = RandomUUID(); + //初始化三合一的所有内容 //TextBoxV2rayUUID3in1.Text = RandomUUID(); //TextBoxV2rayPath3in1.Text = "/ray"; @@ -1605,7 +1608,7 @@ namespace ProxySU { //设置Caddy随机监听的端口,用于Trojan-go,Trojan,V2Ray vless TLS Random random = new Random(); - randomCaddyListenPort = random.Next(2000, 9000); + randomCaddyListenPort = random.Next(10001, 30000); //指向Caddy监听的随机端口 serverJson["inbounds"][0]["settings"]["fallbacks"][0]["dest"] = randomCaddyListenPort; } @@ -1999,7 +2002,7 @@ namespace ProxySU TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 //设置域名 - sshShellCommand = $"sed -i 's/##domain##/{ReceiveConfigurationParameters[4]}/' {upLoadPath}"; + sshShellCommand = $"sed -i 's/##domain##/{ReceiveConfigurationParameters[4]}/g' {upLoadPath}"; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 currentShellCommandResult = client.RunCommand(sshShellCommand).Result; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -2013,7 +2016,7 @@ namespace ProxySU //设置伪装网站 if (String.IsNullOrEmpty(ReceiveConfigurationParameters[7])==false) { - sshShellCommand = $"sed -i 's/##sites##/proxy \\/ {ReceiveConfigurationParameters[7]}/' {upLoadPath}"; + sshShellCommand = $"sed -i 's/##sites##/proxy \\/ {ReceiveConfigurationParameters[7]}/' {upLoadPath}"; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 currentShellCommandResult = client.RunCommand(sshShellCommand).Result; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -3482,7 +3485,7 @@ namespace ProxySU { //设置Caddy随机监听的端口,用于Trojan-go,Trojan,V2Ray vless TLS Random random = new Random(); - randomCaddyListenPort = random.Next(2000, 9000); + randomCaddyListenPort = random.Next(10001, 30000); JObject serverJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); serverJson["run_type"] = "server"; @@ -3790,7 +3793,7 @@ namespace ProxySU TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 //设置域名 - sshShellCommand = $"sed -i 's/##domain##/{ReceiveConfigurationParameters[4]}/' {upLoadPath}"; + sshShellCommand = $"sed -i 's/##domain##/{ReceiveConfigurationParameters[4]}/g' {upLoadPath}"; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 currentShellCommandResult = client.RunCommand(sshShellCommand).Result; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -5079,7 +5082,7 @@ namespace ProxySU //设置Caddy随机监听的端口,用于Trojan-go,Trojan,V2Ray vless TLS Random random = new Random(); - randomCaddyListenPort = random.Next(2000, 9000); + randomCaddyListenPort = random.Next(10001, 30000); //设置转发到Caddy的随机监听端口 serverJson["remote_port"] = randomCaddyListenPort; @@ -5372,7 +5375,7 @@ namespace ProxySU //设置域名 - sshShellCommand = $"sed -i 's/##domain##/{ReceiveConfigurationParameters[4]}/' {upLoadPath}"; + sshShellCommand = $"sed -i 's/##domain##/{ReceiveConfigurationParameters[4]}/g' {upLoadPath}"; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 currentShellCommandResult = client.RunCommand(sshShellCommand).Result; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 @@ -5513,7 +5516,7 @@ namespace ProxySU TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 Thread.Sleep(3000); - //****** "正在第二次尝试启动Trojan-go!" ****** + //****** "正在第二次尝试启动Trojan!" ****** currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartSoftSecond").ToString() + "Trojan!"; textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); currentShellCommandResult = currentStatus; @@ -5530,7 +5533,7 @@ namespace ProxySU TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 currentShellCommandResult = client.RunCommand(sshShellCommand).Result; TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 - if (currentShellCommandResult.Contains("usr/local/bin/trojan-go") == true) + if (currentShellCommandResult.Contains("usr/local/bin/trojan") == true) { //****** "Trojan启动成功!" ****** currentStatus = "Trojan" + Application.Current.FindResource("DisplayInstallInfo_StartSoftOK").ToString(); @@ -6023,11 +6026,11 @@ namespace ProxySU if (String.Equals(testDomain, "https:/") || String.Equals(testDomain, "http://")) { //MessageBox.Show(testDomain); - MainWindow.ReceiveConfigurationParameters[7] = TextBoxNaiveSites.Text.Replace("/", "\\/"); + ReceiveConfigurationParameters[7] = TextBoxNaiveSites.Text.Replace("/", "\\/"); } else { - MainWindow.ReceiveConfigurationParameters[7] = "http:\\/\\/" + TextBoxNaiveSites.Text; + ReceiveConfigurationParameters[7] = "http:\\/\\/" + TextBoxNaiveSites.Text; } } @@ -7119,8 +7122,1318 @@ namespace ProxySU { TextBoxNaiveUser.Text = RandomUserName(); } - -#endregion + + #endregion + + #region SSR+TLS+Caddy相关 + + //SSR参数传递 + private void ButtonSSRSetUp_Click(object sender, RoutedEventArgs e) + { + ConnectionInfo connectionInfo = GenerateConnectionInfo(); + if (connectionInfo == null) + { + //****** "远程主机连接信息有误,请检查!" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorHostConnection").ToString()); + return; + } + //清空参数空间 + for (int i = 0; i != ReceiveConfigurationParameters.Length; i++) + + { + ReceiveConfigurationParameters[i] = ""; + } + if (string.IsNullOrEmpty(TextBoxSSRHostDomain.Text.ToString()) == true) + { + //****** "域名不能为空,请检查相关参数设置!" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_DomainNotEmpty").ToString()); + return; + } + + //传递域名 + ReceiveConfigurationParameters[4] = TextBoxSSRHostDomain.Text.ToString(); + //传递伪装网站 + ReceiveConfigurationParameters[7] = TextBoxSSRSites.Text.ToString(); + //处理伪装网站域名中的前缀 + if (TextBoxSSRSites.Text.ToString().Length >= 7) + { + string testDomain = TextBoxSSRSites.Text.Substring(0, 7); + if (String.Equals(testDomain, "https:/") || String.Equals(testDomain, "http://")) + { + //MessageBox.Show(testDomain); + ReceiveConfigurationParameters[7] = TextBoxSSRSites.Text.Replace("/", "\\/"); + } + else + { + ReceiveConfigurationParameters[7] = "http:\\/\\/" + TextBoxSSRSites.Text; + } + } + //传递服务端口 + ReceiveConfigurationParameters[1] = "443"; + //传递密码(uuid) + ReceiveConfigurationParameters[2] = TextBoxSSRPassword.Text.ToString(); + + + string serverConfig = ""; //服务端配置文件 + string clientConfig = ""; //生成的客户端配置文件 + string upLoadPath = ""; //服务端文件位置 + + Thread thread = new Thread(() => StartSetUpSSR(connectionInfo, TextBlockSetUpProcessing, ProgressBarSetUpProcessing, serverConfig, clientConfig, upLoadPath)); + thread.SetApartmentState(ApartmentState.STA); + thread.Start(); + } + + //登录远程主机布署SSR+TLS+Caddy程序 + private void StartSetUpSSR(ConnectionInfo connectionInfo, TextBlock textBlockName, ProgressBar progressBar, string serverConfig, string clientConfig, string upLoadPath) + { + //******"正在登录远程主机......"****** + string currentStatus = Application.Current.FindResource("DisplayInstallInfo_Login").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + try + { + #region 主机指纹,暂未启用 + //byte[] expectedFingerPrint = new byte[] { + // 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31, + // 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b + // }; + #endregion + using (var client = new SshClient(connectionInfo)) + + { + #region ssh登录验证主机指纹代码块,暂未启用 + // client.HostKeyReceived += (sender, e) => + // { + // if (expectedFingerPrint.Length == e.FingerPrint.Length) + // { + // for (var i = 0; i < expectedFingerPrint.Length; i++) + // { + // if (expectedFingerPrint[i] != e.FingerPrint[i]) + // { + // e.CanTrust = false; + // break; + // } + // } + // } + // else + // { + // e.CanTrust = false; + // } + // }; + #endregion + + client.Connect(); + if (client.IsConnected == true) + { + //******"主机登录成功"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginSuccessful").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果在监视窗口 + + Thread.Sleep(1000); + } + + //******"检测是否运行在root权限下..."****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_DetectionRootPermission").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"id -u"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + string testRootAuthority = currentShellCommandResult; + if (testRootAuthority.Equals("0\n") == false) + { + //******"请使用具有root权限的账户登录主机!!"****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorRootPermission").ToString()); + client.Disconnect(); + return; + } + else + { + //******"检测结果:OK!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_DetectionRootOK").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + + //******"检测系统是否已经安装SSR......"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestExistSoft").ToString() + "SSR......"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + sshShellCommand = @"if [ -f /usr/local/shadowsocks/server.py ];then echo '1';else echo '0'; fi"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + string resultCmdTestTrojanInstalled = currentShellCommandResult; + + if (resultCmdTestTrojanInstalled.Contains("1") == true) + { + MessageBoxResult messageBoxResult = MessageBox.Show( + //******"远程主机已安装"****** + Application.Current.FindResource("MessageBoxShow_ExistedSoft").ToString() + + "SSR" + + //******",是否强制重新安装?"****** + Application.Current.FindResource("MessageBoxShow_ForceInstallSoft").ToString(), "", MessageBoxButton.YesNo, MessageBoxImage.Question); + if (messageBoxResult == MessageBoxResult.No) + { + //******"安装取消,退出"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_InstallationCanceledExit").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + client.Disconnect(); + return; + } + else + { + //******"已选择强制安装SSR!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ForceInstallSoft").ToString() + "SSR!"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + Thread.Sleep(1000); + } + } + else + { + //******"检测结果:未安装SSR!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_NoInstalledSoft").ToString() + "SSR!"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus);//显示命令执行的结果 + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + //******"检测系统是否符合安装要求......"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_CheckSystemRequirements").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + //sshShellCommand = @"uname -m"; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + //currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //string resultCmd = currentShellCommandResult; + //if (resultCmd.Contains("x86_64") == false) + //{ + // //******"请在x86_64系统中安装Trojan" ****** + // MessageBox.Show(Application.Current.FindResource("MessageBoxShow_PleaseInstallSoftAtX64").ToString() + "NaiveProxy......"); + // //****** "系统环境不满足要求,安装失败!!" ****** + // currentStatus = Application.Current.FindResource("DisplayInstallInfo_MissingSystemComponents").ToString(); + // textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + // currentShellCommandResult = currentStatus; + // TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + // Thread.Sleep(1000); + //} + + + //检测系统是否支持yum 或 apt或zypper,且支持Systemd + //如果不存在组件,则命令结果为空,string.IsNullOrEmpty值为真 + + //bool getApt = String.IsNullOrEmpty(client.RunCommand("command -v apt").Result); + //bool getDnf = String.IsNullOrEmpty(client.RunCommand("command -v dnf").Result); + //bool getYum = String.IsNullOrEmpty(client.RunCommand("command -v yum").Result); + //bool getZypper = String.IsNullOrEmpty(client.RunCommand("command -v zypper").Result); + //bool getSystemd = String.IsNullOrEmpty(client.RunCommand("command -v systemctl").Result); + //bool getGetenforce = String.IsNullOrEmpty(client.RunCommand("command -v getenforce").Result); + + sshShellCommand = @"command -v apt"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + bool getApt = String.IsNullOrEmpty(currentShellCommandResult); + + sshShellCommand = @"command -v dnf"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + bool getDnf = String.IsNullOrEmpty(currentShellCommandResult); + + sshShellCommand = @"command -v yum"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + bool getYum = String.IsNullOrEmpty(currentShellCommandResult); + + sshShellCommand = @"command -v zypper"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + bool getZypper = String.IsNullOrEmpty(currentShellCommandResult); + + sshShellCommand = @"command -v systemctl"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + bool getSystemd = String.IsNullOrEmpty(currentShellCommandResult); + + sshShellCommand = @"command -v getenforce"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + bool getGetenforce = String.IsNullOrEmpty(currentShellCommandResult); + + + //没有安装apt,也没有安装dnf\yum,也没有安装zypper,或者没有安装systemd的,不满足安装条件 + //也就是apt ,dnf\yum, zypper必须安装其中之一,且必须安装Systemd的系统才能安装。 + if ((getApt && getDnf && getYum && getZypper) || getSystemd) + { + //******"系统缺乏必要的安装组件如:apt||dnf||yum||zypper||Syetemd,主机系统推荐使用:CentOS 7/8,Debian 8/9/10,Ubuntu 16.04及以上版本"****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_MissingSystemComponents").ToString()); + + //******"系统环境不满足要求,安装失败!!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_MissingSystemComponents").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + client.Disconnect(); + return; + } + else + { + //******"检测结果:OK!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_SystemRequirementsOK").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + //设置安装软件所用的命令格式 + //为假则表示系统有相应的组件。 + + if (getApt == false) + { + sshCmdUpdate = @"apt -qq update"; + sshCmdInstall = @"apt -y -qq install "; + } + else if (getDnf == false) + { + sshCmdUpdate = @"dnf -q makecache"; + sshCmdInstall = @"dnf -y -q install "; + } + else if (getYum == false) + { + sshCmdUpdate = @"yum -q makecache"; + sshCmdInstall = @"yum -y -q install "; + } + else if (getZypper == false) + { + sshCmdUpdate = @"zypper ref"; + sshCmdInstall = @"zypper -y install "; + } + + //判断是否启用了SELinux,如果启用了,并且工作在Enforcing模式下,则改为Permissive模式 + if (getGetenforce == false) + { + sshShellCommand = @"getenforce"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + string testSELinux = currentShellCommandResult; + + if (testSELinux.Contains("Enforcing") == true) + { + //******"检测到系统启用SELinux,且工作在严格模式下,需改为宽松模式!修改中......"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableSELinux").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"setenforce 0"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + sshShellCommand = @"sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //******"修改完毕!"****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_SELinuxModifyOK").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + + } + + //****** "正在检测域名是否解析到当前VPS的IP上......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestDomainResolve").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + //在相应系统内安装curl(如果没有安装curl) + if (string.IsNullOrEmpty(client.RunCommand("command -v curl").Result) == true) + { + sshShellCommand = $"{sshCmdUpdate}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = $"{sshCmdInstall}curl"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + //检测域名是否解析正确 + sshShellCommand = @"curl -4 ip.sb"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + string nativeIp = currentShellCommandResult; + + sshShellCommand = "ping " + ReceiveConfigurationParameters[4] + " -c 1 | grep -oE -m1 \"([0-9]{1,3}\\.){3}[0-9]{1,3}\""; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + string resultTestDomainCmd = currentShellCommandResult; + if (String.Equals(nativeIp, resultTestDomainCmd) == true) + { + //****** "解析正确!OK!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_DomainResolveOK").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + } + else + { + //****** "域名未能正确解析到当前VPS的IP上!安装失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorDomainResolve").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + //****** "域名未能正确解析到当前VPS的IP上,请检查!若解析设置正确,请等待生效后再重试安装。如果域名使用了CDN,请先关闭!" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorDomainResolve").ToString()); + client.Disconnect(); + return; + } + + //检测是否安装lsof + if (string.IsNullOrEmpty(client.RunCommand("command -v lsof").Result) == true) + { + sshShellCommand = $"{sshCmdUpdate}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = $"{sshCmdInstall}lsof"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + //****** "检测端口占用情况......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestPortUsed").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + sshShellCommand = @"lsof -n -P -i :80 | grep LISTEN"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + string testPort80 = currentShellCommandResult; + + sshShellCommand = @"lsof -n -P -i :443 | grep LISTEN"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + string testPort443 = currentShellCommandResult; + + + if (String.IsNullOrEmpty(testPort80) == false || String.IsNullOrEmpty(testPort443) == false) + { + //****** "80/443端口之一,或全部被占用,将强制停止占用80/443端口的程序?" ****** + MessageBoxResult dialogResult = MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorPortUsed").ToString(), "Stop application", MessageBoxButton.YesNo); + if (dialogResult == MessageBoxResult.No) + { + //****** "端口被占用,安装失败......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorPortUsedFail").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + client.Disconnect(); + return; + } + + //****** "正在释放80/443端口......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ReleasePort").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + if (String.IsNullOrEmpty(testPort443) == false) + { + string[] cmdResultArry443 = testPort443.Split(' '); + + sshShellCommand = $"systemctl stop {cmdResultArry443[0]}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = $"systemctl disable {cmdResultArry443[0]}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = $"kill -9 {cmdResultArry443[3]}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + + if (String.IsNullOrEmpty(testPort80) == false) + { + string[] cmdResultArry80 = testPort80.Split(' '); + + sshShellCommand = $"systemctl stop {cmdResultArry80[0]}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = $"systemctl disable {cmdResultArry80[0]}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = $"kill -9 {cmdResultArry80[3]}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + //****** "80/443端口释放完毕!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ReleasePortOK").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + } + else + { + //****** "检测结果:未被占用!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_PortNotUsed").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + + //****** "系统环境检测完毕,符合安装要求,开始布署......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstalling").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + //****** "开启防火墙相应端口......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_OpenFireWallPort").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + if (String.IsNullOrEmpty(client.RunCommand("command -v firewall-cmd").Result) == false) + { + + sshShellCommand = @"firewall-cmd --zone=public --add-port=80/tcp --permanent"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"firewall-cmd --zone=public --add-port=443/tcp --permanent"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"yes | firewall-cmd --reload"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + if (String.IsNullOrEmpty(client.RunCommand("command -v ufw").Result) == false) + { + sshShellCommand = @"ufw allow 80"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"ufw allow 443"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"yes | ufw reload"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + + //处理极其少见的xz-utils未安装的情况 + sshShellCommand = $"{sshCmdUpdate}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = $"{sshCmdInstall}xz-utils"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //下载安装脚本安装 + //****** "正在安装SSR......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallSoft").ToString() + "SSR......"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + sshShellCommand = @"curl -o /tmp/ssr.sh https://raw.githubusercontent.com/proxysu/shellscript/master/ssr/ssr.sh"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"yes | bash /tmp/ssr.sh"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"if [ -f /usr/local/shadowsocks/server.py ];then echo '1';else echo '0'; fi"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + string installResult = currentShellCommandResult; + + if (!installResult.Contains("1")) + { + //****** "安装失败,官方脚本运行出错!" ****** + MessageBox.Show(Application.Current.FindResource("MessageBoxShow_ErrorInstallSoftFail").ToString()); + //****** "安装失败,官方脚本运行出错!" ****** + currentStatus = Application.Current.FindResource("MessageBoxShow_ErrorInstallSoftFail").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + client.Disconnect(); + return; + } + else + { + //****** "SSR安装成功!" ****** + currentStatus = "SSR" + Application.Current.FindResource("DisplayInstallInfo_SoftInstallSuccess").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + //设置开机自启动 + sshShellCommand = @"systemctl enable ssr"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + //sshShellCommand = @"mv /usr/local/etc/trojan/config.json /usr/local/etc/trojan/config.json.1"; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + //currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //****** "安装完毕,上传配置文件......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadSoftConfig").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + //生成服务端配置 + //serverConfig = @"/etc/shadowsocks.json"; + upLoadPath = @"/etc/shadowsocks.json"; + //设置指向Caddy监听的随机端口 + Random random = new Random(); + randomCaddyListenPort = random.Next(10001, 30000); + string randomSSRListenPortStr = randomCaddyListenPort.ToString(); + + sshShellCommand = $"sed -i 's/8800/{randomSSRListenPortStr}/' {upLoadPath}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //设置密码 + sshShellCommand = $"sed -i 's/##password##/{ReceiveConfigurationParameters[2]}/' {upLoadPath}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + + //using (StreamReader reader = File.OpenText(serverConfig)) + //{ + // JObject serverJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); + // //设置密码 + // serverJson["password"][0] = ReceiveConfigurationParameters[2]; + + // //设置Caddy随机监听的端口,用于Trojan-go,Trojan,V2Ray vless TLS + // Random random = new Random(); + // randomCaddyListenPort = random.Next(10001, 30000); + + // //设置转发到Caddy的随机监听端口 + // serverJson["remote_port"] = randomCaddyListenPort; + + // using (StreamWriter sw = new StreamWriter(@"config.json")) + // { + // sw.Write(serverJson.ToString()); + // } + //} + //UploadConfig(connectionInfo, @"config.json", upLoadPath); + + //File.Delete(@"config.json"); + + //****** "正在安装acme.sh......" ****** + //currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallAcmeSh").ToString(); + //textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + //currentShellCommandResult = currentStatus; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //Thread.Sleep(1000); + + ////安装所依赖的软件 + //sshShellCommand = $"{sshCmdUpdate}"; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + //currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //sshShellCommand = $"{sshCmdInstall}socat"; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + //currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //sshShellCommand = @"curl https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | INSTALLONLINE=1 sh"; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + //currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //if (currentShellCommandResult.Contains("Install success") == true) + //{ + // //****** "acme.sh安装成功!" ****** + // currentStatus = Application.Current.FindResource("DisplayInstallInfo_AcmeShInstallSuccess").ToString(); + // textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + // currentShellCommandResult = currentStatus; + // TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + // Thread.Sleep(1000); + //} + //else + //{ + // //****** "acme.sh安装失败!原因未知,请向开发者提问!" ****** + // currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorAcmeShInstallFail").ToString(); + // textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + // currentShellCommandResult = currentStatus; + // TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + // return; + //} + + //sshShellCommand = @"cd ~/.acme.sh/"; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + //currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //sshShellCommand = @"alias acme.sh=~/.acme.sh/acme.sh"; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + //currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + + ////****** "申请域名证书......" ****** + //currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartApplyCert").ToString(); + //textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + //currentShellCommandResult = currentStatus; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //Thread.Sleep(1000); + + //sshShellCommand = $"/root/.acme.sh/acme.sh --issue --standalone -d {ReceiveConfigurationParameters[4]}"; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + //currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //if (currentShellCommandResult.Contains("Cert success") == true) + //{ + // //****** "证书申请成功!" ****** + // currentStatus = Application.Current.FindResource("DisplayInstallInfo_ApplyCertSuccess").ToString(); + // textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + // currentShellCommandResult = currentStatus; + // TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + // Thread.Sleep(1000); + //} + //else + //{ + // //****** "证书申请失败!原因未知,请向开发者提问!" ****** + // currentStatus = Application.Current.FindResource("DisplayInstallInfo_ApplyCertFail").ToString(); + // textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + // currentShellCommandResult = currentStatus; + // TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + // return; + //} + + ////****** "安装证书到Trojan......" ****** + //currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoft").ToString() + "Trojan......"; + //textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + //currentShellCommandResult = currentStatus; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //Thread.Sleep(1000); + + //sshShellCommand = $"/root/.acme.sh/acme.sh --installcert -d {ReceiveConfigurationParameters[4]} --certpath /usr/local/etc/trojan/trojan_ssl.crt --keypath /usr/local/etc/trojan/trojan_ssl.key --capath /usr/local/etc/trojan/trojan_ssl.crt --reloadcmd \"systemctl restart trojan\""; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + //currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //sshShellCommand = @"if [ ! -f ""/usr/local/etc/trojan/trojan_ssl.key"" ]; then echo ""0""; else echo ""1""; fi | head -n 1"; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + //currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //if (currentShellCommandResult.Contains("1") == true) + //{ + // //****** "证书成功安装到Trojan!" ****** + // currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoftOK").ToString() + "Trojan!"; + // textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + // currentShellCommandResult = currentStatus; + // TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //} + //else + //{ + // //****** "证书安装到Trojan失败,原因未知,可以向开发者提问!" ****** + // currentStatus = Application.Current.FindResource("DisplayInstallInfo_IntallCertToSoftFail").ToString() + + // "Trojan" + + // Application.Current.FindResource("DisplayInstallInfo_InstallCertFailAsk").ToString(); + // textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + // currentShellCommandResult = currentStatus; + // TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + // return; + //} + + ////设置证书权限 + //sshShellCommand = @"chmod 644 /usr/local/etc/trojan/trojan_ssl.key"; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + //currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //****** "安装Caddy......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartInstallCaddy").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + //安装Caddy + //为假则表示系统有相应的组件。 + if (getApt == false) + { + sshShellCommand = @"echo ""deb [trusted=yes] https://apt.fury.io/caddy/ /"" | tee -a /etc/apt/sources.list.d/caddy-fury.list"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"apt install -y apt-transport-https"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"apt -qq update"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"apt -y -qq install caddy"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + else if (getDnf == false) + { + + sshShellCommand = @"dnf install 'dnf-command(copr)' -y"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"dnf copr enable @caddy/caddy -y"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //sshShellCommand = @"dnf -q makecache"; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + //currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"dnf -y -q install caddy"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + else if (getYum == false) + { + sshShellCommand = @"yum install yum-plugin-copr -y"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"yum copr enable @caddy/caddy -y"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //sshShellCommand = @"yum -q makecache"; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + //currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + //TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"yum -y -q install caddy"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + + sshShellCommand = @"find / -name caddy"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + installResult = currentShellCommandResult; + + if (!installResult.Contains("/usr/bin/caddy")) + { + //****** "安装Caddy失败!" ****** + MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_ErrorInstallCaddyFail").ToString()); + //****** "安装Caddy失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_ErrorInstallCaddyFail").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + client.Disconnect(); + return; + } + + //****** "Caddy安装成功!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_InstalledCaddyOK").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + sshShellCommand = @"systemctl enable caddy"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //****** "上传Caddy配置文件......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfig").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + sshShellCommand = @"mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + string caddyConfig = "TemplateConfg\\ssr_tls_caddy_config.caddyfile"; + upLoadPath = "/etc/caddy/Caddyfile"; + + UploadConfig(connectionInfo, caddyConfig, upLoadPath); + + //设置Caddy监听的随机端口 + string randomCaddyListenPortStr = randomCaddyListenPort.ToString(); + + sshShellCommand = $"sed -i 's/8800/{randomCaddyListenPortStr}/' {upLoadPath}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + + //设置域名 + + sshShellCommand = $"sed -i 's/##domain##/{ReceiveConfigurationParameters[4]}/g' {upLoadPath}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + //设置伪装网站 + if (String.IsNullOrEmpty(ReceiveConfigurationParameters[7]) == false) + { + sshShellCommand = $"sed -i 's/##sites##/proxy \\/ {ReceiveConfigurationParameters[7]}/' {upLoadPath}"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + //****** "Caddy配置文件上传成功,OK!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_UploadCaddyConfigOK").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + //****** "正在启动Caddy......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartCaddyService").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + //启动Caddy服务 + sshShellCommand = @"systemctl restart caddy"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(3000); + + sshShellCommand = @"ps aux | grep caddy"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + if (currentShellCommandResult.Contains("/usr/bin/caddy") == true) + { + //****** "Caddy启动成功!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartCaddyServiceOK").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + } + else + { + //****** "Caddy启动失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartCaddyServiceFail").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + Thread.Sleep(1000); + + //****** "正在启动Caddy(第二次尝试)!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartCaddyServiceSecond").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + Thread.Sleep(1000); + sshShellCommand = @"systemctl restart caddy"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(3000); + + sshShellCommand = @"ps aux | grep caddy"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + if (currentShellCommandResult.Contains("/usr/bin/caddy") == true) + { + //****** "Caddy启动成功!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartCaddyServiceOK").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + } + else + { + //****** "Caddy启动失败(第二次)!退出安装!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartCaddyServiceSecondFail").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + Thread.Sleep(1000); + + //****** "Caddy启动失败,原因未知!请向开发者问询!" ****** + MessageBox.Show(Application.Current.FindResource("DisplayInstallInfo_CaddyServiceFailedExit").ToString()); + return; + } + } + + //****** "正在启动SSR......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartSoft").ToString() + "SSR......"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + //启动SSR服务 + sshShellCommand = @"systemctl restart ssr"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(3000); + + sshShellCommand = @"ps aux | grep ssr"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + if (currentShellCommandResult.Contains("/usr/bin/ssr") == true) + { + //****** "SSR启动成功!" ****** + currentStatus = "SSR" + Application.Current.FindResource("DisplayInstallInfo_StartSoftOK").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + } + else + { + //****** "SSR启动失败!" ****** + currentStatus = "SSR" + Application.Current.FindResource("DisplayInstallInfo_StartSoftFail").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + Thread.Sleep(3000); + + //****** "正在第二次尝试启动SSR!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_StartSoftSecond").ToString() + "SSR!"; + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + Thread.Sleep(3000); + sshShellCommand = @"systemctl restart ssr"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(3000); + + sshShellCommand = @"ps aux | grep ssr"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + if (currentShellCommandResult.Contains("usr/bin/ssr") == true) + { + //****** "SSR启动成功!" ****** + currentStatus = "SSR" + Application.Current.FindResource("DisplayInstallInfo_StartSoftOK").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + } + else + { + //****** "SSR启动失败(第二次)!退出安装!" ****** + currentStatus = "SSR" + Application.Current.FindResource("DisplayInstallInfo_StartSoftSecondFail").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + Thread.Sleep(1000); + + //****** "Trojan启动失败,原因未知!请向开发者问询!" ****** + MessageBox.Show("SSR" + Application.Current.FindResource("DisplayInstallInfo_StartSoftFailedExit").ToString()); + return; + } + } + + + //测试BBR条件,若满足则启用 + //****** "BBR测试......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_TestBBR").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + sshShellCommand = @"uname -r"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + string[] linuxKernelVerStr = currentShellCommandResult.Split('-'); + + bool detectResult = DetectKernelVersionBBR(linuxKernelVerStr[0]); + + sshShellCommand = @"sysctl net.ipv4.tcp_congestion_control | grep bbr"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + string resultCmdTestBBR = currentShellCommandResult; + //如果内核满足大于等于4.9,且还未启用BBR,则启用BBR + if (detectResult == true && resultCmdTestBBR.Contains("bbr") == false) + { + //****** "正在启用BBR......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_EnableBBR").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + sshShellCommand = @"bash -c 'echo ""net.core.default_qdisc=fq"" >> /etc/sysctl.conf'"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"bash -c 'echo ""net.ipv4.tcp_congestion_control=bbr"" >> /etc/sysctl.conf'"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + sshShellCommand = @"sysctl -p"; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, sshShellCommand);//显示执行的命令 + currentShellCommandResult = client.RunCommand(sshShellCommand).Result; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + else if (resultCmdTestBBR.Contains("bbr") == true) + { + //****** "BBR已经启用了!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_BBRisEnabled").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + else + { + //****** "系统不满足启用BBR的条件,启用失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_BBRFailed").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + client.Disconnect();//断开服务器ssh连接 + + //****** "生成客户端配置......" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_GenerateClientConfig").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + if (!Directory.Exists("ssr_config"))//如果不存在就创建file文件夹      + { + Directory.CreateDirectory("ssr_config");//创建该文件夹   + } + //string clientConfig = "TemplateConfg\\tcp_client_config.json"; + //clientConfig = "TemplateConfg\\trojan_client_config.json"; + //using (StreamReader reader = File.OpenText(clientConfig)) + //{ + // JObject clientJson = (JObject)JToken.ReadFrom(new JsonTextReader(reader)); + + // clientJson["remote_addr"] = ReceiveConfigurationParameters[4]; + // clientJson["remote_port"] = int.Parse(ReceiveConfigurationParameters[1]); + // clientJson["password"][0] = ReceiveConfigurationParameters[2]; + + // using (StreamWriter sw = new StreamWriter(@"trojan_config\config.json")) + // { + // sw.Write(clientJson.ToString()); + // } + //} + + //****** "SSR+TLS+Caddy安装成功,祝你玩的愉快!!" ****** + currentStatus = "SSR+TLS+Caddy" + Application.Current.FindResource("DisplayInstallInfo_ProxyInstalledOK").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + Thread.Sleep(1000); + + //显示服务端连接参数 + proxyType = "SSR"; + + ResultClientInformation resultClientInformation = new ResultClientInformation(); + resultClientInformation.ShowDialog(); + return; + } + } + catch (Exception ex1)//例外处理 + #region 例外处理 + { + ProcessException(ex1.Message); + + //****** "主机登录失败!" ****** + currentStatus = Application.Current.FindResource("DisplayInstallInfo_LoginFailed").ToString(); + textBlockName.Dispatcher.BeginInvoke(updateAction, textBlockName, progressBar, currentStatus); + currentShellCommandResult = currentStatus; + TextBoxMonitorCommandResults.Dispatcher.BeginInvoke(updateMonitorAction, TextBoxMonitorCommandResults, currentShellCommandResult);//显示命令执行的结果 + + } + #endregion + + } + + //更新SSR的密码 + private void ButtonSSRPassword_Click(object sender, RoutedEventArgs e) + { + TextBoxSSRPassword.Text = RandomUUID(); + } + + + #endregion #region 其他功能函数及系统工具相关 //上传配置文件 @@ -7541,8 +8854,6 @@ namespace ProxySU } } - - #endregion // #region 三合一安装过程 diff --git a/ProxySU/Properties/AssemblyInfo.cs b/ProxySU/Properties/AssemblyInfo.cs index c6eca19..6a85bfc 100644 --- a/ProxySU/Properties/AssemblyInfo.cs +++ b/ProxySU/Properties/AssemblyInfo.cs @@ -51,5 +51,5 @@ using System.Windows; // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 // 方法是按如下所示使用“*”: : // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.0.4.0")] -[assembly: AssemblyFileVersion("2.0.4.0")] +[assembly: AssemblyVersion("2.1.0.0")] +[assembly: AssemblyFileVersion("2.1.0.0")] diff --git a/ProxySU/ResultClientInformation.xaml b/ProxySU/ResultClientInformation.xaml index b19a722..7f8f586 100644 --- a/ProxySU/ResultClientInformation.xaml +++ b/ProxySU/ResultClientInformation.xaml @@ -12,8 +12,8 @@ - - + + @@ -32,7 +32,6 @@ - @@ -72,6 +71,7 @@ + @@ -86,7 +86,6 @@ - @@ -100,9 +99,9 @@ - + @@ -117,8 +116,6 @@ - - @@ -129,10 +126,9 @@ - - + @@ -147,8 +143,6 @@ - - @@ -160,6 +154,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProxySU/ResultClientInformation.xaml.cs b/ProxySU/ResultClientInformation.xaml.cs index a35cf5e..f5bfbd5 100644 --- a/ProxySU/ResultClientInformation.xaml.cs +++ b/ProxySU/ResultClientInformation.xaml.cs @@ -38,6 +38,8 @@ namespace ProxySU GroupBoxTrojanGoClient.Visibility = Visibility.Collapsed; GroupBoxTrojanClient.Visibility = Visibility.Collapsed; GroupBoxNaiveProxyClient.Visibility = Visibility.Collapsed; + GroupBoxSSRClient.Visibility = Visibility.Collapsed; + //主机地址 TextBoxHostAddress.Text = MainWindow.ReceiveConfigurationParameters[4]; //主机端口 @@ -290,6 +292,7 @@ namespace ProxySU GroupBoxTrojanGoClient.Visibility = Visibility.Visible; GroupBoxTrojanClient.Visibility = Visibility.Collapsed; GroupBoxNaiveProxyClient.Visibility = Visibility.Collapsed; + GroupBoxSSRClient.Visibility = Visibility.Collapsed; TextBoxTrojanGoWSPath.Visibility = Visibility.Hidden; TextBlockTrojanGoWebSocketPath.Visibility = Visibility.Hidden; @@ -322,6 +325,7 @@ namespace ProxySU GroupBoxTrojanGoClient.Visibility = Visibility.Collapsed; GroupBoxTrojanClient.Visibility = Visibility.Visible; GroupBoxNaiveProxyClient.Visibility = Visibility.Collapsed; + GroupBoxSSRClient.Visibility = Visibility.Collapsed; TextBlockQrURLexplain.Text = Application.Current.FindResource("TextBlockQrURLexplainTrojan").ToString(); @@ -341,6 +345,7 @@ namespace ProxySU GroupBoxTrojanGoClient.Visibility = Visibility.Collapsed; GroupBoxTrojanClient.Visibility = Visibility.Collapsed; GroupBoxNaiveProxyClient.Visibility = Visibility.Visible; + GroupBoxSSRClient.Visibility = Visibility.Collapsed; TextBlockQrURLexplain.Text = Application.Current.FindResource("TextBlockQrURLexplainNaiveProxy").ToString(); @@ -349,7 +354,33 @@ namespace ProxySU TextBoxNaivePassword.Text = MainWindow.ReceiveConfigurationParameters[2]; GenerateNaivePrxoyShareQRcodeAndBase64Url(); } - + else if (String.Equals(MainWindow.proxyType, "SSR")) + { + GroupBoxV2rayClient.Visibility = Visibility.Collapsed; + GroupBoxTrojanGoClient.Visibility = Visibility.Collapsed; + GroupBoxTrojanClient.Visibility = Visibility.Collapsed; + GroupBoxNaiveProxyClient.Visibility = Visibility.Collapsed; + GroupBoxSSRClient.Visibility = Visibility.Visible; + + TextBlockQrURLexplain.Text = Application.Current.FindResource("TextBlockQrURLexplainSSR").ToString(); + + //主机地址 + TextBoxSSRHostAddress.Text = MainWindow.ReceiveConfigurationParameters[4]; + //主机端口 + TextBoxSSRPort.Text = "443"; + //密码(uuid) + TextBoxSSRUUID.Text = MainWindow.ReceiveConfigurationParameters[2]; + //加密方式 + TextBoxSSREncryption.Text = "none"; + //传输协议 + TextBoxSSRTransmission.Text = "auth_chain_a"; + //混淆 + TextBoxSSRCamouflageType.Text = "tls1.2_ticket_auth"; + + //CheckDir("ssr_config"); + GenerateSSRShareQRcodeAndBase64Url(); + } + } #region 界面控制相关 private void HidePath() @@ -395,6 +426,7 @@ namespace ProxySU } #endregion + //生成v2rayN客户端导入文件 private void GenerateV2rayShareQRcodeAndBase64Url() { @@ -708,31 +740,9 @@ namespace ProxySU sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoPassword").ToString() + $"{TextBoxTrojanGoServerPassword.Text}"); //sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoWebSocketPath").ToString() + $"{TextBoxTrojanGoWSPath.Text}"); - //sw.WriteLine("config.json"); - //sw.WriteLine("此文件为Trojan官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080"); - //sw.WriteLine("Trojan官方网站:https://trojan-gfw.github.io/trojan/"); - //sw.WriteLine("Trojan官方程序下载地址:https://github.com/trojan-gfw/trojan/releases"); - //sw.WriteLine("下载相应版本,Windows选择Trojan-x.xx-win.zip,解压后提取trojan.exe。与config.json放在同一目录,运行trojan.exe即可。"); - //sw.WriteLine("-----------------------------------------\n"); - //sw.WriteLine("QR.bmp"); - //sw.WriteLine("此文件为Trojan-QT5 (windows)、igniter(Android)、Shadowrocket(ios)扫码导入节点"); - //sw.WriteLine("Trojan-QT5 (windows)下载网址:https://github.com/TheWanderingCoel/Trojan-Qt5/releases"); - //sw.WriteLine("igniter(Android)下载网址:https://github.com/trojan-gfw/igniter/releases"); - //sw.WriteLine("Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。"); - - //sw.WriteLine("-----------------------------------------\n"); - //sw.WriteLine("url.txt"); - //sw.WriteLine("此文件为Trojan-QT5 (windows)、igniter(Android)、Shadowrocket(ios)复制粘贴导入节点的网址"); - //sw.WriteLine("-----------------------------------------\n"); - //sw.WriteLine("服务器通用连接配置参数"); - //sw.WriteLine($"地址(address):{TextBoxTrojanServerHost.Text}"); - //sw.WriteLine($"端口(Port):{TextBoxTrojanServerPort.Text}"); - //sw.WriteLine($"密钥:{TextBoxTrojanServerPassword.Text}"); } - - } //生成NaiveProxy客户端资料 @@ -783,21 +793,8 @@ namespace ProxySU //sw.WriteLine("下载相应版本,Windows选择naiveproxy-x.xx-win.zip,解压后提取naive.exe。与config.json放在同一目录,运行naive.exe即可。"); sw.WriteLine(Application.Current.FindResource("readmeTxtNaiveProxyExplainLine04").ToString()); - //sw.WriteLine("此文件为NaiveProxy官方程序所使用的客户端配置文件,配置为全局模式,socks5地址:127.0.0.1:1080"); - //sw.WriteLine("NaiveProxy官方网站:https://github.com/klzgrad/naiveproxy"); - //sw.WriteLine("NaiveProxy官方程序下载地址:https://github.com/klzgrad/naiveproxy/releases"); - //sw.WriteLine("下载相应版本,Windows选择naiveproxy-x.xx-win.zip,解压后提取naive.exe。与config.json放在同一目录,运行naive.exe即可。"); - sw.WriteLine("-----------------------------------------\n"); - //sw.WriteLine("其他平台的客户端,暂未发布"); - //sw.WriteLine("QR.bmp"); - //sw.WriteLine("此文件为Trojan-QT5 (windows)、igniter(Android)、Shadowrocket(ios)扫码导入节点"); - //sw.WriteLine("Trojan-QT5 (windows)下载网址:https://github.com/TheWanderingCoel/Trojan-Qt5/releases"); - //sw.WriteLine("igniter(Android)下载网址:https://github.com/trojan-gfw/igniter/releases"); - //sw.WriteLine("Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。"); - - //sw.WriteLine("-----------------------------------------\n"); sw.WriteLine("url.txt"); //sw.WriteLine("此文件为NaiveGUI(windows)复制粘贴导入节点的网址"); @@ -824,6 +821,80 @@ namespace ProxySU } + //生成SSR客户端资料 + private void GenerateSSRShareQRcodeAndBase64Url() + { + + string saveFileFolderFirst = TextBoxSSRHostAddress.Text; + int num = 1; + saveFileFolder = saveFileFolderFirst; + CheckDir("ssr_config"); + while (Directory.Exists(@"ssr_config\" + saveFileFolder)) + { + saveFileFolder = saveFileFolderFirst + "_copy_" + num.ToString(); + num++; + } + CheckDir(@"ssr_config\" + saveFileFolder); + + string ssrUrl = GetSSRLinkForServer(); + TextBoxURL.Text = ssrUrl; + using (StreamWriter sw = new StreamWriter($"ssr_config\\{saveFileFolder}\\url.txt")) + { + sw.WriteLine(ssrUrl); + + } + CreateQRCode(ssrUrl, "ssr_config"); + + using (StreamWriter sw = new StreamWriter($"ssr_config\\{saveFileFolder}\\readme.txt")) + { + //sw.WriteLine("-----------------------------------------\n"); + sw.WriteLine("QR.bmp"); + + //***"此文件为ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)扫码导入节点"*** + sw.WriteLine(Application.Current.FindResource("readmeTxtSSRExplainLine05").ToString()); + + //***"ShadowsocksR (windows)下载网址:https://github.com/shadowsocksrr/shadowsocksr-csharp/releases"*** + sw.WriteLine(Application.Current.FindResource("readmeTxtSSRExplainLine06").ToString()); + + //***"SSRR(Android)下载网址:https://github.com/shadowsocksrr/shadowsocksr-android/releases"*** + sw.WriteLine(Application.Current.FindResource("readmeTxtSSRExplainLine07").ToString()); + + //***"Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。"*** + sw.WriteLine(Application.Current.FindResource("readmeTxtSSRExplainLine08").ToString()); + sw.WriteLine("-----------------------------------------\n"); + sw.WriteLine("url.txt"); + + //***"此文件为ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)复制粘贴导入节点的网址"*** + sw.WriteLine(Application.Current.FindResource("readmeTxtSSRExplainLine09").ToString()); + sw.WriteLine("-----------------------------------------\n"); + + //***"服务器通用连接配置参数"*** + sw.WriteLine(Application.Current.FindResource("readmeTxtTrojanExplainLine10").ToString()); + + //****** 服务器地址(address): ****** + sw.WriteLine(Application.Current.FindResource("TextBlockServerAddress").ToString() + $"{ TextBoxSSRHostAddress.Text}"); + + //****** 端口(port): ****** + sw.WriteLine(Application.Current.FindResource("TextBlockServerPort").ToString() + $"{TextBoxSSRPort.Text}"); + + //****** 密码: ****** + sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoPassword").ToString() + $"{TextBoxSSRUUID.Text}"); + + //****** 加密方式: ****** + sw.WriteLine(Application.Current.FindResource("TextBlockEncryption").ToString() + $"{TextBoxSSREncryption.Text}"); + + //****** 传输协议: ****** + sw.WriteLine(Application.Current.FindResource("TextBlockTransferProtocol").ToString() + $"{TextBoxSSRTransmission.Text}"); + + //****** 混淆: ****** + sw.WriteLine(Application.Current.FindResource("TextBlockCamouflageType").ToString() + $"{TextBoxSSRCamouflageType.Text}"); + + //****** 密码: ****** + //sw.WriteLine(Application.Current.FindResource("TextBlockTrojanGoWebSocketPath").ToString() + $"{TextBoxTrojanGoWSPath.Text}"); + + } + } + //生成base64 private string ToBase64Encode(string text) { @@ -894,6 +965,69 @@ namespace ProxySU System.Diagnostics.Process.Start("explorer.exe", openFolderPath); this.Close(); } + else if (String.Equals(MainWindow.proxyType, "SSR")) + { + string openFolderPath = @"ssr_config\" + saveFileFolder; + System.Diagnostics.Process.Start("explorer.exe", openFolderPath); + this.Close(); + } + } + + //SSR生成URL链接 + public string GetSSRLinkForServer() + { + string server = TextBoxSSRHostAddress.Text; + string server_port = TextBoxSSRPort.Text; + string password = TextBoxSSRUUID.Text; + string protocol = TextBoxSSRTransmission.Text; + string method = TextBoxSSREncryption.Text; + string obfs = TextBoxSSRCamouflageType.Text; + + string obfsparam=""; + string protocolparam = ""; + string remarks = TextBoxSSRHostAddress.Text; + string group = TextBoxSSRHostAddress.Text; + bool udp_over_tcp = true; + int server_udp_port = 0; + + string main_part = server + ":" + server_port + ":" + protocol + ":" + method + ":" + obfs + ":" + EncodeUrlSafeBase64(password); + string param_str = "obfsparam=" + EncodeUrlSafeBase64(obfsparam ?? ""); + if (!string.IsNullOrEmpty(protocolparam)) + { + param_str += "&protoparam=" + EncodeUrlSafeBase64(protocolparam); + } + if (!string.IsNullOrEmpty(remarks)) + { + param_str += "&remarks=" + EncodeUrlSafeBase64(remarks); + } + if (!string.IsNullOrEmpty(group)) + { + param_str += "&group=" + EncodeUrlSafeBase64(group); + } + if (udp_over_tcp) + { + param_str += "&uot=" + "1"; + } + if (server_udp_port > 0) + { + param_str += "&udpport=" + server_udp_port.ToString(); + } + string base64 = EncodeUrlSafeBase64(main_part + "/?" + param_str); + return "ssr://" + base64; + } + + private string EncodeUrlSafeBase64(byte[] val, bool trim) + { + if (trim) + return Convert.ToBase64String(val).Replace('+', '-').Replace('/', '_').TrimEnd('='); + else + return Convert.ToBase64String(val).Replace('+', '-').Replace('/', '_'); + } + private string EncodeUrlSafeBase64(string val, bool trim = true) + { + return EncodeUrlSafeBase64(Encoding.UTF8.GetBytes(val), trim); } } + + } diff --git a/ProxySU/Translations/ProxySU.en-US.xaml b/ProxySU/Translations/ProxySU.en-US.xaml index c1de2e4..13d620b 100644 --- a/ProxySU/Translations/ProxySU.en-US.xaml +++ b/ProxySU/Translations/ProxySU.en-US.xaml @@ -44,6 +44,9 @@ Random NaiveProxy install Cancel + + Mode: SSR+TLS+Caddy + SSR install Proofreading Time Release 80/443 @@ -134,7 +137,7 @@ The default is 16, and you can fill in a value not exceeding 64. If the client does not have this option, leave it blank Encryption method: Transfer Protocol: - Camouflage type: + Camouflage type(Confuse): TLS: Path: mKCP Seed/QUIC key: @@ -145,6 +148,7 @@ " can be used for ShadowRocket (ios), ignore (Android), Trojan-QT5 (windows) to scan codes and import URLs. Note: some clients may not support WebSocket mode ." "Can be used for ShadowRocket (ios), ignore (Android), Trojan-QT5 (windows) to scan codes and import URLs. Note: Some clients may not support WebSocket mode." URL import link for NaiveGUI (windows) + Used to scan codes and import URL import links for ShadowsocksR (windows), SSRR (android), Shadowrocket (ios) Host address, host port, and user name are required and cannot be empty!! The login password is required and cannot be empty!! @@ -307,7 +311,13 @@ This file is NaiveGUI (windows) copy and paste the URL of the imported node NaiveGUI(windows) download URL: https://github.com/ExcitedCodes/NaiveGUI/releases Server general connection configuration parameters - + + This file is for ShadowsocksR (windows), SSRR (Android), Shadowrocket (ios) scan code import node + ShadowsocksR (windows) download URL: https://github.com/shadowsocksrr/shadowsocksr-csharp/releases + SSRR (Android) download URL: https://github.com/shadowsocksrr/shadowsocksr-android/releases + Shadowrocket(ios) download, you need to use the AppleID of the foreign region. Please Google method yourself. + This file is ShadowsocksR (windows), SSRR (Android), Shadowrocket (ios) copy and paste the URL of the imported node + Server general connection configuration parameters + 模式:SSR+TLS+Caddy + SSR一键安装 + 校对时间 释放80/443端口 @@ -134,7 +138,7 @@ 默认16,可以填不超过64的值,客户端没有此选项可不填 加密方式: 传输协议: - 伪装类型: + 伪装类型(混淆): 是否使用TLS: 路径(Path): mKCP Seed/QUIC密钥: @@ -145,6 +149,7 @@ "可用于ShadowRocket (ios)、igniter(Android)、Trojan-QT5 (windows) 扫码和导入url。注意:有的客户端可能不支持WebSocket模式。" "可用于ShadowRocket (ios)、igniter(Android)、Trojan-QT5 (windows) 扫码和导入url。注意:有的客户端可能不支持WebSocket模式。" 用于NaiveGUI(windows)的URL导入链接 + 用于ShadowsocksR(windows)、SSRR(android)、Shadowrocket(ios)的扫码和导入URL导入链接 主机地址、主机端口、用户名为必填项,不能为空!! 登录密码为必填项,不能为空!! @@ -307,7 +312,13 @@ 此文件为NaiveGUI(windows)复制粘贴导入节点的网址 NaiveGUI(windows)下载网址:https://github.com/ExcitedCodes/NaiveGUI/releases 服务器通用连接配置参数 - + + 此文件为ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)扫码导入节点 + ShadowsocksR (windows)下载网址:https://github.com/shadowsocksrr/shadowsocksr-csharp/releases + SSRR(Android)下载网址:https://github.com/shadowsocksrr/shadowsocksr-android/releases + Shadowrocket(ios)下载,需要使用国外区的AppleID。请自行谷歌方法。 + 此文件为ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)复制粘贴导入节点的网址 + 服务器通用连接配置参数 + 模式:SSR+TLS+Caddy + SSR一鍵安裝 校對時間 釋放80/443端口 @@ -134,7 +137,7 @@ 默認16,可以填不超過64的值,客戶端沒有此選項可不填 加密方式: 傳輸協議: - 偽裝類型: + 偽裝類型(混淆): 是否使用TLS: 路徑(Path): mKCP Seed/QUIC密鑰: @@ -145,6 +148,7 @@ "可用於ShadowRocket (ios)、igniter(Android)、Trojan-QT5 (windows) 掃碼和導入url。注意:有的客戶端可能不支持WebSocket模式。" "可用於ShadowRocket (ios)、igniter(Android)、Trojan-QT5 (windows) 掃碼和導入url。注意:有的客戶端可能不支持WebSocket模式。" 用於NaiveGUI(windows)的URL導入鏈接 + 用於ShadowsocksR(windows)、SSRR(android)、Shadowrocket(ios)的掃碼和導入URL導入鏈接 主機地址、主機端口、用戶名為必填項,不能為空!! 登錄密碼為必填項,不能為空!! @@ -308,5 +312,12 @@ 此文件為NaiveGUI(windows)複製粘貼導入節點的網址 NaiveGUI(windows)下載網址:https://github.com/ExcitedCodes/NaiveGUI/releases 服務器通用連接配置參數 + + 此文件為ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)掃碼導入節點 + ShadowsocksR (windows)下載網址:https://github.com/shadowsocksrr/shadowsocksr-csharp/releases + SSRR(Android)下載網址:https://github.com/shadowsocksrr/shadowsocksr-android/releases + Shadowrocket(ios)下載,需要使用國外區的AppleID。請自行谷歌方法。 + 此文件為ShadowsocksR (windows)、SSRR(Android)、Shadowrocket(ios)複製粘貼導入節點的網址 + 服務器通用連接配置參數 \ No newline at end of file diff --git a/ProxySU/TrojanGoTemplateWindow.xaml b/ProxySU/TrojanGoTemplateWindow.xaml index 406c757..31de2ad 100644 --- a/ProxySU/TrojanGoTemplateWindow.xaml +++ b/ProxySU/TrojanGoTemplateWindow.xaml @@ -93,8 +93,8 @@ - - + + diff --git a/ProxySU/V2RayTemplateWindow.xaml.cs b/ProxySU/V2RayTemplateWindow.xaml.cs index ecbd674..b6be90b 100644 --- a/ProxySU/V2RayTemplateWindow.xaml.cs +++ b/ProxySU/V2RayTemplateWindow.xaml.cs @@ -502,7 +502,7 @@ namespace ProxySU Guid uuid = Guid.NewGuid(); TextBoxNewUUID.Text = uuid.ToString(); Random random = new Random(); - int randomServerPort = random.Next(10000, 50000); + int randomServerPort = random.Next(30001, 50000); TextBoxServerListenPort.Text = randomServerPort.ToString(); //清除其他选项卡中的选项 UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); @@ -705,7 +705,7 @@ namespace ProxySU TextBoxQuicUUID.Text = uuid.ToString(); Random random = new Random(); - int randomServerPort = random.Next(10000, 50000); + int randomServerPort = random.Next(30001, 50000); TextBoxServerListenPort.Text = randomServerPort.ToString(); //清除其他选项卡中的选项 UncheckLayouts((TabItem)TabControlTemplate.SelectedItem); @@ -728,7 +728,7 @@ namespace ProxySU private void ButtonServerListenPort_Click(object sender, RoutedEventArgs e) { Random random = new Random(); - int randomServerPort = random.Next(10000, 50000); + int randomServerPort = random.Next(30001, 50000); TextBoxServerListenPort.Text = randomServerPort.ToString(); } //产生随机的Path diff --git a/ProxySU/bin/Beta/Beta.zip b/ProxySU/bin/Beta/Beta.zip index a9b977042fe6ee7543abc2fbba1c1a8a852737d1..b374ba169510d89f9377f20f6b9b5e03c68f5bbb 100644 GIT binary patch delta 75102 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 delta 72112 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 QBlPe62*lk^0Q&8J0M4g8r2qf`