跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 文科生玩树莓派直接卡壳。请教关于开机发送 IP 的相关问题。
未分類
2 5 月 2020

文科生玩树莓派直接卡壳。请教关于开机发送 IP 的相关问题。

文科生玩树莓派直接卡壳。请教关于开机发送 IP 的相关问题。

資深大佬 : Zalica 21

大致情况是这样的:

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: %snExternal 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 种子这种情况能满足就够了。

感谢指教。

大佬有話說 (14)

  • 資深大佬 : RickyHao

    推荐别开机发送 ip 了,直接路由器网页设置静态 ip 吧

  • 主 資深大佬 : Zalica

    @RickyHao 静态 IP 已经设置了,在自家用没问题。但是有时候我可能会把树莓派带到单位去用单位 WIFI,那种情况下设置静态 IP 好像不太可行,所以就选择了开机发送 IP 这个方案。
    另外我觉得这样比较有趣。

  • 資深大佬 : yeqizhang

    搞个脚本,发邮件就行,我家路由器我就搞了个 lua 脚本,开机发邮件给我。
    用来提醒家里停过电的,不然停电多久都不知道,冰箱里东西容易坏

  • 資深大佬 : jasonyang9

    “`
    …
    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`输出是啥?

  • 主 資深大佬 : Zalica

    @jasonyang9 有。运行结果如下
    “`
    [[email protected] ~]$ 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
    “`

  • 主 資深大佬 : Zalica

    @yeqizhang 哦,也是一种方案。谢谢。不过我不会写脚本和代码,所以现在主要想把装个现有基本能用的东西调教清楚。

  • 資深大佬 : jasonyang9

    “`
    …
    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` 看看

  • 資深大佬 : xiri

    @Zalica 我刚刚调试了一下,你的代码在 python3 中 data = p.communicate()拿到的是 bytes 型数据,你的 split_data.index(‘src’)中直接用字符串’src’是索引不到的,改成 split_data.index(b’src’)就行了(在字符串前面加一个 b )

  • 資深大佬 : xiri

    @xiri https://img.xirikm.net/images/WCm9.png

  • 主 資深大佬 : Zalica

    @xiri 按照你说的修改了一下,目前已经成功了。谢谢。

  • 主 資深大佬 : Zalica

    感谢大家关注。根据 @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: %snExternal 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()
    “`

  • 資深大佬 : AoTmmy

    可以试试 server 酱,可以推送到微信而且使用简单

  • 資深大佬 : wyfbest

    server 酱很好用,只需要 request 一个包就可以了我 python 写过这个东西。
    因为我要拿的是公网 ip 所以更简单
    requests.get(‘https://api.ipify.org’, timeout=2.0)

  • 主 資深大佬 : Zalica

    @AoTmmy @wyfbest 好的。我了解一下。谢谢。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具