大致情况是这样的:
1.本人文科生,稍微会用一些 Linux,基本上就是能自己装个 Manjaro 复制粘贴写个 service 文件让 aria2 开机运行的级别。完全没有写代码经验。
2.前几天手痒买了个树莓派 4b 。凑合能装上系统做些最初级的工作。现在有个需求是:想让系统在开机的时候发送本机 IP 。在网上目前找到了一段 python 的代码,但是在运行的时候出现了错误。
代码如下
#!/usr/bin/env python
# modified from http://elinux.org/RPi_Email_IP_On_Boot_Debian
import subprocess
import smtplib
import socket
from email.mime.text import MIMEText
import datetime
import urllib.request, urllib.error, urllib.parse
# Change to your own account information
to = 'mailr'
email_user = 'mails'
email_password = 'passwd'
smtpserver = smtplib.SMTP('smtpserver', 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(email_user, email_password)
today = datetime.date.today()
# Very Linux Specific
arg='ip route list'
p=subprocess.Popen(arg,shell=True,stdout=subprocess.PIPE)
data = p.communicate()
split_data = data[0].split()
ipaddr = split_data[split_data.index('src')+1]
extipaddr = urllib2.urlopen("https://extreme-ip-lookup.com/json/").read()
my_ip = 'Local address: %s\nExternal address: %s' % (ipaddr, extipaddr)
msg = MIMEText(my_ip)
msg['Subject'] = 'IP For RaspberryPi on %s' % today.strftime('%b %d %Y')
msg['From'] = email_user
msg['To'] = to
smtpserver.sendmail(email_user, [to], msg.as_string())
smtpserver.quit()
用 python 运行这段代码之后显示:
Traceback (most recent call last):
File "ip_mailer.py", line 24, in <module>
ipaddr = split_data[split_data.index('src')+1]
ValueError: 'src' is not in list
用 python2 运行好似是没问题。
3.请问,如果要让这段代码够在 python3 下可以运行,应该如何修改。谢谢。(树莓派上装的是 Manjaro-ARM,默认不带 python2,另外我觉得也许会学着写点代码,考虑到 python2 好像快要停止维护了,所以我觉得可能准备一个 Python3 能运行的脚本比较好。)
4.关于开机发送 IP,我的想法是用这个脚本,然后写一个 service 文件开机运行,运行 30 秒后退出。目前在笔记本电脑上( Manjaro 系统下。对,我是 Manjaro 爱好者)用 python2 的话,实现预期目标没有问题。
5.鉴于莓派已经到手了,我又有些需求,所以也准备试着学一些 python3 码基础知识吧。各位大佬有什么推荐的教材码?我就准备自己在家看看,目前觉得需求可能就是批量下载 bt 种子这种情况能满足就够了。
感谢指教。
1
RickyHao 2020-04-27 12:26:59 +08:00 via Android
推荐别开机发送 ip 了,直接路由器网页设置静态 ip 吧
|
2
Zalica OP @RickyHao 静态 IP 已经设置了,在自家用没问题。但是有时候我可能会把树莓派带到单位去用单位 WIFI,那种情况下设置静态 IP 好像不太可行,所以就选择了开机发送 IP 这个方案。
另外我觉得这样比较有趣。 |
3
yeqizhang 2020-04-27 12:34:04 +08:00 via Android
搞个脚本,发邮件就行,我家路由器我就搞了个 lua 脚本,开机发邮件给我。
用来提醒家里停过电的,不然停电多久都不知道,冰箱里东西容易坏 |
4
jasonyang9 2020-04-27 12:39:53 +08:00
```
... arg='ip route list' p=subprocess.Popen(arg,shell=True,stdout=subprocess.PIPE) data = p.communicate() split_data = data[0].split() ipaddr = split_data[split_data.index('src')+1] ... ``` 你的树莓派上有`ip`命令么?`ip route list`输出是啥? |
5
Zalica OP @jasonyang9 有。运行结果如下
``` [r0ck3t@RaspberryPi ~]$ ip route list default via 192.168.1.1 dev wlan0 proto static metric 600 192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.100 metric 600 ``` |
7
jasonyang9 2020-04-27 13:02:15 +08:00
```
... arg='ip route list' p=subprocess.Popen(arg,shell=True,stdout=subprocess.PIPE) data = p.communicate() split_data = data[0].split() print(split_data) <-- #ipaddr = split_data[split_data.index('src')+1] ... ``` 打印出 `split_data` 看看 |
8
xiri 2020-04-27 13:02:47 +08:00
@Zalica 我刚刚调试了一下,你的代码在 python3 中 data = p.communicate()拿到的是 bytes 型数据,你的 split_data.index('src')中直接用字符串'src'是索引不到的,改成 split_data.index(b'src')就行了(在字符串前面加一个 b )
|
9
xiri 2020-04-27 13:05:56 +08:00
|
11
Zalica OP 感谢大家关注。根据 @xiri 的指导进行了修改,目前已经可以正常工作。修改后的代码如下:
``` #!/usr/bin/env python # modified from http://elinux.org/RPi_Email_IP_On_Boot_Debian import subprocess import smtplib import socket from email.mime.text import MIMEText import datetime import urllib.request, urllib.error, urllib.parse # Change to your own account information to = 'mailr' email_user = 'mails' email_password = 'mails passwd' smtpserver = smtplib.SMTP('mails smtp', 587) smtpserver.ehlo() smtpserver.starttls() smtpserver.ehlo smtpserver.login(email_user, email_password) today = datetime.date.today() # Very Linux Specific arg='ip route list' p=subprocess.Popen(arg,shell=True,stdout=subprocess.PIPE) data = p.communicate() split_data = data[0].split() ipaddr = split_data[split_data.index(b'src')+1] extipaddr = urllib.request.urlopen("https://extreme-ip-lookup.com/json/").read() my_ip = 'Local address: %s\nExternal address: %s' % (ipaddr, extipaddr) msg = MIMEText(my_ip) msg['Subject'] = 'IP For RaspberryPi on %s' % today.strftime('%b %d %Y') msg['From'] = email_user msg['To'] = to smtpserver.sendmail(email_user, [to], msg.as_string()) smtpserver.quit() ``` |
12
AoTmmy 2020-04-27 13:29:19 +08:00 via Android
可以试试 server 酱,可以推送到微信而且使用简单
|
13
wyfbest 2020-04-27 13:55:32 +08:00
server 酱很好用,只需要 request 一个包就可以了我 python 写过这个东西。
因为我要拿的是公网 ip 所以更简单 requests.get('https://api.ipify.org', timeout=2.0) |