我想使用带有 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/