树莓派Raspberry获取IP

2017-04-10  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读