c# - 在 C# 中使用 SSH.NET 执行多个依赖的 SSH 命令

标签 c# .net ssh putty ssh.net

我想使用带有 SSH.NET 库的 C# 更改 SSH 内的目录:

SshClient cSSH = new SshClient("192.168.80.21", 22, "appmi", "Appmi");

cSSH.Connect();

Console.WriteLine("current directory:");
Console.WriteLine(cSSH.CreateCommand("pwd").Execute());

Console.WriteLine("change directory");
Console.WriteLine(cSSH.CreateCommand("cdr abc-log").Execute());

Console.WriteLine("show directory");
Console.WriteLine(cSSH.CreateCommand("pwd").Execute());

cSSH.Disconnect();
cSSH.Dispose();

Console.ReadKey();

但它不起作用。我还检查了以下内容:
Console.WriteLine(cSSH.RunCommand("cdr abc-log").Execute());

但仍然无法正常工作。

最佳答案

我相信您希望命令影响后续命令。
但是SshClient.CreateCommand使用 SSH "exec" channel 来执行命令。这意味着每个命令都在一个隔离的 shell 中执行,并且对其他命令没有影响。

如果您需要以先前命令影响以后命令的方式执行命令(例如更改工作目录或设置环境变量),则必须在同一 channel 中执行所有命令。为此,请使用适当的服务器外壳构造。在大多数系统上,您可以使用分号:

Console.WriteLine(cSSH.CreateCommand("pwd ; cdr abc-log ; pwd").Execute());
在 *nix 服务器上,您还可以使用 &&使以下命令仅在前面的命令成功时执行:
Console.WriteLine(cSSH.CreateCommand("pwd && cdr abc-log && pwd").Execute());

一些不太常见的系统(例如 AIX)甚至可能没有办法在一个“命令行”中执行多个命令。在这些情况下,您可能需要使用 shell channel ,否则不建议使用。
此外,当其他命令实际上是第一个命令的子命令时,您可能需要不同的解决方案。
Providing subcommands to a command (sudo/su) executed with SSH.NET SshClient.CreateShellStream .

关于c# - 在 C# 中使用 SSH.NET 执行多个依赖的 SSH 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56434268/

相关文章:

linux - Wine 无法构建 32 位程序错误

c# - 如何从 DataGridViewComboBoxColumn 获取选定值?

c# - 使用C#从XML检索文本

ssh - Satis - ssh2.sftp 协议(protocol)出错

c# - .net compact/xna 3.1 for xbox 360 中的 Rx 扩展/并行任务库?

c# - MSBuild 中出现错误 CS0840,但 VS2015 中没有错误

amazon-web-services - 为 AWS Lambda 存储私有(private) SSH key 的标准做法是什么

c# - 无效的转换异常,没有重定向或警报

c# - 在 Open XML SDK 中的单词书签后插入 OpenXmlElement

c# - 构建失败。检查“输出”窗口以获取更多详细信息 - C# 发布失败但构建成功