1
方案描述? ? ? ?
在 docker?容器中想操作宿主機,一般會使用 ssh 的方式,然后 .Net 通過執行遠程 ssh?指令來操作宿主機。本文將使用?交互式 .Net 容器版?中提供的鏡像演示?.Net 在容器中如何操作宿主機。
2
前期準備? ? ? ?
1.?宿主機上生成?ssh key
生成 ssh key:
ssh-keygen -t rsa -b 4096
把 public key 加入到 authorized_keys:
cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys
2.?啟動容器
啟動容器,并把 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
3.?安裝 ssh client
打開網頁并進入 Terminal:
安裝 ssh client:
# 更新源
apt-get update -y# 安裝 ssh client
apt-get install openssh-client -y
檢查?ssh client 安裝情況:
ssh --help
3
操作演示? ? ? ?
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
4
參考總結? ? ? ?
以上就是本文希望分享的內容,如果大家有什么問題,歡迎在公眾號 - 跬步之巔留言交流。