背景知识视频教程
作为开发人员,配置或调试VPS通常是无法解决的,而且并不是特别有意义。 充其量,您的应用程序可能最终将以与本地环境相同的方式运行。 我们如何才能使这一不可避免的工作变得更好? 好吧,我们可以使其自动化。
设置SSH密钥
要验证SSH连接,我们需要设置一个私有RSA SSH密钥(不要与OpenSSH混淆)。我们可以使用以下命令生成密钥:
这将提示我们提供密钥名称。随心所欲命名:
Generating a public/private rsa key pair. Enter the file in which you wish to save they key (i.e., /home/username/.ssh/id_rsa): |
接下来,系统将提示您提供密码(可随时保留此空白)。
现在我们有了密钥,我们需要将此密钥复制到我们的远程主机。最简单的方法是使用ssh-copy-id:
$ ssh-copy-id -i ~/.ssh/mykey username@my_remote_host.org |
验证我们的SSH密钥
如果要检查已有的密钥,可以在系统的.ssh目录中找到这些密钥:
我们正在寻找以以下标头的键:
-----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- |
Python脚本
让我们安装我们的库。启动您喜欢的任何虚拟环境,并允许其删除:
$ pip3 install paramiko scp |
在我们编写一些有意义的Python代码之前,还有一件事情!创建一个配置文件来保存连接到主机所需的变量。这是我们进入服务器所需的准系统:
- Host:我们尝试访问的远程主机的IP地址或URL。
- Username:这是用于SSH到服务器的用户名。
- Passphrase(可选):如果在创建ssh密钥时指定了密码短语,请在此处指定。请记住,您的SSH密钥密码与您的用户密码不同。
- SSH密钥:我们之前创建的密钥的文件路径。 在OSX上,这些文件位于系统的〜/ .ssh文件夹中。 我们定位的SSH密钥必须带有一个带有.pub文件扩展名的随附密钥。 这是我们的公钥; 如果您之前已经跟随,那么应该已经为您生成了。
如果您尝试从远程主机上载或下载文件,则需要再添加两个变量:
- Remote path:我们正在寻找文件传输目标的远程目录的路径。我们可以将内容上传到该文件夹或下载其内容。
- Local path:与上述相同的想法,但是相反。为了方便起见,我们将使用的本地路径只是/ data,其中包含可爱的gif图片。
现在,我们拥有制作可观的config.py文件所需的一切
创建SSH客户端
我们将创建一个名为RemoteClient的类,以处理与远程主机的交互。 在变得太花哨之前,让我们首先使用在config.py中创建的变量实例化RemoteClient类来开始:
到目前为止,没有什么令人印象深刻的:我们只是设置了一些变量并将其传递给了无用的类。让我们在不离开构造函数的情况下提高一点:
我们在类中添加了三个要实例化的新内容:
- self.client =None:self.client最终将成为我们类中的连接对象,类似于您处理数据库库中conn之类的术语的方式。 在明确连接到远程主机之前,我们的连接将为“None”。
- self.scp = None与self.client类似,但专门处理用于传输文件的连接。
- self._upload_ssh_key()不是变量,而是在实例化客户端时自动运行的函数。调用_upload_ssh_key()告诉我们的RemoteClient对象在创建后立即检查本地ssh密钥,以便我们可以尝试将它们传递给我们的远程主机。否则,我们将根本无法建立连接。
将SSH密钥上传到远程主机
远程客户端Python代码
连接客户端
代码注解
断开连接
执行命令
代码
通过SCP上传(和下载)文件
代码
执行命令和上传代码整合
完整源代码
阅读完整文档