軟體環境
機器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
因此,fab官網教程中,所有命令用到的my_app之處都需要改為polls
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 administrator@192.168.8.8,但是還是串連不上
想到也許是防火牆問題,所以把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=['administrator@127.0.0.1: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 git@gitlab.com,可以執行成功;但是執行fab deploy內的run("ssh -T git@gitlab.com")卻會失敗。(還沒有揪出原因)