最近一直在折腾电视盒子,尝试把电视盒子刷成一个linux小系统,小米3c是博主用得最多的设备,刷了 7ji 大佬的coreelec 1.4 版本,虽然3c性能有限,但胜在运行稳定,外形也美观大方,主要是博主自打买回来一直没用,看着真跟新的没差。
所以当新购的阿里云服务器遇到了ip问题,无法直接从某些外部服务器直接获取数据的时候,第一时间考虑的就是利用3c作为一个跳板,下载需要的数据到本地,然后通过ssh定时上传到阿里云。因为coreelec的python库不是特别全,尝试带密码连接服务器总是出错,一时半会博主也搞不太清楚coreelec系统下python完善库的方式,所以最终选择了使用密钥连接服务器。
在coreelec上生成密钥
首先在coreelec上生成密钥,利用cat命令输出公钥后,复制并粘贴到服务器(博主这里是阿里云服务器)的~/.ssh/authorized_keys 文件内:
ssh-keygen -t rsa -f /storage/.ssh/id_rsa -N ""
cat /storage/.ssh/id_rsa.pub
# 复制输出内容到服务器的 ~/.ssh/authorized_keyspython脚本
出问题的是小鸟数据的nhk音频页面,原有的逻辑是直接从服务器读取外部xml文件,解析成json文件,然后由php组装成页面,现在因为ip问题,只能由小米盒子3c代劳,然后上传到服务器了。以下是python版本的下载与上传程序,python版本为2.7:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2
import subprocess
import os
def download_and_upload():
xml_url = 'https://www.nhk.or.jp/s-media/news/podcast/list/v1/all.xml'
local_file = '/tmp/nhk_radio.xml'
#server info
remote_user: 'your_username', # 修改为你的用户名
remote_host: 'your_server.com', # 修改为你的服务器
remote_path: '/path/to/nhk_radio.xml' # 修改为服务器路径
try:
#dwonload
print("downloading...")
response = urllib2.urlopen(xml_url, timeout=30)
with open(local_file, 'w') as f:
f.write(response.read())
print("download complete...")
#update
remote_target = '{}@{}:{}'.format(remote_user, remote_host, remote_path)
scp_command = 'scp {} {}'.format(local_file, remote_target)
print("updating...")
result = subprocess.call(scp_command, shell=True)
# 清理临时文件
if os.path.exists(local_file):
os.remove(local_file)
if result == 0:
print("文件上传成功!")
return True
else:
print("上传失败! 请检查SSH密钥设置")
return False
except Exception as e:
print("错误: {}".format(str(e)))
return False
if __name__ == "__main__":
download_and_upload()coreelec 定时任务
编辑定时任务:
# 编辑crontab
crontab -e博主准备一小时更新一次,所以在定时任务里添加如下内容:
0 * * * * /usr/bin/python /storage/webdata/getNhkRadio.py >> /storage/logs/nhk_radio.log 2>&1如果有不同的间隔需求,可以百度搜索或者deepseek询问一下AI。需要注意的是,这里如果选择生成日志,请确保路径与日志文件的正确性,如果路径不存在或不正确,会导致定时任务无法正常运行。
公钥与私钥
因为全程只粘贴了一次公钥,在python代码中并没有涉及到配对的语句,所以查找了一下私钥的用处,私钥保存在本地,被命名为指定文件名,ssh客户端会自动去查找匹配,所以不需要在代码中涉及,还真是蛮方便的。
关于私钥
- SSH客户端自动查找:当你运行 scp 或 ssh 命令时,系统会自动在 ~/.ssh/ 目录下查找可用的私钥;
- 按顺序尝试:SSH会按 id_rsa, id_ecdsa, id_ed25519, id_dsa 的顺序尝试私钥;
- 无需代码干预:这个过程在SSH客户端内部完成,不需要在Python代码中指定。

