超级用户(Superuser privileges)和自动响应(auto-response)
Fabric可以跑超级用户的命令,也就是sudo我感觉并不稀奇,通过run接口就可以执行sudo命令了
在我比菜狗还菜的时候,我就已经兴冲冲的去实验了,下面的例子虽然可以用,但在实际生产当中会不满足一些需求,慢慢看。
>>> from fabric import Connection >>> c = Connection('db1') >>> c.run('sudo useradd mydbuser', pty=True) [sudo] password: <Result cmd='sudo useradd mydbuser' exited=0> >>> c.run('id -u mydbuser') 1001 <Result cmd='id -u mydbuser' exited=0>
那该如何满足自动交互的需求?
EXPECT脚本了解一下
#!/usr/bin/expect #File Transfer Script V0.1 set local_file [lindex $argv 0] set name [lindex $argv 1] set timeout 40 spawn ssh root@host expect "*assword:" send "woaini\r" expect "root@VM-4-16-centos" send "source /home/env/bin/activate ; cd ~/tmp ; nohup python auto_deploy.py -d $local_file -name $name &\r" expect "root@VM-4-16-centos" send "exit\n"
注意这不是基于bin/bash的这是依赖bin/expect的。大致的场景就是自动登录然后部署
脚本spawn了一个新的会话,然后:
- ssh登录remote server
- 终端会需要你输入密码,expect脚本匹配到了password后就会自动输入密码 , \r相当于回车
- 下一次期待就是进入远程server之后了,这里建议大家去查一下通配所有终端方案的正则怎么写,想我举例这样写死的话,灵活性不高。4. nohup让该条命令在后台执行,不会因为退出当前的session而中断。
pexpect
python当然也有对expect行为的支持有一个包
叫做Pexpect,安装:
pip install pexpect
Fabric的自动交互
当然这都是题外话,也是自动交互的一种实现。好的是,我发现Fabric也帮我们封装好了
>>> from invoke import Responder >>> from fabric import Connection >>> c = Connection('host') >>> sudopass = Responder( ... pattern=r'\[sudo\] password:', ... response='mypassword\n', ... ) >>> c.run('sudo whoami', pty=True, watchers=[sudopass]) [sudo] password: root <Result cmd='sudo whoami' exited=0>
看他的这段用例能发现,他也能匹配password,并且自动填写response也就是密码进去,不过这里是明文填密码的,实际生产中是需要加密的。