在 C# 中捕获 Plink 输出
Capturing Plink output in C#
我正在尝试使用 Plink 访问计算机上的信息。我遵循了本教程:
http://www.mindfiresolutions.com/Creating-a-SSH-connection-using-plink-PuTTY-via-C-application-1760.ph
到目前为止,我只使用我的程序来打开 Plink,我将添加登录信息等,一旦我至少可以让 Plink 在我的程序中打开。我有这个基于教程:
ProcessStartInfo psi = new ProcessStartInfo(@"C:\Windows\System32\cmd");
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
psi.UseShellExecute = false;
psi.CreateNoWindow = false;
Process process = Process.Start(psi);
Thread.Sleep(3000);
string cmdForTunnel = "plink";
process.StandardInput.WriteLine(cmdForTunnel);
process.WaitForExit();
Thread.Sleep(10000);
//DoBusinessLogic();
process.StandardInput.WriteLine("logout");
Thread.Sleep(10000);
if (process.HasExited)
{
process.Close();
process.Dispose();
}
但是没有任何显示,这让我很困扰。命令 plink
应该显示有关如何使用该程序的帮助信息(稍后我将用更有用的内容替换该命令),但命令提示符仍然是空的。我还尝试将 plink
替换为 ipconfig
,但也没有显示任何内容。
我知道如何自己打开 cmd 并输入 plink
来访问它。我想在我的程序中复制这个动作。
你的代码有很多错误:
- 您正在重定向输出,而您不是 reading/processing/printing 它(这就是为什么 "nothing is displayed")
- 运行
plink
从 "typing" plink
到 cmd.exe
太疯狂了。您可以直接 运行 plink
,完全避免 cmd.exe
(即使您需要使用 cmd.exe
,您也应该通过命令将 plink.exe
传递给它-行:/c path\plink.exe
)。不,直接 运行 不会导致 Plink 立即关闭 .
- 在不读取重定向输出的情况下调用
WaitForExit()
将使您的代码在输出缓冲区填满后死锁。请参阅 Remarks 部分以了解 ProcessStartInfo.RedirectStandardOutput
. Alternatively, use process.StandardOutput.ReadToEnd()
(类似于 WaitForExit
,但也会读取输出)。其实就是之前MSDN推荐的link.
如果你打算只执行一个命令,使用 Plink,最好在 Plink 命令行上传递命令,而不是 "typing" 它到它的(重定向的)输入:
plink.exe -ssh user@host command
另请参阅对 Testing using Plink.exe to connect to SSH in C#
的回答
我正在尝试使用 Plink 访问计算机上的信息。我遵循了本教程:
http://www.mindfiresolutions.com/Creating-a-SSH-connection-using-plink-PuTTY-via-C-application-1760.ph
到目前为止,我只使用我的程序来打开 Plink,我将添加登录信息等,一旦我至少可以让 Plink 在我的程序中打开。我有这个基于教程:
ProcessStartInfo psi = new ProcessStartInfo(@"C:\Windows\System32\cmd");
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
psi.UseShellExecute = false;
psi.CreateNoWindow = false;
Process process = Process.Start(psi);
Thread.Sleep(3000);
string cmdForTunnel = "plink";
process.StandardInput.WriteLine(cmdForTunnel);
process.WaitForExit();
Thread.Sleep(10000);
//DoBusinessLogic();
process.StandardInput.WriteLine("logout");
Thread.Sleep(10000);
if (process.HasExited)
{
process.Close();
process.Dispose();
}
但是没有任何显示,这让我很困扰。命令 plink
应该显示有关如何使用该程序的帮助信息(稍后我将用更有用的内容替换该命令),但命令提示符仍然是空的。我还尝试将 plink
替换为 ipconfig
,但也没有显示任何内容。
我知道如何自己打开 cmd 并输入 plink
来访问它。我想在我的程序中复制这个动作。
你的代码有很多错误:
- 您正在重定向输出,而您不是 reading/processing/printing 它(这就是为什么 "nothing is displayed")
- 运行
plink
从 "typing"plink
到cmd.exe
太疯狂了。您可以直接 运行plink
,完全避免cmd.exe
(即使您需要使用cmd.exe
,您也应该通过命令将plink.exe
传递给它-行:/c path\plink.exe
)。不,直接 运行 不会导致 Plink 立即关闭 . - 在不读取重定向输出的情况下调用
WaitForExit()
将使您的代码在输出缓冲区填满后死锁。请参阅 Remarks 部分以了解ProcessStartInfo.RedirectStandardOutput
. Alternatively, useprocess.StandardOutput.ReadToEnd()
(类似于WaitForExit
,但也会读取输出)。其实就是之前MSDN推荐的link. 如果你打算只执行一个命令,使用 Plink,最好在 Plink 命令行上传递命令,而不是 "typing" 它到它的(重定向的)输入:
plink.exe -ssh user@host command
另请参阅对 Testing using Plink.exe to connect to SSH in C#
的回答