fabric2 是一个python(2.7,3.4+)的库,用来通过SSH远程执行shell命令,并返回有用的python对象。
它建立在 invoke 和 paramiko 库之上,同时扩展了他们的API以提供更多的功能。
https://www.fabfile.org/
1.安装
pip uninstall fabric
pip uninstall fabric3
pip install fabric2
2.Connection类
实现对单个主机的SSh连接,返回一个该主机的连接对象。通过该对象,对主机进行操作和管理。
类的属性:
host:主机名或IP地址,可用格式:user@host, host:port, user@host:port
user:登录用户名
port:(int)登录端口
config:登录配置文件
gateway:连接的网关或代理
forword_agent:(bool)是否开启agent_forwording
connect_timeout:(int)连接超时时间
connect_kwargs:(dict)提交连接参数的字典,多用于密码,密钥等。
inline_ssh_env:(bool)略
类的方法:
run:执行命令,返回结果的属性有 stdout,exited,ok,command,connection 等
get:从远程下载文件
put:上传文件,put(src_path, remote= dst_path)
sudo:sudo远程执行命令
sftp:返回一个sftp对象
local:在本地执行shell命令
is_connected:此链接是否打开
open
open_gateway
close
create_session
forward_local
forward_remote
例子
from fabric import Connection
ssh_conn = Connection(host='xxx.xxx.xxx.xxx', user='root', connect_kwargs={'password': '***'})
3.Group类
连接多个服务器,组成一个group,一个group同时执行run命令时,会返回一个 GroupResult-dict,包含了每个服务器的运行结果。
例子:
from fabric import SerialGroup as Group
hosts = (
"[email protected]:22", "[email protected]:22"
)
pool = Group(*hosts,connect_kwargs={"password": "123"})
results = pool.run('uname -s')
for connection, result in results.items():
print("{0.host}: {1.stdout}".format(connection, result))
4.自动响应程序的输出
比如运行sudo命令时,会要求输入代码,此时如果手动输入则显得很笨拙,fabric提供了自动响应输入请求的功能:
from invoke import Responder
from fabric import Connection
c = Connection('host')
passwd = "1234
sudopass = Responder(
pattern=r'\[sudo\] password:',
response='{passwd }\n',format(passwd = passwd),
)
c.run('sudo whoami', pty=True, watchers=[sudopass])
5.将功能封装成函数
def upload_and_unpack(ssh_conn ):
c.put('myfiles.tgz', '/opt/mydata')
c.run('tar -C /opt/mydata -xzvf /opt/mydata/myfiles.tgz')