使用Python在树莓派上进行SSH/SCP(或类似操作)
我想用Python从我的Windows电脑通过Cygwin复制一个文件到我的树莓派上。我知道可以用像FileZilla这样的程序,但我的项目需要通过编程的方式来完成这个操作。
我知道有一些模块可以让我在Python中使用SSH,但我对树莓派和Python都很陌生,安装命令行模块时遇到了一些问题。有没有人愿意给我一些关于如何安装正确模块的指导,比如paramiko或者类似的模块,让它能在我的树莓派上运行?
如果能给我一些示例代码,让我能快速上手,那就太好了。不过我知道网上有其他相关的讨论,所以如果你不想浪费时间在这方面也没关系,除非你愿意。提前谢谢你的帮助。
2 个回答
如果你的运行环境里安装了scp,你可以直接在Python中运行scp命令,这样做比较简单。不过,scp每次都会要求你输入密码,所以我推荐下面这种方法:
1) 在你的运行机器上生成一个RSA密钥对:在bash中运行这个命令并按照提示操作,你可以选择是否使用密码短语:
ssh-keygen
现在你会在你存放密钥的地方得到一个.pub文件。把这个.pub文件的内容添加到你的树莓派上的以下文件中:
~/.ssh/authorized_keys
当然,如果.ssh文件夹和这个文件不存在,你需要先创建它们。如果authorized_keys文件已经存在,就在文件末尾添加.pub文件的内容,记得在新的一行开始,这样就不会覆盖原来的内容。一旦完成,你的树莓派就会信任你的电脑,连接时就不会再要求输入密码了(所以要保密哦!)。如果你更喜欢每次运行脚本时都输入密码,那就不要把这个密钥添加到authorized_keys里。
现在在你的Python脚本中:
import os
cmd = os.popen('scp <USER>@<YOUR_MACHINE_ADDRESS>:<LOCATION_OF_THE_REMOTE_FILE> <LOCATION_TO_STORE_IT>')
cmd.read()
这样就可以从你的树莓派复制文件到你的电脑,如果你想反过来做,只需交换scp的两个参数。
当然,你可以根据需要在命令周围创建逻辑结构,以决定给它哪些参数以及在什么情况下执行它。要知道,使用os.popen()
时,程序会一直等待,直到命令执行完毕,而且命令不会执行,直到调用cmd.read()
。
如果你不喜欢这种方法,可以看看这里以及这个问题中提供的链接。
你可以考虑使用 ftplib
这个库,它是 Python 的一个库。这样你就可以通过像 Filezilla 这样的图形界面客户端来复制文件,也可以通过编程的方式来实现。
from ftplib import FTP
在树莓派那边,你需要启动一个 FTP 服务器(比如 ftpd
、vsftpd
等等),在 Debian 系统上有很多这样的选择。在客户端,你可以使用图形界面的客户端,或者自己写一个程序,比如用 Python!
如果你需要一个加密的解决方案,可以在 FTP 上使用 TLS 或 SSL。