【问题标题】:Providing subcommands to a command (sudo/su) executed with SSH.NET SshClient.CreateShellStream为使用 SSH.NET SshClient.CreateShellStream 执行的命令 (sudo/su) 提供子命令
【发布时间】:2019-01-15 07:09:32
【问题描述】:

我正在尝试使用 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

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

【问题讨论】:

    标签: c# .net shell ssh ssh.net


    【解决方案1】:

    只需将“命令”写入StreamWriter

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

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


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

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

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

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

    【讨论】:

      最近更新 更多