1,打開我們的計(jì)算機(jī),點(diǎn)擊一下我們的左下角的開始菜單,搜索“運(yùn)行”。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、成都小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了廣饒免費(fèi)建站歡迎大家使用!
2,點(diǎn)擊運(yùn)行,或者按住鍵盤上的開始鍵+R鍵,然后會彈出一個運(yùn)行窗口。
3,輸入cmd命令,然后點(diǎn)擊回車,進(jìn)入到命令的編輯界面,確定后,我們就會來到如下圖所示的頁面,然后將我們的輸入法調(diào)節(jié)到英文狀態(tài)下。
4,然后在打開的命令行窗口中輸入 ipconfig/all?,回車(Enter)。
5,輸入上述命令后,可以看到會出現(xiàn)很多的信息,找到IP地址和DNS服務(wù)器地址選項(xiàng),在這里就可以看到?IP地址、DNS服務(wù)地址了、子網(wǎng)掩碼、默認(rèn)網(wǎng)關(guān)等信息了。
package main
import (
"fmt"
"net"
"os"
)
func main() {
addrs, err := net.InterfaceAddrs()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
for _, address := range addrs {
// 檢查ip地址判斷是否回環(huán)地址
if ipnet, ok := address.(*net.IPNet); ok !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
fmt.Println(ipnet.IP.String())
}
}
}
}
1、當(dāng)客戶機(jī)提出查詢請求時,首先在本地計(jì)算機(jī)的緩存中查找。如果在本地?zé)o法獲得查詢信息,則將查詢請求發(fā)給dns服務(wù)器。
2、首先客戶機(jī)將域名查詢請求發(fā)送到本地dns服務(wù)器,當(dāng)本地dns服務(wù)器接到查詢后,首先在該服務(wù)器管理的區(qū)域的記錄中查找,如果找到該記錄,則利用此記錄進(jìn)行解析;如果沒有區(qū)域信息可以滿足查詢要求,服務(wù)器在本地的緩存中查找。
3、如果本地服務(wù)器不能在本地找到客戶機(jī)查詢的信息,將客戶機(jī)請求發(fā)送到根域名dns服務(wù)器。
4、根域名服務(wù)器負(fù)責(zé)解析客戶機(jī)請求的根域部分,它將包含下一級域名信息的dns服務(wù)器地址返回給客戶機(jī)的dns服務(wù)器地址。
5、客戶機(jī)的dns服務(wù)器利用根域名服務(wù)器解析的地址訪問下一級dns服務(wù)器,得到再下一級域我的dns服務(wù)器地址。
6、按照上述遞歸方法逐級接近查詢目標(biāo),最后在有目標(biāo)域名的dns服務(wù)器上找到相應(yīng)ip地址信息。
7、客戶機(jī)的本地dns服務(wù)器將遞歸查詢結(jié)果返回客戶機(jī)。
8、客戶機(jī)利用從本地dns服務(wù)器查詢得到的ip訪問目標(biāo)主機(jī),就完成了一個解析過程。
實(shí)際業(yè)務(wù):go 二進(jìn)制文件在私有化部署中,需要對客戶的服務(wù)器mac和ip進(jìn)行綁定,系統(tǒng)只能運(yùn)行在綁定的服務(wù)器上。把mac和ip地址配置到config中。
運(yùn)行效果:系統(tǒng)可正常編譯,正常訪問,在用戶Auth接口進(jìn)行核對。
//檢驗(yàn)Mac和內(nèi)網(wǎng)IP,測試環(huán)境不做校驗(yàn)
func (c *CommonBase)CheckMacAndIp()error {
ipCfg :=g.Cfg().GetString("machine.Ipaddr")
macCfg :=g.Cfg().GetString("machine.Macip")
if ipCfg =="127.0.0.1" {
return nil
}
macArray,_ :=gipv4.GetMacArray()
if len(macArray) ==0 {
return gerror.New("mac地址獲取失敗")
}
if garray.NewStrArrayFrom(macArray).Contains(macCfg) ==false {
return gerror.New("示授權(quán)的應(yīng)用MAC,請聯(lián)系")
}
ipArray,_ :=gipv4.GetIpArray()
ipIntranetArray,_ :=gipv4.GetIntranetIpArray()
if len(ipArray) ==0 len(ipIntranetArray) ==0 {
return gerror.New("ip地址獲取失敗")
}
if garray.NewStrArrayFrom(ipArray).Merge(ipIntranetArray).Contains(ipCfg) ==false {
return gerror.New("示授權(quán)的應(yīng)用IP,請聯(lián)系")
}
return nil
}
項(xiàng)目使用GoFrame框架1.6。考慮到客戶可能會對內(nèi)存數(shù)據(jù)做分析破解,可以把mac和ip地址做AES加密。
向大家介紹一下我們將如何獲得一臺主機(jī)的IP地址。在Win32 API中我們可以使用NetWork API完成這項(xiàng)工作,但是在.Net平臺下我們應(yīng)當(dāng)如何做呢?其實(shí)操作方法與API差不多,只是大家要理解一下Namespace與Class。本站這方面的文章很多,關(guān)于Namespace與Class的內(nèi)容就不介紹了。
.Net平臺存在System.Net命名空間,其中的DNS類,提供了一些方法可以獲取服務(wù)器的服務(wù)名或者是IP地址。DNS是一個靜態(tài)類,所以它能夠直接創(chuàng)建類實(shí)例。閑話少說,我們來看具體的程序:
namespace NKUtilities
{
using System;
using System.Net;
public class DNSUtility
{
public static int Main (string [] args)
{
String strHostName = new String ("");
if (args.Length == 0)
{
// 獲得本地的IP地址
//首先獲了本地機(jī)的主機(jī)名
strHostName = DNS.GetHostName ();
Console.WriteLine ("Local Machine''s Host Name: " + strHostName);
}
else
{
strHostName = args[0];
}
// 接著使用主機(jī)名,獲取IP地址列表
// 一臺主機(jī)可能不只一個IP哦,不要被某些人誤導(dǎo)了,呵呵,想想以前的163與169就知道了
IPHostEntry ipEntry = DNS.GetHostByName (strHostName);
IPAddress [] addr = ipEntry.AddressList;
for (int i = 0; i addr.Length; i++)
{
Console.WriteLine ("IP Address {0}: {1} ", i, addr[i].ToString ());
}
return 0;
}
}
}
如果你想獲得主機(jī)名,你可以使用不帶參數(shù)的GetHostName方法,接著使用這個主機(jī)名作為參數(shù)交給GetHostByName方法,以獲取IPAddress列表。最后是輸出列表中的IP地址。
C#編程之 如何獲取本地和遠(yuǎn)程主機(jī)的IP及MAC地址
利用dns類和WMI規(guī)范獲取IP及MAC地址
在C#編程中,要獲取主機(jī)名和主機(jī)IP地址,是比較容易的.它提供的Dns類,可以輕松的取得主機(jī)名和IP地址.
示例:
string strHostName = Dns.GetHostName(); //得到本機(jī)的主機(jī)名
IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本機(jī)IP
string strAddr = ipEntry.AddressList[0].ToString(); //假設(shè)本地主機(jī)為單網(wǎng)卡
在這段代碼中使用了兩個類,一個是Dns類,另一個為IPHostEntry類,二者都存在于命名空間System.Net中.
Dns類主要是從域名系統(tǒng)(DNS)中檢索關(guān)于特定主機(jī)的信息,上面的代碼第一行就從本地的DNS中檢索出本地主機(jī)名.
IPHostEntry類則將一個域名系統(tǒng)或主機(jī)名與一組IP地址相關(guān)聯(lián),它與DNS類一起使用,用于獲取主機(jī)的IP地址組.
要獲取遠(yuǎn)程主機(jī)的IP地址,其方法也是大同小異.
在獲取了IP地址后,如果還需要取得網(wǎng)卡的MAC地址,就需要進(jìn)一步探究了.
這里又分兩種情況,一是本機(jī)MAC地址,二是遠(yuǎn)程主機(jī)MAC地址.二者的獲取是完全不同的.
在獲取本機(jī)的MAC地址時,可以使用WMI規(guī)范,通過SELECT語句提取MAC地址.在.NET框架中,WMI規(guī)范的實(shí)現(xiàn)定義在System.Management命名空間中.
ManagementObjectSearcher類用于根據(jù)指定的查詢檢索管理對象的集合
ManagementObjectCollection類為管理對象的集合,下例中由檢索對象返回管理對象集合賦值給它.
示例:
ManagementObjectSearcher query =new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration") ;
ManagementObjectCollection queryCollection = query.Get();
foreach( ManagementObject mo in queryCollection )
{
if(mo["IPEnabled"].ToString() == "True")
mac = mo["MacAddress"].ToString();
}
獲取遠(yuǎn)程主機(jī)的MAC地址時,需要借用API函數(shù)SendARP.該函數(shù)使用ARP協(xié)議,向目的主機(jī)發(fā)送ARP包,利用返回并存儲在高速緩存中的IP和MAC地址對,從而獲取遠(yuǎn)程主機(jī)的MAC地址.
示例:
Int32 ldest= inet_addr(remoteIP); //目的ip
Int32 lhost= inet_addr(localIP); //本地ip
try
{
Int64 macinfo = new Int64();
Int32 len = 6;
int res = SendARP(ldest,0, ref macinfo, ref len); //發(fā)送ARP包
return Convert.ToString(macinfo,16);
}
catch(Exception err)
{
Console.WriteLine("Error:{0}",err.Message);
}
return 0.ToString();
但使用該方式獲取MAC時有一個很大的限制,就是只能獲取同網(wǎng)段的遠(yuǎn)程主機(jī)MAC地址.因?yàn)樵跇?biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議下,ARP包是不能跨網(wǎng)段傳輸?shù)?,故想通過ARP協(xié)議是無法查詢跨網(wǎng)段設(shè)備MAC地址的。
示例程序:
using System.Net;
using System;
using System.Management;
using System.Runtime.InteropServices;
public class getIP
{
[DllImport("Iphlpapi.dll")]
private static extern int SendARP(Int32 dest,Int32 host,ref Int64 mac,ref Int32 length);
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip);
//獲取本機(jī)的IP
public string getLocalIP()
{
string strHostName = Dns.GetHostName(); //得到本機(jī)的主機(jī)名
IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本機(jī)IP
string strAddr = ipEntry.AddressList[0].ToString();
return(strAddr);
}
//獲取本機(jī)的MAC
public string getLocalMac()
{
string mac = null;
ManagementObjectSearcher query =new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration") ;
ManagementObjectCollection queryCollection = query.Get();
foreach( ManagementObject mo in queryCollection )
{
if(mo["IPEnabled"].ToString() == "True")
mac = mo["MacAddress"].ToString();
}
return(mac);
}
//獲取遠(yuǎn)程主機(jī)IP
public string[] getRemoteIP(string RemoteHostName)
{
IPHostEntry ipEntry = Dns.GetHostByName(RemoteHostName);
IPAddress[] IpAddr = ipEntry.AddressList;
string[] strAddr = new string[IpAddr.Length];
for (int i=0;i {
strAddr[i] = IpAddr[i].ToString();
}
return(strAddr);
}
//獲取遠(yuǎn)程主機(jī)MAC
public string getRemoteMac(string localIP, string remoteIP)
{
Int32 ldest= inet_addr(remoteIP); //目的ip
Int32 lhost= inet_addr(localIP); //本地ip
try
{
Int64 macinfo = new Int64();
Int32 len = 6;
int res = SendARP(ldest,0, ref macinfo, ref len);
return Convert.ToString(macinfo,16);
}
catch(Exception err)
{
Console.WriteLine("Error:{0}",err.Message);
}
return 0.ToString();
}
public static void Main(string[] args)
{
getIP gi = new getIP();
Console.WriteLine("本地網(wǎng)卡信息:");
Console.WriteLine(gi.getLocalIP() + " - " + gi.getLocalMac());
Console.WriteLine("/n/r遠(yuǎn)程網(wǎng)卡信息:");
string[] temp = gi.getRemoteIP("scmobile-tj2");
for(int i=0;i {
Console.WriteLine(temp[i]);
}
Console.WriteLine(gi.getRemoteMac("192.168.0.3","192.168.0.1"));
}
}
可以用.Net的DNS類來獲取一個主機(jī)名或一個給定主機(jī)的IP地址。要想在程序中使用DNS類,就需要包含System.Net:
Include System.Net Reference
比如說想獲取的IP地址,以下代碼就會完成這個任務(wù):
// Call DNS.GetHostName to get IPHostEntry and get the IP address list.
IPHostEntry ipEntry = DNS.GetHostByName ("");
IPAddress [] IpAddr = ipEntry.AddressList;
for (int i = 0; i IpAddr.Length; i++){
Console.WriteLine ("IP Address {0}: {1} ", i, IpAddr[i].ToString ());
}
另外,使用無參數(shù)的GetHostName可以返回本地機(jī)器的主機(jī)名:
string strHostName = DNS.GetHostName ();
然后將這個主機(jī)名作為參數(shù)傳遞給GetHostByName,就可以獲取本地機(jī)器的IP地址信息。
一般命令
所謂一般命令,就是在一定時間內(nèi)會執(zhí)行完的命令。比如 grep, cat 等等。 執(zhí)行命令的步驟是:連接,執(zhí)行,獲取結(jié)果
連接
連接包含了認(rèn)證,可以使用 password 或者 sshkey 2種方式來認(rèn)證。下面的示例為了簡單,使用了密碼認(rèn)證的方式來完成連接。
import (
"fmt"
"time"
"golang.org/x/crypto/ssh"
)
func connect(user, password, host string, port int) (*ssh.Session, error) {
var (
auth []ssh.AuthMethod
addr string
clientConfig *ssh.ClientConfig
client *ssh.Client
session *ssh.Session
err error
)
// get auth method
auth = make([]ssh.AuthMethod, 0)
auth = append(auth, ssh.Password(password))
clientConfig = ssh.ClientConfig{
User: user,
Auth: auth,
Timeout: 30 * time.Second,
}
// connet to ssh
addr = fmt.Sprintf("%s:%d", host, port)
if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
return nil, err
}
// create session
if session, err = client.NewSession(); err != nil {
return nil, err
}
return session, nil
}
連接的方法很簡單,只要提供登錄主機(jī)的 用戶*, *密碼*, *主機(jī)名或者IP*, *SSH端口
執(zhí)行,命令獲取結(jié)果
連接成功后,執(zhí)行命令很簡單
import (
"fmt"
"log"
"os"
"time"
"golang.org/x/crypto/ssh"
)
func main() {
session, err := connect("root", "xxxxx", "127.0.0.1", 22)
if err != nil {
log.Fatal(err)
}
defer session.Close()
session.Run("ls /; ls /abc")
}
上面代碼運(yùn)行之后,雖然命令正常執(zhí)行了,但是沒有正常輸出的結(jié)果,也沒有異常輸出的結(jié)果。 要想顯示結(jié)果,需要將 session 的 Stdout 和 Stderr 重定向 修改 func main 為如下:
func main() {
session, err := connect("root", "xxxxx", "127.0.0.1", 22)
if err != nil {
log.Fatal(err)
}
defer session.Close()
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Run("ls /; ls /abc")
}
這樣就能在屏幕上顯示正常,異常的信息了。
交互式命令
上面的方式無法遠(yuǎn)程執(zhí)行交互式命令,比如 top , 遠(yuǎn)程編輯一個文件,比如 vi /etc/nginx/nginx.conf 如果要支持交互式的命令,需要當(dāng)前的terminal來接管遠(yuǎn)程的 PTY。
func main() {
session, err := connect("root", "olordjesus", "dockers.iotalabs.io", 2210)
if err != nil {
log.Fatal(err)
}
defer session.Close()
fd := int(os.Stdin.Fd())
oldState, err := terminal.MakeRaw(fd)
if err != nil {
panic(err)
}
defer terminal.Restore(fd, oldState)
// excute command
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Stdin = os.Stdin
termWidth, termHeight, err := terminal.GetSize(fd)
if err != nil {
panic(err)
}
// Set up terminal modes
modes := ssh.TerminalModes{
ssh.ECHO: 1, // enable echoing
ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
}
// Request pseudo terminal
if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil {
log.Fatal(err)
}
session.Run("top")
}