软件环境
机器A:Win7x64 (192.168.8.8):
python2.7 + fabric 最新
django
FreeSSHd (SSH用户名为:administrator,NT认证,该windows用户密码为abc)
putty(验证ssh连接)
机器B:
linux
git服务器
机器C:
linux
ssh
验证用
------------------------------------------------------
fab官网教程:
http://docs.fabfile.org/en/1.10/tutorial.html
1、fab官网教程用到了一个django项目
因为手头没有现成的django项目,所以只好用了最新django官方教程,
https://docs.djangoproject.com/en/1.8/intro/tutorial01/
先搭建了一个。django官方教程写的很好,很容易上手,很容易就运行起来了。
只是fab官网用到的tests.py,需要自己写一两个简单的testcase
2、fab deploy连接本地服务器遇到了一系列问题:
问题1:
由于原来例子里面没有写env,所以会提示连接哪个host,我输入了localhost,结果报错:
Low level socket error connecting to host localhost
排查过程:
(1) 本机用putty连localhost没有问题
(2) 登录机器C(linux),
执行ssh 192.168.8.8时,会尝试用机器C的当前用户名连接,所以无法成功
因此,改为执行ssh [email protected],但是还是连接不上
想到也许是防火墙问题,所以把python.exe, fab.exe,freesshd 以及tcp 22端口都通过防火墙,
这时,机器C上ssh连接192.168.8.8,ok了,
但是在本机上,fab代码仍然报底层Low level socket error,问题
仍然存在
(3)
联想到以前有的web应用也发生过不认localhost,只认127.0.0.1,或者反过来的情况,
所以fab代码中,开头部分增加env定义,不用localhost,而用127.0.0.1
env.hosts=['[email protected]:22']
env.user='administrator'
env.password='abc'
问题1解决。
参考资料:
http://stackoverflow.com/questions/1469431/why-am-i-receiving-a-low-level-socket-error-when-using-the-fabric-python-library
问题2:
Unable to execute command or shell on remote system: Failed to Execute process
ssh连接上本机以后,无法执行windows命令,报以上错误
这个问题,前人经过细致研究后的结论是,在windows上,默认fab也试图执行bash命令,所以需要重定义shell
因此在fab代码中,开头部分继续增加
env.shell="cmd /c"
问题2解决。
参考资料:
http://stackoverflow.com/questions/22504784/fabric-cannot-execute-remote-command-on-windows
http://stackoverflow.com/questions/14863659/paramiko-not-executing-command-or-shell-python
问题3:
with cd()语句 不工作:
code_dir="H:\mydjango"
#code_dir="/h/mydjango"
with cd(code_dir):
run(“dir”)
结果发现,列出的总是C:\windows\system32的内容,搜了一圈,也没有找到解决方案
只好放弃with cd(),改为直接执行
run("H:" + " && " + "cd " +code_dir+ " && " + “dir")
这样才列出了正确的内容
之后,deploy可以登录127.0.0.1了,但是执行git clone命令,总是报错ssh有问题
继续发现,原来在win7下,以正常方式执行git命令时,git bash自带的ssh用到了~/.ssh/id_rsa.pub和id_rsa文件,其中pub文件早就预先提交给了gitlab服务器
而ssh登录本机后,其实不再是正常方式执行git命令,而是到了freesshd自己的小环境,所以用的是fresshd自己带的ssh,
可是似乎freesshd自带的ssh并没有读~/.ssh/id_rsa.pub和id_rsa文件,但是它自己的配置也没有地方做相关配置,它自己的配置目录配的只有它自己的私有钥匙。
所以,我觉得freesshd似乎功能不全,或者是我理解不到位。
所以只好放弃FreeSSHd这条路。
因而改用OpenSSH for windows
遇到了一些莫名其妙的问题:run某些命令时,命令最后莫名其妙地多加了个空格(0x20字符),导致命令执行失败。(还没有揪出原因)
OpenSSH 的配置目录下可以设置公有钥匙,因此以putty登录本机,执行ssh -T [email protected],可以执行成功;但是执行fab deploy内的run("ssh -T [email protected]")却会失败。(还没有揪出原因)