在做自动化操作的时候,经常会先要到机器里面看一些设备信息,运行脚本等,这时候ssh远程登陆工具的好处就可想而知,paramiko库提供了,ssh远程登陆接口,不仅可以执行shell命令,而且可以上传下载文件等。


由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto

使用linux登录别的ssh

ssh root@192.168.0.9

指定端口

ssh root@192.168.0.9 -p 2222

1.登陆执行shell命令

直接查看例子:

创建实例,使用connect连接,使用exec_command执行命令,使用stdout.read读取返回的结果。

import paramiko


if __name__ == '__main__':
# 实例化SSHClient
client = paramiko.SSHClient()

# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:
client.connect(hostname="192.168.62.128", port=22, username="python", password="admin")
except Exception as e:
print("---异常---:", e)

if client:
# 打开一个Channel并执行命令
command = "ps -aux | grep test"
stdin, stdout, stderr = client.exec_command(command) # stdout 为正确输出,stderr为错误输出,同时是有1个变量有值

# 打印执行结果
command_result = stdout.read().decode('utf-8')
print("1111", command_result)

# 关闭SSHClient
client.close()

2.上传、下载文件

ubuntu上面安装ftp服务器作为ftp测试服务器

1.安装
sudo apt-get install vsftpd

2.配置

sudo vim /etc/vsftpd.conf

打开写

write_enable=YES

最后加上ftp服务器的位置

# 配置ftp服务器的上传下载文件所在的目录。
local_root=/home/python/ftpfile

创建ftpfile文件夹,并且创建一个get_file文件

3.重启
sudo service vsftpd restart

4.测试

python本地放一个put_file文件,用来上传到服务器。

ubuntu服务器放一个get_file文件,用来下载到本地。

代码如下:

import paramiko


if __name__ == '__main__':
# 获取Transport实例
tran = paramiko.Transport(('192.168.62.128', 22))

# 连接SSH服务端,使用password
tran.connect(username="python", password='123456')

# 获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)

# 执行上传动作
sftp.put("./put_file", "/home/python/ftpfile/put_file")

# 执行下载动作
sftp.get("/home/python/ftpfile/get_file", "./get_file")

tran.close()


可以看到服务器多了一个put_file文件,本地多了一个get_file文件

3.扩展:http文件服务器

正常情况我们一般用文件服务器进行下载文件,不会使用ftp的方式下载,

ubuntu里面安装apache

sudo apt-get install apache2

配置文件在​​/etc/apache2/apache2.conf​​​里面,如果有修改的话,使用​​service apache2 restart​​进行重启。

将文件放在​​/var/www/html​​​下面,或者做一个软连接​​ln -s /home/nn/package/ file在/var/www/html/​

python使用wget下载

import wget

url = 'http://192.168.62.128/test'
filename = wget.download(url)