我正在尝试使用 Renci SSH.NET 从 C# Web 应用程序连接到远程 Linux 服务器并执行 shell 脚本。我想一个接一个地运行脚本。但不知道如何运行脚本并读取输出并将其存储在标签中。 我试过下面的代码,但无法一行接一行地传递多个命令。

SshClient sshclient = new SshClient("host", UserName, Password); 
sshclient.Connect(); 
ShellStream stream = sshclient.CreateShellStream("commands", 80, 24, 800, 600, 1024); 
public StringBuilder sendCommand(string customCMD) 
{ 
    StringBuilder answer; 
 
    var reader = new StreamReader(stream); 
    var writer = new StreamWriter(stream); 
    writer.AutoFlush = true; 
    WriteStream(customCMD, writer, stream); 
    answer = ReadStream(reader); 
    return answer; 
} 
 
private void WriteStream(string cmd, StreamWriter writer, ShellStream stream) 
{ 
    writer.WriteLine(cmd); 
    while (stream.Length == 0) 
    { 
        Thread.Sleep(500); 
    } 
} 
 
private StringBuilder ReadStream(StreamReader reader) 
{ 
    StringBuilder result = new StringBuilder(); 
 
    string line; 
    while ((line = reader.ReadLine()) != null) 
    { 
        result.AppendLine(line); 
    } 
    return result; 
} 

我正在尝试运行以下命令

sudo su - wwabc11 
whoami 
cd /wwabc11/batch/bin/ 
pwd 

如何依次运行命令并读取输出信息?谢谢。

请您参考如下方法:

只需将“命令”写入StreamWriter

writer.WriteLine("sudo su - wwabc11"); 
writer.WriteLine("whoami"); 
// etc 

另见 C# send Ctrl+Y over SSH.NET .


但请注意,使用 CreateShellStream(“shell” channel )并不是自动执行命令的正确方法。您应该使用 CreateCommand/RunCommand(“exec” channel )。尽管 SSH.NET 将 API 限制到“exec” channel ,但不支持为以这种方式执行的命令提供输入。而 whoami 和其他的实际上是 sudo/su 命令的输入。

一个解决方案是在其命令行上向 su 提供命令,例如:

sudo su - wwabc11 -c "whoami ; cd /wwabc11/batch/bin/ ; pwd" 

有关使用 CreateCommand 执行命令并读取其输出的代码示例,请参阅 SSH.NET real-time command output monitoring .


评论关闭
IT序号网

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