fabric无法在Windows上执行远程命令

时间:2014-03-19 11:44:20

标签: shell fabric msys

我正在使用fabric在远程Windows 7系统上运行某些命令。而我所做的就是:

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

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

它适用于“ipconfig”并输出远程系统的网络信息,所以我确定ssh连接正常。但它不适用于我试过的任何其他命令,如“cd”,“echo hello”。错误是:

  

out:无法在远程系统上执行命令或shell:无法执行进程。

我想远程运行Windows shell脚本,我该怎么办?

P.S。如果我通过putty连接窗口,命令“cd”“echo hello”有效。

[更新]

我意识到Fabric正在使用env.shell来解释我传递的命令,现在我的问题是:可以指定一个windows shell来构建env.shell吗?怎么样?

[再次更新]

我将“cmd.exe”分配给env.shell,并且在执行“cmd.exe”时遇到了困难。经过几次尝试env.shell="cmd.exe /c"最终有效。现在我可以通过结构远程执行direcho

[最终解决后更新:]

我不确定我的解决方案是否有缺陷,直到现在还顺利。

我的解决方案是在Windows上使用msys on windows + fabric,在windows上使用freesshd作为sshserver。

windows上的msys提供了一个“bash”,正如Andrew Walker在下面提到的那样,fabric期望“bash”并且在它上面表现出色。虽然在上面的[update again]中,fabric也可以使用cmd.exe /c并在其上执行windows命令。

要将msys bash / shell分配给fabric,用户应该告诉env具体如何找到bash

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

cmd.exe /c告诉fabric下面的字符串应该作为cmd.exe中的“命令”执行,/ccmd.exe表示windows cmd contenxt中的命令,它就像{{1} }}

然后cmd.exe /c "command"由cmd.exe执行,并且结构正在执行msys shell。我不确定c:/msys/1.0/bin/sh -l -c做了什么,msys shell在没有-l的bin文件夹中找不到fakelinuxcommand.exe,所以我得出-l有助于环境的结论。 -l-c中的/c类似,表示以下字符串为cmd.exe /c的命令,因此传递给ssh客户端的以下内容将作为msys shell中的命令执行。

一个明确的整合示例:

c:/msys/1.0/bin/sh

函数run_shell_command中的参数env.password='123456' env.user='test' env.hosts=['test@192.168.91.238'] env.shell='cmd.exe /c c:/msys/1.0/bin/sh.exe -l -c' def run_shell_command(command): return run(command,pty=False) 将与env.shell连接并由msys shell执行。

[我的结论]

如果没有'bash like'伪终端,我认为面料不能正常工作。在[再次更新]中,linux中的结构可以在远程窗口的cmd.exe中执行命令。在某些只存在远程winodws的情况下,这就足够了。 msys提供了一个linux bash,允许我在远程窗口和远程linux上从本地linux执行相同的shell脚本。

2 个答案:

答案 0 :(得分:2)

我同意Martian Puss的结论,即“Fabric可以在没有'bash-like'shell的情况下工作。”

我已将FreeSSHd软件安装到我的Windows 7机器上(作为服务运行),并且我已授予“sistemas”用户访问Windows shell的权限。

然后,可以使用以下Fabric代码在该shell上远程调用命令(如systeminfo):

from fabric.api import env, run

env.hosts=["sistemas@cliente03"]
def test_win():
    run("systeminfo", shell=False, pty=False)

特别注意shell=False参数,这是使其正常工作的关键。

如果我们运行它,这就是我们得到的:

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


Done.
Disconnecting from cliente03... done.

答案 1 :(得分:1)

Fabric真的希望远程机器上有一个bash(或至少类似bash)的shell。

让结构在远程Windows机器上运行命令的最简单方法是安装适当的shell。例如,cygwin的安装默认包含此类shell。