gpt4 book ai didi

c# - 在 C# 中使用 Plink.exe 连接到 SSH 进行测试

转载 作者:行者123 更新时间:2023-11-30 19:16:43 28 4
gpt4 key购买 nike

我正在尝试通过 plink.exe 连接到 unix 终端。目标是让我可以将文本读回字符串。

我的困境是,我工作的银行使用我们通常通过 putty 访问的旧 as400 类型系统。我正在尝试开发一个自动化套件,它将与系统交互并运行作业并分析输出等。

所以我想我会通过 C# 使用 plink。如果我通过命令提示符运行代码,我会(大致)得到我需要返回的文本。但是,我的 C# 代码遇到了一个问题,它只是挂起,而且我从未得到响应。

我想要的是这样的:

连接到服务器输入命令回读屏幕//更多命令等

到目前为止,这是我的代码:

class Program
{
static void Main(string[] args)
{

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);
string cmdForTunnel = @"c:\putty\plink -ssh jonkers@bankhq -pw automationhero";
process.StandardInput.WriteLine(cmdForTunnel);
// process.WaitForExit();
Thread.Sleep(30000);
string output = process.StandardOutput.ReadToEnd();

Console.WriteLine(output);

//DoBusinessLogic();
process.StandardInput.WriteLine("logout");
Thread.Sleep(10000);

if (process.HasExited)
{
process.Close();
process.Dispose();
}
}
}

我不太确定问题出在哪里,因为正如我所说,我已经通过命令行使用 plink 进行了测试,但是我上面的解决方案只是挂起。我尝试在 stackoverflow 上使用其他人的解决方案,但它们似乎都不适合我,因为我一直遇到这个问题。非常感谢提示。

编辑

我现在决定使用 Renci Sharp SSH 库并围绕它构建我自己的框架。它的效果要好得多。

最佳答案

所以我只是想亲自测试一下 plink,结果非常令人满意。

正如我在评论中所说,你不能使用 ReadToEnd before 你发送 exit 命令,除非你想 阻止您的当前线程。

实际上,您可以在使用 ReadToEnd 之前发送一堆命令(包括 exitlogout),但我确实建议执行异步读取,因为它更健壮。

现在有几种方法可以异步读取流。


Process 类实际上提供了在传入数据时引发的Events。您可以为那些事件 创建处理程序。这些事件是:

  • OutputDataReceived
  • ErrorDataReceived

他们的事件处理程序提供包含数据的字符串。


您可以使用 stdout/stdin 的 StreamReader 实例的 BeginRead

但在这里我提供了一个代码示例,它使用简单的多线程以更粗略的方式完成:

  public string RequestInfo(string remoteHost, string userName, string password, string[] lstCommands) {
m_szFeedback = "Feedback from: " + remoteHost + "\r\n";

ProcessStartInfo psi = new ProcessStartInfo()
{
FileName = PLINK_PATH, // A const or a readonly string that points to the plink executable
Arguments = String.Format("-ssh {0}@{1} -pw {2}", userName, remoteHost, password),
RedirectStandardError = true,
RedirectStandardOutput = true,
RedirectStandardInput = true,
UseShellExecute = false,
CreateNoWindow = true
};

Process p = Process.Start(psi);

m_objLock = new Object();
m_blnDoRead = true;

AsyncReadFeedback(p.StandardOutput); // start the async read of stdout
AsyncReadFeedback(p.StandardError); // start the async read of stderr

StreamWriter strw = p.StandardInput;

foreach (string cmd in lstCommands)
{
strw.WriteLine(cmd); // send commands
}
strw.WriteLine("exit"); // send exit command at the end

p.WaitForExit(); // block thread until remote operations are done
return m_szFeedback;
}

private String m_szFeedback; // hold feedback data
private Object m_objLock; // lock object
private Boolean m_blnDoRead; // boolean value keeping up the read (may be used to interrupt the reading process)

public void AsyncReadFeedback(StreamReader strr)
{
Thread trdr = new Thread(new ParameterizedThreadStart(__ctReadFeedback));
trdr.Start(strr);
}
private void __ctReadFeedback(Object objStreamReader)
{
StreamReader strr = (StreamReader)objStreamReader;
string line;
while (!strr.EndOfStream && m_blnDoRead)
{
line = strr.ReadLine();
// lock the feedback buffer (since we don't want some messy stdout/err mix string in the end)
lock (m_objLock) { m_szFeedback += line + "\r\n"; }
}
}

所以如果要获取远程主机调用的用户目录的内容:

String feedback = RequestInfo("remote.ssh.host.de", "user", "password", new string[] { "ls -la" });

显然,您可以替换自己的地址、凭据和命令列表。

您可能还想清理输出字符串。例如。在我的例子中,我发送到远程主机的命令被回显到输出中,因此出现在返回字符串中。

关于c# - 在 C# 中使用 Plink.exe 连接到 SSH 进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22028592/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com