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()