方案描述
在 docker 容器中想操作宿主机,一般会使用 ssh 的方式,然后 .Net 通过执行远程 ssh 指令来操作宿主机。本文将使用 交互式 .Net 容器版 中提供的镜像演示 .Net 在容器中如何操作宿主机。
前期准备
- 在宿主机上生成 ssh key
ssh-keygen -t rsa -b 4096
- 把 Public Key 加入到 authorized_keys
cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys
- 启动容器,并把 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
操作演示
- 指令获取容器主机名
- 指令获取宿主机主机名
ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PasswordAuthentication=no -i /root/.ssh/id_rsa {user}@{nodeIp} "hostname"
- .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
- .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