我正在使用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"
最终有效。现在我可以通过结构远程执行dir
,echo
。
[最终解决后更新:]
我不确定我的解决方案是否有缺陷,直到现在还顺利。
我的解决方案是在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中的“命令”执行,/c
后cmd.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脚本。
答案 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。