一、SSHClient入门
SSHClient是一个Python第三方库,可以用来通过SSH协议连接远程服务器,实现远程操作。在使用SSHClient之前,需要先安装paramiko库,使用pip install paramiko进行安装。
通过SSHClient对象可以完成各种远程功能,例如执行命令,上传文件,下载文件等等。连接远程服务器的方法如下所示,其中hostname为服务器地址,username为你的用户名,password为你的密码。
import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname='myserver.com', username='myusername', password='mypassword')
其中set_missing_host_key_policy方法是为了自动添加新的主机密钥(policy)。如果不添加这行代码, 当新的主机出现时, python会抛出警告信息, 需要用户手动添加该主机的密钥。
二、远程命令执行
一个典型的远程服务器管理任务就是执行远程命令。在SSHClient中,可以使用execute方法来实现。例如,要在远程服务器中执行ls命令,可以通过以下命令来完成:
stdin, stdout, stderr = client.exec_command('ls') print(stdout.read())
其中exec_command的参数为要执行的命令。stdout.read()是读取命令执行结果的方法。类似地, 命令执行的结果也可以写入文件,例如:
stdin, stdout, stderr = client.exec_command('ls > dirlist.txt')
以上命令会把ls命令的结果写入到远程服务器上的dirlist.txt文件中。
三、文件上传和下载
SSHClient也可以用于上传和下载文件。
上传文件:
sftp = client.open_sftp() sftp.put(localFilePath, remoteFilePath)
其中,localFilePath为本地文件路径,remoteFilePath为远程文件路径。例如,上传本地/home/user/Desktop/localfile.txt到远程服务器上的/home/user/server/remote.txt,可以使用以下语句:
sftp.put('/home/user/Desktop/localfile.txt', '/home/user/server/remote.txt')
下载文件:
sftp = client.open_sftp() sftp.get(remoteFilePath, localFilePath)
其中remoteFilePath表示远程主机上的文件路径,localFilePath表示本地要下载到的文件路径。
四、连接池的使用
在高并发的情况下,单独使用SSHClient可能会存在一些问题。为了解决这个问题,可以定义一个连接池来管理连接。
使用连接池可以有效的降低创建和销毁连接的成本。Python的paramiko库提供了对连接池的支持,操作方法与Python内置的线程池非常相似。下面是一个简单的例子:
from paramiko import SSHClient, AutoAddPolicy from paramiko.pool import ConnectionPool pool = ConnectionPool(10, 30, SSHClient, AutoAddPolicy(), username='myusername', password='mypassword', hostname='myserver.com') conn = pool.acquire() stdin, stdout, stderr = conn.exec_command('ls') pool.release(conn)
其中ConnectionPool()的第一个参数是连接池中连接的最小数量,第二个参数是连接池中连接的最大数量。
五、异常处理和调试
SSHClient连接远程服务器时可能会出现各种错误,例如连接拒绝,认证失败等等。正确的错误处理方式会让你更快地找到问题所在。在SSHClient中,错误往往以SSHException的形式抛出,因此,我们可以使用try和except语句来捕获并显示错误。
import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: client.connect(hostname='myserver.com', username='myusername', password='mypassword') except paramiko.AuthenticationException as e: print("认证失败") except paramiko.SSHException as e: print("SSH连接错误:", str(e)) except Exception as e: print("连接错误:", str(e)) else: stdin, stdout, stderr = client.exec_command('ls') print(stdout.read()) finally: client.close()
此外,在进行SSHClient编程时,可以考虑开启调试模式,以方便排查问题。启用调试模式方法如下:
import paramiko paramiko.util.log_to_file('paramiko.log') client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(hostname='myserver.com', username='myusername', password='mypassword')
以上代码会把paramiko的日志打印到paramiko.log文件中,方便调试时查看。