我想使用带有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());
但仍然无法正常工作。
答案 0 :(得分:2)
我相信您希望这些命令影响以后的命令。
但是SshClient.CreateCommand
使用SSH“ exec”通道执行命令。这意味着每个命令都在隔离的shell中执行,而对其他命令没有影响。
如果需要以以前的命令影响以后的命令的方式执行命令(例如更改工作目录或设置环境变量),则必须在同一通道中执行所有命令。为此,请使用服务器外壳的适当结构。在大多数系统上,您可以使用分号:
Console.WriteLine(cSSH.CreateCommand("pwd ; cdr abc-log ; pwd").Execute());
在* nix服务器上,您也可以使用&&
来使以下命令仅在前面的命令成功执行时执行:
Console.WriteLine(cSSH.CreateCommand("pwd && cdr abc-log && pwd").Execute());
答案 1 :(得分:0)
这就是我所做的,并且对我有用:
SshClient sshClient = new SshClient("some IP", 22, "loign", "pwd");
sshClient.Connect();
ShellStream shellStream = sshClient.CreateShellStream("xterm", 80, 40, 80, 40, 1024);
string cmd = "ls";
shellStream.WriteLine(cmd + "; echo !");
while (shellStream.Length == 0)
Thread.Sleep(500);
StringBuilder result = new StringBuilder();
string line;
string dbt = @"PuttyTest.txt";
StreamWriter sw = new StreamWriter(dbt, append: true);
while ((line = shellStream.ReadLine()) != "!")
{
result.AppendLine(line);
sw.WriteLine(line);
}
sw.Close();
sshClient.Disconnect();
sshClient.Dispose();
Console.ReadKey();