2014-03-19 34 views
3

我使用織物上的遠程窗口運行一些指令7系統執行遠程命令。而像我做了什麼:織物不能在窗口

env.hosts=['192.168.91.235'] 
env.user='test' 
env.password='123456' 

def test_windows(): 
    run("ifconfig",shell=False) 
    pass 

和它的作品爲「IPCONFIG」和輸出遠程系統的網絡INFORS,所以我敢肯定,SSH連接正常。但它不適用於我嘗試的任何其他命令,如「cd」,「echo hello」。錯誤是:

out:無法在遠程系統上執行命令或shell:無法執行進程。

而我想遠程運行一個Windows shell腳本,所以我應該怎麼做?

P.S.如果我通過putty連接窗口,命令「cd」「echo hello」有效。

[更新]

我認識到,織物採用env.shell解釋我過去了,現在我的問題是下面的命令:可以被指定一個Windows外殼面料env.shell?如何?

[再次更新]

我被分配 「的cmd.exe」,以env.shell,它被卡在執行 「cmd.exe的」。經過幾次嘗試env.shell="cmd.exe /c"最終奏效。現在我可以通過織物遠程執行direcho

[更新後,它終於解決:]

我不知道如果我的解決方案是有缺陷的,它遠遠至今。

我的解決辦法是使用在windows MSYS在Linux + freesshd +織物上的窗口作爲sshserver。的窗口上

MSYS提供了「打擊」,安德魯沃克如下所述,織物預計「打擊」並在其上良好地執行。儘管在上面的[更新]中,結構也可以與cmd.exe /c一起生活,並在其上執行windows命令。

要分配MSYS的bash /殼織物,用戶應該告訴ENV具體如何找到的bash

env.shell='cmd.exe /c c:/msys/1.0/bin/sh.exe -l -c' 

cmd.exe /c告訴織物下面的字符串應的cmd.exe被執行爲「命令」,/ccmd.exe在windows cmd contenxt中表示一個命令,就像cmd.exe /c "command"

然後c:/msys/1.0/bin/sh -l -c由cmd.exe執行並且fabric執行msys shell。我不知道什麼呢-l做什麼,MSYS殼找不到bin文件夾fakelinuxcommand.exe沒有-l,所以我做了這樣的結論-l有助於環境。 -c/ccmd.exe /c,表示下面的字符串作爲c:/msys/1.0/bin/sh命令相似,所以傳遞給SSH客戶端的以下東西被作爲一個命令在MSYS殼執行。

的整合爲例,可以更清晰:

env.password='123456' 
env.user='test' 
env.hosts=['[email protected]'] 
env.shell='cmd.exe /c c:/msys/1.0/bin/sh.exe -l -c' 

def run_shell_command(command): 
    return run(command,pty=False) 

在功能run_shell_command參數command將env.shell進行串聯和MSYS執行殼。

[我的結論

我不認爲布離不開僞終端「喜歡bash的」工作。在[再次更新]中,linux中的fabric可以在遠程Windows的cmd.exe中執行命令。在只有遠程winodws存在的情況下,這就夠了。 msys提供了一個linux bash,允許我在本地linux上在遠程窗口和遠程linux上執行相同的shell腳本。

回答

1

面料真的是期待在遠程機器上使用bash(或至少是bash)的外殼。

讓織物在遠程Windows計算機上運行命令的最簡單方法是安裝合適的外殼。例如,默認情況下,安裝cygwin包含此類外殼。

+0

我真的很感激你的答案雖然cygwin的不符合我們的需要。我已經更新了在問題描述中獲取cmd.exe的方法。非常感謝。 –

+0

感謝您的支持。 –

0

我同意Martian Puss的結論,那就是「織物可以在沒有'bash的'殼'的情況下工作。

我已將FreeSSHd軟件安裝到我的Windows 7計算機(作爲服務運行)中,並且我已授予「sistemas」用戶訪問Windows外殼的權限。

接着,下面的面料代碼可以用來調用遠程對外殼(如系統的系統信息)命令:

from fabric.api import env, run 

env.hosts=["[email protected]"] 
def test_win(): 
    run("systeminfo", shell=False, pty=False) 

要特別注意shell=False參數,它是關鍵,使這個正常工作。

如果我們運行它,這就是我們得到:

[[email protected] ~]$ fab test_win 
[[email protected]] Executing task 'test_win' 
[[email protected]] run: systeminfo 
[[email protected]] Login password for 'sistemas': 
[[email protected]] out: 
[[email protected]] out: Host Name:     RP_CLIENTE03 
[[email protected]] out: OS Name:     Microsoft Windows 7 Professional 
[[email protected]] out: OS Version:    6.1.7601 Service Pack 1 Build 7601 
[[email protected]] out: OS Manufacturer:   Microsoft Corporation 
[[email protected]] out: OS Configuration:   Standalone Workstation 
... 
[[email protected]] out: 


Done. 
Disconnecting from cliente03... done.