本篇文章简述SSHclient对象的常用方法,并提供一个简单用例
connect()
连接到ssh服务器上去并且进行认证,并且会根据主机的秘钥检查服务器的主机秘钥,如果服务器主机的hostname没有在system host keys和local host keys中找到,将会使用缺少主机秘钥的策略,默认的策略是拒绝秘钥并且引发SSHException.
这里如果大家没有用本地的终端通过ssh访问过远程服务器的话,在.ssh文件里的host_key文件是不会保存服务器的秘钥的。就会引发SSHException。
下面介绍几个常用的参数
参数 | 解释 |
hostname(str) | 需要连接的主机 |
port(int) | 端口号,默认22 |
username(str) | 需要登录的用户名 |
password(str) | 密码 |
passphrase(str) | 解码私钥 |
pkey(PKey) | 可选用于认证的私钥 |
key_filename(str) | 尝试进行身份验证的可选私钥和或证书的文件名或文件名列表 |
timeout(float): TCP连接的可选超时(以秒为单位)
allow_agent(bool) | 默认为True,设置为False以禁用连接到SSH代理
look_for_keys(bool): 默认为True,设置为False可禁用在〜/.ssh /中搜索可发现的私钥文件
该方法将会抛出的异常:
BadHostKeyException: 如果无法验证服务器的主机秘钥
AuthenticationException: 如果用户认证失败
SSHException: 在SSH会话建立的过程中出现错误
exec_command()
在SSH服务器上执行命令。一个新的Channel将会打开,并执行所请求的命令。命令的输入和输出流作为代表stdin,stdout,stderr。
参数 | 解释 |
command(str) | 执行的命令 |
bufsize(int) | 解释方式与Python中的内置file()函数相同 |
timeout(int) | 设置命令的channel超时 |
get_pty(bool) | 向服务器请求伪终端(默认为false) |
return
返回命令执行后的stdin,stdout,stderr(3-tuple)
raise
抛出SSHException,如果服务端没有正常执行命令
close()
关闭SSHClient和底层的Transport
get_host_keys()
获取到HostKeys对象,可用于检查或更改本地主机密钥。
get_transport()
返回基础Transport对象,可用于执行更底层的任务,例如打开特定种类的channels
load_host_keys(filename)
加载本地的主机密钥文件,可以多次调用此方法。 每个新的主机密钥集将与现有的密钥集合并(如果存在冲突,则用新的旧密钥合并)。 自动保存时,将使用最后一个主机名。
load_system_host_keys(filename=None)
加载系统的主机密钥文件。如果filename保留为None,将尝试从用户的本地“已知主机”文件中读取密钥(由OpenSSH使用),并且如果无法读取该文件,则不会引发异常。这可能仅在posix上有用。
最后发一个简单的用例
from paramiko import SSHClient client = SSHClient() client.load_system_host_keys() client.connect(hostname = "your ip", username= "your username", password = "your password") stdin,stdout,stderr = client.exec_command("pwd") print(stdout.read().decode("utf-8")) client.close()