由于买Raspberry没有买显示器,所以在启动时不知道对应的ip,使用不方便,有以下几种做法:
- 通过
namp
扫描相应的机器。 - 在启动时获取ip的脚本并发送。
通过namp扫描
nmap 192.168.1.*
除去已经知的,则另一个为raspberry的ip。
在启动时获取IP并发送
其步骤如下:
- 编写获取IP的脚本。
- 在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邮箱发邮件时,配置了密码,仍然报认证失败,其在客户端使用的密码使用的客户端授权密码