美文网首页
树莓派Raspberry获取IP

树莓派Raspberry获取IP

作者: 三无架构师 | 来源:发表于2017-04-10 22:34 被阅读177次

    由于买Raspberry没有买显示器,所以在启动时不知道对应的ip,使用不方便,有以下几种做法:

    1. 通过namp扫描相应的机器。
    2. 在启动时获取ip的脚本并发送。

    通过namp扫描

    nmap 192.168.1.*
    

    除去已经知的,则另一个为raspberry的ip。

    在启动时获取IP并发送

    其步骤如下:

    1. 编写获取IP的脚本。
    2. 在Raspberry启动脚本里面添加需要运行的脚本。

    此处使用go语言来编写获取IP的代码,保存在/code/ip.go中,其内容如下:

    package main
    
    import (
        "net/smtp"
        "log"
        "fmt"
        "net"
    )
    
    func main() {
        host := "smtp.163.com"
        serverHost := host + ":25"
        username := "xxxx@163.com"
        password := "xxxxxx"
        client, err := smtp.Dial(serverHost)
        logger(err)
    
        defer client.Close()
    
        auth := smtp.PlainAuth("localhost",username, password, host)
        err = client.Auth(auth)
        logger(err)
        err = client.Mail(username)
        logger(err)
        err = client.Rcpt(username)
        logger(err)
    
        wc, err := client.Data()
        logger(err)
    
        msg := []byte("Subject: ip")
        _,err = wc.Write(msg)
        wc.Write([]byte("\r\n\r\n"))
        wc.Write([]byte(getIp()))
    
        err = wc.Close()
        logger(err)
    
        client.Quit()
    
        fmt.Println("send ip over....")
    }
    
    func logger(err error)  {
        if err != nil {
            log.Fatal(err)
        }
    }
    
    func getIp() string{
        ipStr := ""
        addrs,err := net.InterfaceAddrs()
        if err != nil {
            panic(err)
        }
        for _,addr := range addrs {
            ipStr += addr.String() + "\n"
        }
        return ipStr
    }
    

    树莓派的启动脚本为/etc/rc.local,如果添加,需要在其exit 0这行前面添加,其内容如下:

    /usr/local/go/bin/go run /code/ip.go
    

    这时重启Raspberry后,收到邮件内容如下:

    127.0.0.1/8
    192.168.1.7/24
    ::1/128
    

    改进版本(通过shell传入IP)

    这时发的内容较多,此外还可以使用以下方法来解决,由于/etc/rc.local中已经有获取IP的变量,这时可以在其后面,把这个参数传入到go的发送邮件代码里面即可。内容如:

    sleep 10
    _IP=$(hostname -I) || true
    if [ "$_IP" ]; then
      printf "My IP address is %s\n" "$_IP"
    fi
    
    /usr/local/go/bin/go run /code/mail.go $_IP
    
    exit 0
    

    其中mail.go内容和ip.go基本一致,只是把获取IP的代码去除,正文为传入的IP,代码中通过os.Args[1]获取传入的参数。完整代码如:

    package main
    
    import (
        "net/smtp"
        "log"
        "fmt"
        "os"
    )
    
    func main() {
        host := "smtp.163.com"
        serverHost := host + ":25"
        username := "xxx@163.com"
        password := "xxxxx"
        client, err := smtp.Dial(serverHost)
        logger(err)
    
        defer client.Close()
    
        auth := smtp.PlainAuth("localhost",username, password, host)
        err = client.Auth(auth)
        logger(err)
        err = client.Mail(username)
        logger(err)
        err = client.Rcpt(username)
        logger(err)
    
        wc, err := client.Data()
        logger(err)
    
        msg := []byte("Subject: ip")
        _,err = wc.Write(msg)
        wc.Write([]byte("\r\n\r\n"))
        wc.Write([]byte(os.Args[1]))
    
        err = wc.Close()
        logger(err)
    
        client.Quit()
    
        fmt.Println("send ip over....")
    }
    
    func logger(err error)  {
        if err != nil {
            log.Fatal(err)
        }
    }
    

    注意点

    使用163邮箱发邮件时,配置了密码,仍然报认证失败,其在客户端使用的密码使用的客户端授权密码

    Paste_Image.png

    相关文章

      网友评论

          本文标题:树莓派Raspberry获取IP

          本文链接:https://www.haomeiwen.com/subject/dojeattx.html