樹(shù)莓派沒(méi)有顯示器澡匪,只能通過(guò)SSH登陸扳碍,而又不想設(shè)置固定IP,因?yàn)橐S身攜帶外出仙蛉,每個(gè)網(wǎng)絡(luò)環(huán)境可能網(wǎng)段不一樣笋敞。因此想用python寫(xiě)個(gè)腳本,讓樹(shù)莓派開(kāi)機(jī)后自動(dòng)獲取本機(jī)ip荠瘪,并且自動(dòng)發(fā)送到我指定郵箱夯巷。(完整源碼)
- 獲取所有連接的網(wǎng)絡(luò)接口,比如有線哀墓、wifi等接口
def get_ip_address():
#先獲取所有網(wǎng)絡(luò)接口
SIOCGIFCONF = 0x8912
SIOCGIFADDR = 0x8915
BYTES = 4096
sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
names = array.array('B',b'\0' * BYTES)
bytelen = struct.unpack('iL', fcntl.ioctl(sck.fileno(), SIOCGIFCONF, struct.pack('iL', BYTES, names.buffer_info()[0])))[0]
namestr = names.tostring()
ifaces = [namestr[i:i+32].split('\0', 1)[0] for i in range(0, bytelen, 32)]
#再獲取每個(gè)接口的IP地址
iplist = []
for ifname in ifaces:
ip = socket.inet_ntoa(fcntl.ioctl(sck.fileno(),SIOCGIFADDR,struct.pack('256s',ifname[:15]))[20:24])
iplist.append(ifname+':'+ip)
return iplist
- 把IP地址發(fā)送到指定郵箱
def ip_send_mail(iptxt):
#設(shè)置收件郵箱
toaddrs = 'to@mail.com'
#設(shè)置發(fā)送郵箱
fromaddr = 'send@mail.com'
#設(shè)置發(fā)送郵箱的賬號(hào)密碼
username = 'your_sendmail@mail.com'
password = 'your_pass'
#設(shè)置SMTP服務(wù)器趁餐、端口,根據(jù)你的郵箱設(shè)置篮绰,
server = smtplib.SMTP('smtp.mail.com:25')
#設(shè)置郵件正文后雷,get_ip_address()返回的是list,要轉(zhuǎn)換成str
ip = '\r\n'.join(iptxt)
#設(shè)置郵件標(biāo)題和正文
msg = MIMEText(ip,'plain', 'utf-8')
msg['Subject'] = 'IP For RaspberryPi'
msg['From'] = fromaddr
msg['To'] = toaddrs
#啟動(dòng)SMTP發(fā)送郵件
server.ehlo()
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg.as_string())
server.quit()
3.最后調(diào)用以上函數(shù)運(yùn)行即可
if __name__ == '__main__':
#獲取IP
iptxt = get_ip_address()
#將IP存入文件,如果直接發(fā)送郵件臀突,這步可以省略勉抓。
ip_save_file(iptxt)
#將IP地址發(fā)送到指定郵箱
ip_send_mail(iptxt)
4.設(shè)置開(kāi)機(jī)運(yùn)行
把以上代碼都放入一個(gè)文件,把文件放到樹(shù)莓派卡里面候学,如:
/home/pi/get_ip_address.py
-
給python腳本可執(zhí)行權(quán)限
sudo chmod +x get_ip_address.py
-
設(shè)置系統(tǒng)啟動(dòng)時(shí)運(yùn)行
sudo nano /etc/profile
編輯profile文件,在profile最后面藕筋,fi之前把腳本路徑添加進(jìn)去
/home/pi/your_script_name.sh