国外课栈 - 跨学科知识视角栈

Python版SSH远程服务器使用Paramiko和scp库

 二维码 50
文章附图

背景知识视频教程

作为开发人员,配置或调试VPS通常是无法解决的,而且并不是特别有意义。 充其量,您的应用程序可能最终将以与本地环境相同的方式运行。 我们如何才能使这一不可避免的工作变得更好? 好吧,我们可以使其自动化。

设置SSH密钥

要验证SSH连接,我们需要设置一个私有RSA SSH密钥(不要与OpenSSH混淆)。我们可以使用以下命令生成密钥:

$ ssh-keygen -t rsa

这将提示我们提供密钥名称。随心所欲命名:

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目录中找到这些密钥:

$ cd ~/.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上传(和下载)文件

代码

执行命令和上传代码整合

完整源代码

阅读完整文档

文章分类: 编程技艺PythonSSH