C#.net核心运行bash命令

时间:2017-09-26 01:32:52

标签: c# linux bash .net-core

我正在尝试在我正在编写的C#.net Core 2.0应用程序中模拟终端功能(即QTerminal,LxTerminal)。 (该应用程序最终将响应通过互联网收到的消息)

应用程序的流程将是:

  1. 通过TCP接收“StartShell”消息。
  2. .net核心应用程序启动shell进程。
  3. 一段时间后,通过TCP收到“ShellInput”消息。
  4. .net核心应用程序将该命令写入进程的StandardInput
  5. 进程输出数据,.net Core应用程序通过TCP发送。
  6. 步骤3-5重复,直到通过TCP收到“StopShell”消息,此时.net Core应用程序停止shell进程。
  7. ShellInputs将是您通常在Linux终端中输入的任何内容,例如

      

    MKDIR

         

    sudo mkdir -p folder

    使用sudo命令,密码提示应该返回,此时用户将发送带有密码的ShellInput消息。

    在linux上我通过

    获取shell路径
    Environment.GetVariable("SHELL");
    

    然后尝试使用System.Diagnostics.Process来运行该shell。

    我遇到的问题是我无法接通以保持外壳打开并正确接受正常的终端输入。

    Process process = new Process();
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.RedirectStandardInput = true;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.FileName = Environment.GetEnvironmentVariable("SHELL");
    process.StartInfo.Arguments = "-s"
    
    process.ErrorDataReceived += Process_ErrorDataReceived;
    process.OutputDataReceived += Process_OutputDataReceived;
    process.Exited += Process_Exited;
    process.EnableRaisingEvents = true;
    if (process.Start())
    {
        process.BeginErrorReadLine();
        process.BeginOutputReadLine();
        process.StandardInput.WriteLine("sudo mkdir /home/test");
    }
    

    上面的代码“工作”,因为它执行,但在我的Process_ErrorDataReceived处理程序中,我收到消息

      

    sudo:没有tty存在且没有指定askpass程序

    谷歌搜索该错误只会让一大群人要求ssh,这无济于事。

0 个答案:

没有答案