SSHClient
- 常用于执行命令
参数
- 针对位置主机的策略有三种
- AutoAddPolicy 自动添加未知 key 到 known_hosts
- WarningPolicy 也会添加, 但会提示信息
- RejectPolicy[default] 拒绝连接未知主机
- connect() 常用参数
- base
- hostname 主机 IP
- port 主机 ssh 端口
- 认证相关
- username 登录用户
- password 登录密码
- pkey 私钥对象(需要提前创建)
- 超时相关
- timeout 建立 tcp 连接的超时时间
- auth_timout 账号认证的超时时间
- banner_timeout ** 没查到 **
- 其他
- key_filename key 文件或 key 文件目录, ** 用法没查到 **
- allow_agent 是否允许连接到ssh代理, 默认为 True
- look_for_keys 是否在~/.ssh中搜索私钥文件,默认为 True
- compress 是否打开压缩, 默认为 False
- 读取结果方式
- 按照文件读取
- for i in stdout 逐行读
- stdout.read() 读全文
- stdout.readlines() 读全文, 拿到一个列表
- tips:按行使用 strip() 去除前后空格
示例
import paramiko
# 1. 创建对象
c = paramiko.SSHClient()
# 2. 为连接未知主机设置策略
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 3. 连接(2选1)
# 3.1 连接SSH服务端,以用户名和密码进行认证
c.connect(hostname="192.168.248.80", port=22, username="root", password="xxx", auth_timeout=3, timeout=3)
# 3.2 用秘钥连接
# 提前创建 key
private = paramiko.RSAKey.from_private_key_file("/Users/yangkaiyue/.ssh/id_rsa")
c.connect(hostname="192.168.248.80", port=22, username="root", pkey=private, auth_timeout=3, timeout=3)
# 4. 执行命令, 可设置超时时间
stdin, stdout, stderr = c.exec_command("ls -l /thc-ssd/apps/docker/overlay2", timeout=3)
# 5. 处理返回
# 5.1 获取状态码, 为 0 则表示正常
status_code = stdout.channel.recv_exit_status()
print(status_code)
# 5.2 拿到结果
for i in stdout:
print(i.strip())
# 6. 关闭连接
c.close()
补充
exec_command 执行 cd 命令无效果
- 执行 cd 命令无效, 执行后 pwd 还是会显示 /root
- 这样执行有效: c.exec_command(“cd /xx/xx;pwd”)
- 原因: exec_command为单个会话,执行完成之后会回到登录时的缺省目录
transport - sftpClient
- 常用于远程进行文件操作
方法
- put(localpath, remotepath, callback=None, confirm=True)
- 将本地文件上传到服务器
- contirm 是否调用stat()方法检查文件状态,返回ls -l的结果
- get(remotepath, localpath, callback=None)
- 从服务器下载文件到本地
- mkdir(path, mode)
- 创建目录, 目录名, 权限
- remove(path)
- 删除目录
- rename(oldname, newname)
- 重命名目录
- stat()
- 查看状态, 返回一个 sftpClient 的对象
- listdir(path)
- 列出服务器目录下的文件, 返回 list
示例
import paramiko
# 1 创建 transport 对象
tran = paramiko.Transport(("192.168.248.80", 22))
# 2. transport 连接(2选1)
# 2.1 账号密码连接
transport.connect(username="root", password="xxx")
# 2.2 key 连接
private = paramiko.RSAKey.from_private_key_file("/xx/xx/.ssh/id_rsa")
transport.connect(username="root", pkey=private)
# 3. 创建 sftpclient
sftp = paramiko.SFTPClient.from_transport(tran)
transport - sshClient
- transport 也支持执行命令
- transport 不需要设置未知主机策略
import paramiko
# 1 创建对象
# 1.1 创建 sshclient 对象
c = paramiko.SSHClient()
# 1.2 创建 transport 对象
transport = paramiko.Transport(("192.168.248.80", 22))
# 2. transport 连接(2选1)
# 2.1 账号密码连接
transport.connect(username="root", password="xxx")
# 2.2 key 连接
private = paramiko.RSAKey.from_private_key_file("/xx/xx/.ssh/id_rsa")
transport.connect(username="root", pkey=private)
# 3. 关联, sshclient 使用 transport 连接
c._transport = transport
# 4. 执行命令
_, stdout, _ = c.exec_command("ls -l /xx-xx/xxx/xx/xx")
# 5. 输出结果
for i in stdout:
print(i.strip())
# 6. 关闭连接
transport.close()
c.close()