2014-03-19 30 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.