go语言获取主机ip,go语言做服务器

如何查找服务器/主机的IP地址?

1,打开我们的计算机,点击一下我们的左下角的开始菜单,搜索“运行”。

网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、成都小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了广饶免费建站欢迎大家使用!

2,点击运行,或者按住键盘上的开始键+R键,然后会弹出一个运行窗口。

3,输入cmd命令,然后点击回车,进入到命令的编辑界面,确定后,我们就会来到如下图所示的页面,然后将我们的输入法调节到英文状态下。

4,然后在打开的命令行窗口中输入 ipconfig/all ,回车(Enter)。

5,输入上述命令后,可以看到会出现很多的信息,找到IP地址和DNS服务器地址选项,在这里就可以看到 IP地址、DNS服务地址了、子网掩码、默认网关等信息了。

go语言中怎么获取域名对应的ip地址

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地址判断是否回环地址

if ipnet, ok := address.(*net.IPNet); ok !ipnet.IP.IsLoopback() {

if ipnet.IP.To4() != nil {

fmt.Println(ipnet.IP.String())

}

}

}

}

如何获取主机的ip?

1、当客户机提出查询请求时,首先在本地计算机的缓存中查找。如果在本地无法获得查询信息,则将查询请求发给dns服务器。

2、首先客户机将域名查询请求发送到本地dns服务器,当本地dns服务器接到查询后,首先在该服务器管理的区域的记录中查找,如果找到该记录,则利用此记录进行解析;如果没有区域信息可以满足查询要求,服务器在本地的缓存中查找。

3、如果本地服务器不能在本地找到客户机查询的信息,将客户机请求发送到根域名dns服务器。

4、根域名服务器负责解析客户机请求的根域部分,它将包含下一级域名信息的dns服务器地址返回给客户机的dns服务器地址。

5、客户机的dns服务器利用根域名服务器解析的地址访问下一级dns服务器,得到再下一级域我的dns服务器地址。

6、按照上述递归方法逐级接近查询目标,最后在有目标域名的dns服务器上找到相应ip地址信息。

7、客户机的本地dns服务器将递归查询结果返回客户机。

8、客户机利用从本地dns服务器查询得到的ip访问目标主机,就完成了一个解析过程。

Golang 绑定mac和ip地址,限制服务器

实际业务:go 二进制文件在私有化部署中,需要对客户的服务器mac和ip进行绑定,系统只能运行在绑定的服务器上。把mac和ip地址配置到config中。

运行效果:系统可正常编译,正常访问,在用户Auth接口进行核对。

//检验Mac和内网IP,测试环境不做校验

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("示授权的应用MAC,请联系")

}

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("示授权的应用IP,请联系")

}

return nil

}

项目使用GoFrame框架1.6。考虑到客户可能会对内存数据做分析破解,可以把mac和ip地址做AES加密。

如何获取本地和远程主机的IP及MAC地址

向大家介绍一下我们将如何获得一台主机的IP地址。在Win32 API中我们可以使用NetWork API完成这项工作,但是在.Net平台下我们应当如何做呢?其实操作方法与API差不多,只是大家要理解一下Namespace与Class。本站这方面的文章很多,关于Namespace与Class的内容就不介绍了。

.Net平台存在System.Net命名空间,其中的DNS类,提供了一些方法可以获取服务器的服务名或者是IP地址。DNS是一个静态类,所以它能够直接创建类实例。闲话少说,我们来看具体的程序:

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地址

//首先获了本地机的主机名

strHostName = DNS.GetHostName ();

Console.WriteLine ("Local Machine''s Host Name: " + strHostName);

}

else

{

strHostName = args[0];

}

// 接着使用主机名,获取IP地址列表

// 一台主机可能不只一个IP哦,不要被某些人误导了,呵呵,想想以前的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;

}

}

}

如果你想获得主机名,你可以使用不带参数的GetHostName方法,接着使用这个主机名作为参数交给GetHostByName方法,以获取IPAddress列表。最后是输出列表中的IP地址。

C#编程之 如何获取本地和远程主机的IP及MAC地址

利用dns类和WMI规范获取IP及MAC地址

在C#编程中,要获取主机名和主机IP地址,是比较容易的.它提供的Dns类,可以轻松的取得主机名和IP地址.

示例:

string strHostName = Dns.GetHostName(); //得到本机的主机名

IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本机IP

string strAddr = ipEntry.AddressList[0].ToString(); //假设本地主机为单网卡

在这段代码中使用了两个类,一个是Dns类,另一个为IPHostEntry类,二者都存在于命名空间System.Net中.

Dns类主要是从域名系统(DNS)中检索关于特定主机的信息,上面的代码第一行就从本地的DNS中检索出本地主机名.

IPHostEntry类则将一个域名系统或主机名与一组IP地址相关联,它与DNS类一起使用,用于获取主机的IP地址组.

要获取远程主机的IP地址,其方法也是大同小异.

在获取了IP地址后,如果还需要取得网卡的MAC地址,就需要进一步探究了.

这里又分两种情况,一是本机MAC地址,二是远程主机MAC地址.二者的获取是完全不同的.

在获取本机的MAC地址时,可以使用WMI规范,通过SELECT语句提取MAC地址.在.NET框架中,WMI规范的实现定义在System.Management命名空间中.

ManagementObjectSearcher类用于根据指定的查询检索管理对象的集合

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();

}

获取远程主机的MAC地址时,需要借用API函数SendARP.该函数使用ARP协议,向目的主机发送ARP包,利用返回并存储在高速缓存中的IP和MAC地址对,从而获取远程主机的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); //发送ARP包

return Convert.ToString(macinfo,16);

}

catch(Exception err)

{

Console.WriteLine("Error:{0}",err.Message);

}

return 0.ToString();

但使用该方式获取MAC时有一个很大的限制,就是只能获取同网段的远程主机MAC地址.因为在标准网络协议下,ARP包是不能跨网段传输的,故想通过ARP协议是无法查询跨网段设备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);

//获取本机的IP

public string getLocalIP()

{

string strHostName = Dns.GetHostName(); //得到本机的主机名

IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本机IP

string strAddr = ipEntry.AddressList[0].ToString();

return(strAddr);

}

//获取本机的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);

}

//获取远程主机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);

}

//获取远程主机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("本地网卡信息:");

Console.WriteLine(gi.getLocalIP() + " - " + gi.getLocalMac());

Console.WriteLine("/n/r远程网卡信息:");

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类来获取一个主机名或一个给定主机的IP地址。要想在程序中使用DNS类,就需要包含System.Net:

Include System.Net Reference

比如说想获取的IP地址,以下代码就会完成这个任务:

// 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 ());

}

另外,使用无参数的GetHostName可以返回本地机器的主机名:

string strHostName = DNS.GetHostName ();

然后将这个主机名作为参数传递给GetHostByName,就可以获取本地机器的IP地址信息。

如何使用Go语言实现远程执行命令

一般命令

所谓一般命令,就是在一定时间内会执行完的命令。比如 grep, cat 等等。 执行命令的步骤是:连接,执行,获取结果

连接

连接包含了认证,可以使用 password 或者 sshkey 2种方式来认证。下面的示例为了简单,使用了密码认证的方式来完成连接。

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

}

连接的方法很简单,只要提供登录主机的 用户*, *密码*, *主机名或者IP*, *SSH端口

执行,命令获取结果

连接成功后,执行命令很简单

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")

}

上面代码运行之后,虽然命令正常执行了,但是没有正常输出的结果,也没有异常输出的结果。 要想显示结果,需要将 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")

}

这样就能在屏幕上显示正常,异常的信息了。

交互式命令

上面的方式无法远程执行交互式命令,比如 top , 远程编辑一个文件,比如 vi /etc/nginx/nginx.conf 如果要支持交互式的命令,需要当前的terminal来接管远程的 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")

}


文章名称:go语言获取主机ip,go语言做服务器
URL网址:http://hbruida.cn/article/dssgdcd.html