立即停止所有SSH连接

本文关键字:SSH 连接 | 更新日期: 2023-09-27 18:04:05

我正在编写一个程序,该程序应该与远程Linux服务器建立"n"个SSH连接,并在每个连接上运行耗时的命令。"耗时的操作"基本上是运行一个脚本,设置Wireshark并监听流量。

为此,我使用c#的SharpSSH库和n个BackgroundWorkers作为线程。同样为了简单起见,下面的代码有n=2个BGW线程和SSH连接。

代码:

    // runs when start is pressed
    private void startButton_Click_1(object sender, EventArgs e)
    {
        sb = new StringBuilder();
        DateTime timeNow = DateTime.Now;
        clickTime = timeNow.ToString("yyyyMMddhhmmssfff"); // store the exact time of the click
        bw = bwArray[0];
        int index = 0; // ignore these 2 constants
        foreach (BackgroundWorker bgw in bwArray)
        {
            if (bgw.IsBusy != true)
            {
                bgw.RunWorkerAsync(); 
                // runWorkerAsync for every BackgroundWorker in the array
                //index++;
            }
        }
    }

    // runWorkerAsync leads the BGWorker to this function
    private void bw_doWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        if (worker.CancellationPending == true)
        {
            e.Cancel = true;
        }
        else
        {
            // let the UI know of button changes
            int p = 0;
            object param = "something"; // use this to pass any additional parameter back to the UI
            worker.ReportProgress(p, param);
            // UI notifying part ends here
            // for the simplex case
            if (numberOfConnections == 1)
                startOperation();
            // for the multiplex case
            else if (numberOfConnections > 1)
            {
                //while (p < numberOfConnections)
                //{
                    multiStartOperation();
                //  p++;
                //}
            }
            Thread.Sleep(500);
        }
    }

    // will be called for all ssh connections (in multiplex case)
    private void multiStartOperation()
    {
        string[] command1Array = { "host2", "host2" };
        string[] command2Array = { clickTime + "_h2", clickTime + "_h2" };
        for (int index = 0; index < numberOfConnections; index++)
        {
            // shellArray is an array of SshExec objects
            shellArray[index] = new SshExec(IPAddress, username, password);
            try
            {
                shellArray[index].Connect();
            }
            catch (JSchException se)
            {
                Console.Write(se.StackTrace);
                System.Windows.Forms.MessageBox.Show("Couldn't connect to the specified port.", "Connection Error!");
            }
            sb.Append(shellArray[index].RunCommand(command1Array[index]) + Environment.NewLine);
            // first command is host3, or host4 etc.
            // below is the time consuming command to run 
            string command = "./logcap.sh -c " + command2Array[index] + " -z";
            // sb is a global stringBuilder object,
            // to which the command output is appended
            sb.Append(shellArray[index].RunCommand(command));
        }
    }      

我的问题如下:

当我按下GUI上的开始按钮时,两个连接都应该启动并运行脚本。而在上面给出的代码中,连接了shellArray(由ssheexec对象组成)的第一个索引,准备命令并运行耗时的命令,此时程序返回UI,甚至没有启动第二个连接。这显然是因为for循环,但我还不知道如何解决这个问题。

我需要让其他后台工作人员建立和运行第二个服务器的第二个命令,这样当我按下GUI上的停止按钮时,所有连接和线程都可以一起停止。

PS:命令不会停止运行,除非用户单击stop,这将向服务器发送Ctrl-C信号。

我对所有多线程和网络概念都比较陌生,所以如果有任何困惑或错误,请告诉我。

祝你今天愉快。

立即停止所有SSH连接

谢谢你的回答,欢迎。:)问题确实是无法同时运行多个后台工作程序。

我设法解决了这个问题。事实证明,我所要弄清楚的就是如何将后台工作人员分配给SSH连接。为此,我创建了如下的类:
    class BGW
    {
        private BackgroundWorker bgw;
        private int index;
        //getters, setters, constructors...
    }

之后,我将bwArray转换为BGW对象数组,bwArray是一个背景工作者数组。在初始化时,我为每个BGW对象分配了一个索引。

在multiStartOperation()中没有愚蠢的循环,我向multiStartOperation()发送了一个整数参数,该函数使用该索引来到达分配的后台工作者。

到目前为止,它似乎是有效的。祝你过得愉快。