找回密码
 会员注册
查看: 24|回复: 0

Python中的SSH、SFTP和FTP操作详解

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71616
发表于 2024-9-6 12:25:33 | 显示全部楼层 |阅读模式
大家好,在网络编程中,安全地连接到远程服务器并执行操作是一项常见任务。Python提供了多种库来实现这一目标,其中Paramiko是一个功能强大的工具,可以轻松地在Python中执行SSH、SFTP和FTP操作。本文将介绍如何使用Paramiko库来进行这些操作。一、使用Paramiko执行SSH远程命令        使用Python的Paramiko模块可以方便地执行SSH远程命令。Paramiko是一个纯Python实现的SSHv2协议,它提供了一个简单而强大的API,可以连接到远程服务器并执行命令,以及传输文件等。1、安装Paramiko模块可以使用pip命令来安装:pipinstallparamiko2、导入Paramiko模块在Python脚本中导入Paramiko模块:importparamiko3、连接到远程服务器创建一个SSHClient对象,并使用connect()方法连接到远程服务器:#创建SSHClient对象ssh_client=paramiko.SSHClient()#添加远程服务器的主机密钥(如果首次连接,需要添加)ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接到远程服务器ssh_client.connect(hostname='your_remote_server',port=22,username='your_username',password='your_password')4、执行远程命令使用exec_command()方法执行远程命令:#执行远程命令stdin,stdout,stderr=ssh_client.exec_command('ls-l')#读取命令执行结果output=stdout.read().decode('utf-8')error=stderr.read().decode('utf-8')#打印执行结果或错误信息print("CommandOutput:",output)print("CommandError:",error)5、关闭SSH连接执行完远程命令后,记得关闭SSH连接:#关闭SSH连接ssh_client.close()6、示例下面是一个完整的示例,演示了如何使用Paramiko执行SSH远程命令:importparamiko#远程服务器的信息hostname='your-remote-server'port=22username='your-username'password='your-password'#创建SSHClient对象ssh_client=paramiko.SSHClient()try:#添加远程服务器的主机密钥(如果首次连接,需要添加)ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接到远程服务器ssh_client.connect(hostname,port,username,password)#执行远程命令command='ls-l'stdin,stdout,stderr=ssh_client.exec_command(command)#获取命令执行结果output=stdout.read().decode('utf-8')error=stderr.read().decode('utf-8')ifoutput:print("命令执行结果:")print(output)else:print("错误信息:")print(error)finally:#关闭SSH连接ssh_client.close()二、使用Paramiko的SFTP        aramiko的SFTP(SSH文件传输协议)功能使得在Python中进行安全文件传输变得非常简单。通过SFTP,你可以连接到远程服务器,上传文件、下载文件、创建目录、删除文件等。1、导入Paramiko模块首先,在Python脚本中导入Paramiko模块:importparamiko2、连接到远程服务器创建一个SSHClient对象,并使用connect()方法连接到远程服务器:#创建SSHClient对象ssh_client=paramiko.SSHClient()#添加远程服务器的主机密钥(如果首次连接,需要添加)ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接到远程服务器ssh_client.connect(hostname='your_remote_server',port=22,username='your_username',password='your_password')3、创建SFTP客户端通过SSHClient的open_sftp()方法创建SFTP客户端:#创建SFTP客户端sftp_client=ssh_client.open_sftp()4、执行SFTP操作现在,可以使用SFTP客户端执行各种操作,比如上传文件、下载文件、创建目录、删除文件等。以下是一些常见操作的示例:上传文件使用put()方法上传本地文件到远程服务器:local_file='/path/to/local/file.txt'remote_file='/path/to/remote/file.txt'sftp_client.put(local_file,remote_file)下载文件使用get()方法从远程服务器下载文件到本地:remote_file='/path/to/remote/file.txt'local_file='/path/to/local/file.txt'sftp_client.get(remote_file,local_file)创建目录使用mkdir()方法在远程服务器上创建目录:remote_dir='/path/to/remote/directory'sftp_client.mkdir(remote_dir)删除文件使用remove()方法删除远程服务器上的文件:remote_file='/path/to/remote/file.txt'sftp_client.remove(remote_file)5、关闭SFTP连接执行完SFTP操作后,记得关闭SFTP连接:#关闭SFTP连接sftp_client.close() 6、关闭SSH连接最后,关闭SSH连接:#关闭SSH连接ssh_client.close()7、示例以下是一个完整的示例,演示了如何使用Paramiko进行SFTP文件传输:importparamiko#远程服务器的信息hostname='your-remote-server'port=22username='your-username'password='your-password'#远程文件和本地文件的路径remote_file_path='/path/to/remote/file.txt'local_file_path='/path/to/local/file.txt'#创建SSHClient对象ssh_client=paramiko.SSHClient()try:#添加远程服务器的主机密钥(如果首次连接,需要添加)ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接到远程服务器ssh_client.connect(hostname,port,username,password)#创建SFTP客户端sftp_client=ssh_client.open_sftp()#上传文件到远程服务器sftp_client.put(local_file_path,remote_file_path)print("文件成功上传到远程服务器")#下载文件到本地sftp_client.get(remote_file_path,local_file_path)print("文件成功从远程服务器下载到本地")finally:#关闭SFTP连接sftp_client.close()#关闭SSH连接ssh_client.close()三、Paramiko远程命令与文件的函数封装#-*-coding:utf-8-*-importparamikoimportthreadingimportloggingasloggerlogger.basicConfig(level=logger.INFO)defremote_command(host_ip,host_port,username,password,command):"""远程执行Linux命令:paramhost_ip:主机IP地址:typehost_ip:str:paramhost_port:主机SSH端口号:typehost_port:int:paramusername:SSH用户名:typeusername:str:parampassword:SSH密码:typepassword:str:paramcommand:要执行的命令:typecommand:str"""client=Nonetry:#创建SSH客户端client=paramiko.SSHClient()#第一次SSH远程连接时会提示输入yes或者noclient.set_missing_host_key_policy(paramiko.AutoAddPolicy())client.connect(host_ip,host_port,username=username,password=password,timeout=10)logger.info(f"开始在远程服务器{host_ip}上执行命令:{command}")#执行命令stdin,stdout,stderr=client.exec_command(command,get_pty=True)#获取命令执行结果,返回的数据是一个字符串result=stdout.read().decode('utf-8')logger.info(f"{host_ip}执行结果:{result}")error=stderr.read().decode('utf-8')iferror!="":logger.info(f"{host_ip}错误信息:{error}")else:passexceptExceptionase:logger.error(e)finally:client.close()defbatch_remote_command(host_list,host_port,username,password,command):"""批量远程执行Linux命令:paramhost_list:主机IP地址列表:typehost_list:list:paramhost_port:主机SSH端口号:typehost_port:int:paramusername:SSH用户名:typeusername:str:parampassword:SSH密码:typepassword:str:paramcommand:要执行的命令:typecommand:str"""thread_list=[]foripinhost_list:thread=threading.Thread(target=remote_command,args=(ip,host_port,username,password,command))#将生成的线程添加到列表中thread_list.append(thread)fortinthread_list:#开始执行线程t.start()fortinthread_list:#挂起线程,等待所有线程结束t.join()defupload_file_to_remote_server(host,port,username,password,local_path,remote_path):"""上传文件从本地到远程服务器Args:host(str):远程服务器的IP地址或主机名port(int):远程服务器的端口username(str):远程服务器的用户名password(str):远程服务器的密码local_path(str):本地文件路径,要上传的文件remote_path(str):远程文件路径,上传的目标位置"""#连接远程服务器ssh=paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostname=host,port=port,username=username,password=password)#打开SFTP客户端sftp=ssh.open_sftp()#上传本地文件至远程服务器sftp.put(local_path,remote_path)#关闭SFTP客户端和SSH连接sftp.close()ssh.close()defdownload_file_from_remote_server(host,port,username,password,remote_path,local_path):"""从远程服务器下载文件到本地Args:host(str):远程服务器的IP地址或主机名port(int):远程服务器的端口username(str):远程服务器的用户名password(str):远程服务器的密码remote_path(str):远程文件路径,要下载的文件local_path(str):本地文件路径,下载的目标位置"""#连接远程服务器ssh=paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostname=host,port=port,username=username,password=password)#打开SFTP客户端sftp=ssh.open_sftp()#下载远程服务器文件至本地sftp.get(remote_path,local_path)#关闭SFTP客户端和SSH连接sftp.close()ssh.close()四、使用 ftplib访问FTP服务  ftplib是Python标准库中的一个模块,用于实现FTP(文件传输协议)客户端。通过ftplib模块,你可以编写Python程序来连接到FTP服务器,上传文件、下载文件、列出目录等。1、连接到FTP服务器        要连接到FTP服务器,首先需要导入ftplib模块,然后使用FTP类创建一个FTP对象,并通过connect(host,port)方法连接到服务器。fromftplibimportFTPftp=FTP()ftp.connect('ftp.example.com',21)2、登录到FTP服务器        成功连接到FTP服务器后,需要登录以进行后续操作。可以使用login(user,passwd)方法登录到服务器。ftp.login('username','password')3、获取目录列表可以使用nlst()方法获取当前目录的文件列表。file_list=ftp.nlst()print(file_list)4、切换目录可以使用cwd(path)方法切换到指定的目录。ftp.cwd('/path/to/directory')5、下载文件要从服务器下载文件,可以使用retrbinary(command,callback,blocksize,rest)方法。local_filename='file_to_download.txt'withopen(local_filename,'wb')asfile:ftp.retrbinary('RETRfile_to_download.txt',file.write)6、上传文件要将文件上传到服务器,可以使用storbinary(command,file,blocksize,callback,rest)方法。local_filename='file_to_upload.txt'withopen(local_filename,'rb')asfile:ftp.storbinary('STORfile_to_upload.txt',file)7、删除文件可以使用delete(filename)方法从服务器上删除文件。ftp.delete('file_to_delete.txt')8、断开连接完成所有操作后,记得断开与服务器的连接。ftp.quit()9、示例以下是一个完整的示例,演示了如何使用Python的ftplib模块访问FTP服务:fromftplibimportFTP#FTP服务器的地址和端口ftp_host='ftp.example.com'ftp_port=21#FTP服务器的用户名和密码ftp_username='your-username'ftp_password='your-password'#连接到FTP服务器ftp=FTP()ftp.connect(ftp_host,ftp_port)#登录到FTP服务器ftp.login(ftp_username,ftp_password)#列出当前目录的文件列表file_list=ftp.nlst()print("当前目录的文件列表:",file_list)#切换到指定目录ftp.cwd('/path/to/directory')#上传文件到服务器local_filename='file_to_upload.txt'remote_filename='uploaded_file.txt'withopen(local_filename,'rb')asfile:ftp.storbinary('STOR'+remote_filename,file)print("文件成功上传到服务器")#下载文件到本地local_filename='downloaded_file.txt'remote_filename='file_to_download.txt'withopen(local_filename,'wb')asfile:ftp.retrbinary('RETR'+remote_filename,file.write)print("文件成功从服务器下载到本地")#删除服务器上的文件ftp.delete(remote_filename)print("文件成功从服务器删除")#断开与FTP服务器的连接ftp.quit()print("FTP连接已断开")        以上是对ftplib模块的介绍。使用这个模块,可以轻松地编写Python脚本来管理FTP服务器上的文件。请注意,在使用ftplib模块时要小心处理敏感信息(如用户名和密码),以确保安全性。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 05:12 , Processed in 0.456879 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表