.Net 执行Linux下多行shell命令方法

1.编写 执行给定的多行 shell 命令 方法

csharp 复制代码
public class ShellCommandExecutor
{
    /// <summary>
    /// 执行给定的多行 shell 命令
    /// </summary>
    /// <param name="commands">多行 shell 命令</param>
    public void ExecuteMultiLineShellCommands(string commands)
    {
        // 确保所有换行符都是 LF (\n)
        string normalizedCommands = NormalizeNewlines(commands);

        var processInfo = new ProcessStartInfo
        {
            FileName = "/bin/bash", // 在 Linux 上使用 /bin/bash
            Arguments = $"-c \"{normalizedCommands}\"", // 使用 -c 参数执行命令
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            CreateNoWindow = true
        };

        using (var process = new Process())
        {
            process.StartInfo = processInfo;
            process.OutputDataReceived += (sender, e) => Console.WriteLine(e.Data);
            process.ErrorDataReceived += (sender, e) => Console.Error.WriteLine(e.Data);

            process.Start();
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();
            process.WaitForExit();

            if (process.ExitCode != 0)
            {
                throw new ApplicationException($"Shell command failed with exit code {process.ExitCode}");
            }
        }
    }

    /// <summary>
    /// 规范化换行符为 LF (\n)
    /// </summary>
    /// <param name="input">原始命令字符串</param>
    /// <returns>规范化后的命令字符串</returns>
    private string NormalizeNewlines(string input)
    {
        return input.Replace("\r\n", "\n").Replace("\r", "\n");
    }
}

2.使用

csharp 复制代码
class Program
{
    static void Main(string[] args)
    {
        var executor = new ShellCommandExecutor();
        try
        {
            // 定义多行 shell 命令
            string commands = @"
                echo 'First command output'
                echo 'Second command output'
            ";

            executor.ExecuteMultiLineShellCommands(commands);
            Console.WriteLine("Shell commands executed successfully.");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error executing shell commands: {ex.Message}");
        }
    }
}

3.解释

规范化换行符:

使用 NormalizeNewlines 方法将所有换行符替换为 LF(\n)。

这样可以确保在 Linux 系统上执行时不会出现问题。

执行 Shell 命令:

使用 ProcessStartInfo 配置进程启动信息。

设置 FileName 为 /bin/bash。

设置 Arguments 为执行命令所需的参数,使用 -c 参数来执行命令。

设置 UseShellExecute 为 false,以便更好地控制进程。

设置 RedirectStandardOutput 和 RedirectStandardError 为 true,以便捕获输出和错误信息。

使用事件处理程序 OutputDataReceived 和 ErrorDataReceived 来处理标准输出和错误输出。

异常处理:

如果进程退出码不为 0,则抛出异常。

相关推荐
阿巴~阿巴~31 分钟前
基于UDP协议的英汉翻译服务系统:从网络通信到字典查询的完整机制
linux·服务器·网络·网络协议·udp协议·套接字绑定·英汉翻译服务系统
阿巴~阿巴~34 分钟前
简易回声服务器实现与网络测试指南
linux·服务器·网络·udp协议·网络测试·udp套接字编程
q***2513 小时前
深入浅出 SQLSugar:快速掌握高效 .NET ORM 框架
.net
凡间客3 小时前
Ansible安装与入门
linux·运维·ansible
君以思为故3 小时前
认识Linux -- 进程概念
linux·服务器
_OP_CHEN3 小时前
Linux网络编程:(八)GCC/G++ 编译器完全指南:从编译原理到实战优化,手把手教你玩转 C/C++ 编译
linux·运维·c++·编译和链接·gcc/g++·编译优化·静态链接与动态链接
阿乐艾官4 小时前
【十一、Linux管理网络安全】
linux·运维·web安全
Code Warrior5 小时前
【Linux】Socket 编程预备知识
linux·网络·c++
摘星|6 小时前
架设一台NFS服务器,并按照以下要求配置
linux·运维·服务器
做运维的阿瑞6 小时前
Linux环境变量持久化完全指南
linux·运维·服务器