gpt4 book ai didi

shell - Fabric无法在Windows上执行远程命令

转载 作者:行者123 更新时间:2023-12-02 08:55:25 44 4
gpt4 key购买 nike

我正在使用 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: Unable to execute command or shell on remote system: Failed to Execute process.

我想远程运行 Windows shell 脚本,我应该这样做吗?

附注如果我通过腻子连接窗口,命令“cd”“echo hello”就可以工作。

[更新]

我意识到fabric正在使用env.shell来解释我传递的命令,现在我的问题是:可以为fabric env.shell指定一个Windows shell吗?以及如何?

[再次更新]

我将“cmd.exe”分配给env.shell,但它卡在执行“cmd.exe”上。经过几次尝试,env.shell="cmd.exe /c" 最终起作用了。现在我可以通过fabric远程执行direcho

[最终解决后更新:]

我不确定我的解决方案是否有缺陷,到目前为止一切顺利。

我的解决方案是在Windows上使用msys+在Linux上使用fabric+在Windows上使用freesshd作为ssh服务器。

Windows 上的 msys 提供了“bash”,正如 Andrew Walker 下面提到的,fabric 期望“bash”并且在它上表现出色。尽管在上面的[再次更新]中,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 上下文中的命令,就像 cmd.exe /c "command"

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

一个清晰的集成示例:

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)

函数run_shell_command中的参数command将与env.shell连接并由msys shell执行。

[我的结论]

我认为如果没有“类似 bash”的伪终端,fabric 就无法工作。在【再次更新】中,linux中的fabric可以执行远程windows的cmd.exe中的命令。在某些仅存在远程 winodw 的情况下,这就足够了。 msys 提供了一个 linux bash,允许我从本地 linux 在远程 Windows 和远程 linux 上执行相同的 shell 脚本。

最佳答案

我同意 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.

关于shell - Fabric无法在Windows上执行远程命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22504784/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com