• .Net 在容器中操作宿主机


    方案描述

    在 docker 容器中想操作宿主机,一般会使用 ssh 的方式,然后 .Net 通过执行远程 ssh 指令来操作宿主机。本文将使用 交互式 .Net 容器版 中提供的镜像演示 .Net 在容器中如何操作宿主机。

     

    前期准备

    1. 在宿主机上生成 ssh key

    ssh-keygen -t rsa -b 4096

     

    2. 把 Public Key 加入到 authorized_keys

    cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys

     

    3. 启动容器,并把 Private Key 挂载到容器中

    docker run --name dotnet-interactive -d -v /root/.ssh/id_rsa:/root/.ssh/id_rsa -p 80:8888 dotnet-interactive:1.0.0
    
    docker ps

     

    4. 安装 ssh client

    打开网页并进入 Terminal:

     

    安装 ssh client:

    # 更新源
    apt-get update -y
    
    # 安装 ssh client
    apt-get install openssh-client -y

     

    # 检查 ssh client 安装情况
    ssh --help

     

    操作演示

    1. 指令获取容器主机名

    hostname

     

    2. 指令获取宿主机主机名

    ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PasswordAuthentication=no -i /root/.ssh/id_rsa {user}@{nodeIp} "hostname"

     

    3. .Net 获取容器主机名

    复制代码
    using System.Diagnostics;
    
    public string ExecuteCommand(string command)
    {
        var escapedArgs = command.Replace("\"", "\\\"");
        var process = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "/bin/bash",
                Arguments = $"-c \"{escapedArgs}\"",
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false,
                CreateNoWindow = true
            }
        };
    
        process.Start();
        process.WaitForExit();
    
        var message = process.StandardOutput.ReadToEnd();
        message += process.StandardOutput.ReadToEnd();
    
        return message;
    }
    
    var hostname = ExecuteCommand("hostname");
    hostname
    复制代码

     

    4. .Net 获取宿主机主机名

    复制代码
    public string ExecuteCommandSSH(string ip, string rootUser, string command)
    {
        var script = $"ssh -q -o \"StrictHostKeyChecking no\" -o \"UserKnownHostsFile=/dev/null\" -i /keys/{ip}/sshkey/id_rsa \"{rootUser}@{ip}\" \"{command}\"";
        return ExecuteCommand(script);
    }
    
    var hostname2 = ExecuteCommandSSH("10.0.0.2", "root", "hostname");
    hostname2
    复制代码

     

    参考总结

    以上就是本文希望分享的内容,如果大家有什么问题,欢迎在文章或者公众号 - 跬步之巅留言交流。
  • 相关阅读:
    DRF 学习
    UDP和TCP:奇妙的网络协议
    关于这半年,我在干些什么,有一些想和你分享的话题
    Mysql关联查询
    嵌入式C开发关键字的应用技巧
    CSS常见选择器
    基于CS结构的即时通信系统的设计与实现(QT开发)
    解决Requests中使用httpbin服务器问题:自定义URL的实现与验证
    安秒平衡在单相整流器纹波分析中的应用
    递归算法(1163~1167)(未完结)
  • 原文地址:https://www.cnblogs.com/Erik_Xu/p/16279735.html