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


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!