python连接linux服务器:利用paramiko实现执行命令、上传文件和下载文件

Paramiko是基于SSHv2协议、用来连接和操作linux服务器的Python库,利用它可以在服务器中执行命令和传输文件。和传统的putty和ftp工具相比,Paramiko对服务器没有配置要求、且可以在代码层面实现以上操作。

1 paramiko的安装

一些比较旧的攻略提到paramiko需要依赖PyCrypto和GCC库,不过新版本已经解决的这些问题,我们可以直接利用pip安装:

pip install paramiko

2 paramiko的连接

paramiko连接服务器有两种方法,paramiko.SSHClient()的方法用于执行命令,paramiko.Transport()的方法用于文件传输。注意端口的数据类型要求是int。
1、利用paramiko.SSHClient()连接linux服务器:

import paramiko
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("192.168.1.1",22,"username","password")

2、利用paramiko.Transport()连接linux服务器:

import paramiko
t=paramiko.Transport(("192.168.1.1",22))
t.connect(username="username",password="password")

如果服务器需要提供秘钥,则在connect时追加“hostkey”参数:

import paramiko
t=paramiko.Transport(("192.168.1.1",22))
t.connect(username="username",password="password",hostkey="hostkey")

3 paramiko执行命令

我们可以使用paramiko远程连接服务器并执行任意命令,然后通过print的方式得到运行结果。从以下结果可以看出,paramiko不会再执行命令后直接获取执行结果,而是返回几个Channel,需要借助stdout.readlines()。同时,执行命令出错也不会抛出异常,同样需要借助stderr.readlines()来进行分析处理。

import paramiko
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("192.168.1.1",22,"username","password")
for i in ssh.exec_command("ls /home"):
    print(i)
stdin,stdout,stderr=ssh.exec_command("ls /home")
print(stdout.readlines())
print(stderr.readlines())

python连接linux服务器:利用paramiko实现执行命令、上传文件和下载文件_第1张图片

4 paramiko传输文件

从windows端下载和上传文件到服务器,可以使用以下代码。需要注意两点:第一是两个path都要包含路径和文件名;第二是不同终端的路径连接符不同(windows和unix),在python中最好使用os.path.join来构建文件路径。另,如果确定路径没有问题且遇到“OSError:[Errno 13]Permission denied”报错时,还要确定一下对服务器端的文件夹是否有写权限。

import paramiko
import os as os
t=paramiko.Transport(("192.168.1.1",22))
t.connect(username ="username ", password ="password ")
sftp=paramiko.SFTPClient.from_transport(t)

# linux下载到window
path_remote_down="/home/apple/data_download.csv"
path_local_down=os.path.join(os.path.abspath("."),"data_download.csv")
sftp.get(path_remote_down,path_local_down)

# window上传到linux
path_local_up=os.path.join(os.path.abspath("."),"data_upload.csv")
path_remote_up="/home/apple/data_upload.csv"
sftp.put(path_local_up,path_remote_up)

你可能感兴趣的:(python)