我正在尝试在我正在编写的C#.net Core 2.0应用程序中模拟终端功能(即QTerminal,LxTerminal)。 (该应用程序最终将响应通过互联网收到的消息)
应用程序的流程将是:
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,这无济于事。