fabric ,paramiko ,pexpect
paramiko
ftp
之前用pexpect 执行scp ,内容比较大,莫名其妙会丢失一些数据,几百K,导致,用ffmpeg 做转换的时候视频有损失,用了paramiko做ftp好太多了。
当时在连接的时候 在使用 ssh key这里遇到坑。这句话不要忘记 很重要
这里遇到坑
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
pexpect
这个感觉太强大了
file=f
child = pexpect.spawn(upload, timeout=None, logfile=file)
index = child.expect(["(?i)100%","(?i)No such file or directory", pexpect.EOF])
if (index == 0):
file.write('upload success')
print 'upload success'
elif (index ==1):
run(mkdir, timeout=None, logfile=file)
print 'mkdir upload directory'
child = pexpect.spawn(upload, timeout=None, logfile=file)
index = child.expect(["(?i)100%", pexpect.EOF])
if (index == 0):
file.write('upload success')
print 'upload success'
else:
file.write('upload failed')
print 'upload failed'
else:
file.write('upload failed')
print 'upload failed'
就单看这个demo,child。。。。可用(?i)...实现交互,这个简直太棒了 pexpect这个库就是有很多交互的地方。
当时遇到的坑,
-
timeout,耗时任务这个要设置长一些,或者timeout=None
-
cmd 命令没有执行,需要注意,pexpect.spawn(cmd)的时候,要有 .readlins()这种类似的方法才会执行。直接用run(cmd)不存在这样的问题,但是run()命令的交互,,反正我用
child = pexpect.spawn(cmd, timeout=None, logfile=logFile)
child.readlines()
fabric
就是 远程登录命令,这个要比那些库都方便。
快捷
不用写太多复杂的东西
遇到的坑
-
在Ubuntu定义一个def,调用的时候 不能加括号
def test(): print ‘enene’ @roles('dev') def dev(): run('apt-get update') test
在mac的时候必须用()
@roles('dev') def dev(): run('apt-get update') test()
-
@roles 注解的方法 不能有变量
@roles('dev') def dev(name): 不可以的 run('apt-get update') print name
-
如果用
run('''cat > requirements.txt <<EOF Django psycopg2 EOF''')
这种 cat 方式的时候 $ 这种字符会丢失,当时 使用cat 方式 设置 nginx 凡是 有 $的 都不见了。
不方便的地方
- 交互比较差,没有pexpect.spawn 这种方法,安装软件会问 y/n ,安装数据库,设置密码。等等信息 还得手动输入 可能是自己还没有遇到吧
- 不能同时 @task @roles 不太方便
-
感觉 prompt 没啥用啊,直接用 raw_input() 不行就行了。
raw_input("Enter destination ip: ");
fabric.operations.prompt("Enter hostname") -
还有confirm 现在 没感觉
低级错误
注意python 名字不能 跟library的 名字相同,开始我给自己文件名 起名:fabric.py,一运行显示找不到....
tips:
使用ssh key 登录 查看
env.key_filename = "~/.ssh/showmuse_server/id_rsa"
网友评论