V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Zalica
V2EX  ›  问与答

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

  •  
  •   Zalica · 2020-04-27 12:24:15 +08:00 · 1808 次点击
    这是一个创建于 1707 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大致情况是这样的:

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

    感谢指教。

    14 条回复    2020-04-28 21:05:35 +08:00
    RickyHao
        1
    RickyHao  
       2020-04-27 12:26:59 +08:00 via Android
    推荐别开机发送 ip 了,直接路由器网页设置静态 ip 吧
    Zalica
        2
    Zalica  
    OP
       2020-04-27 12:28:38 +08:00
    @RickyHao 静态 IP 已经设置了,在自家用没问题。但是有时候我可能会把树莓派带到单位去用单位 WIFI,那种情况下设置静态 IP 好像不太可行,所以就选择了开机发送 IP 这个方案。
    另外我觉得这样比较有趣。
    yeqizhang
        3
    yeqizhang  
       2020-04-27 12:34:04 +08:00 via Android
    搞个脚本,发邮件就行,我家路由器我就搞了个 lua 脚本,开机发邮件给我。
    用来提醒家里停过电的,不然停电多久都不知道,冰箱里东西容易坏
    jasonyang9
        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`输出是啥?
    Zalica
        5
    Zalica  
    OP
       2020-04-27 12:43:10 +08:00
    @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
    ```
    Zalica
        6
    Zalica  
    OP
       2020-04-27 12:49:41 +08:00
    @yeqizhang 哦,也是一种方案。谢谢。不过我不会写脚本和代码,所以现在主要想把装个现有基本能用的东西调教清楚。
    jasonyang9
        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` 看看
    xiri
        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 )
    xiri
        9
    xiri  
       2020-04-27 13:05:56 +08:00
    Zalica
        10
    Zalica  
    OP
       2020-04-27 13:06:23 +08:00
    @xiri 按照你说的修改了一下,目前已经成功了。谢谢。
    Zalica
        11
    Zalica  
    OP
       2020-04-27 13:20:39 +08:00
    感谢大家关注。根据 @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()
    ```
    AoTmmy
        12
    AoTmmy  
       2020-04-27 13:29:19 +08:00 via Android
    可以试试 server 酱,可以推送到微信而且使用简单
    wyfbest
        13
    wyfbest  
       2020-04-27 13:55:32 +08:00
    server 酱很好用,只需要 request 一个包就可以了我 python 写过这个东西。
    因为我要拿的是公网 ip 所以更简单
    requests.get('https://api.ipify.org', timeout=2.0)
    Zalica
        14
    Zalica  
    OP
       2020-04-28 21:05:35 +08:00
    @AoTmmy @wyfbest 好的。我了解一下。谢谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2891 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 1206ms · UTC 13:40 · PVG 21:40 · LAX 05:40 · JFK 08:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.