Python 执行命令后SSH会话未返回o/p

Python 执行命令后SSH会话未返回o/p,python,ssh,stdout,paramiko,Python,Ssh,Stdout,Paramiko,我使用openSSH在测试机器(WindowsXP)和控制器机器(Win7)之间建立ssh连接。我已经在测试机器上配置了ssh服务器,并且能够获得ssh会话并运行命令。当我在这个ssh会话中运行命令时,我在putty会话中得到了显示的o/p,但是当我使用相同的命令并尝试检索o/p时,我没有得到任何值 我已经在我的XP机器上安装了openssh,这是适用于Windows v3.8.1p1-1的openssh版本 这就是我配置它在windows上运行ssh的方式 C:\Documents and S

我使用openSSH在测试机器(WindowsXP)和控制器机器(Win7)之间建立ssh连接。我已经在测试机器上配置了ssh服务器,并且能够获得ssh会话并运行命令。当我在这个ssh会话中运行命令时,我在putty会话中得到了显示的o/p,但是当我使用相同的命令并尝试检索o/p时,我没有得到任何值

我已经在我的XP机器上安装了openssh,这是适用于Windows v3.8.1p1-1的openssh版本

这就是我配置它在windows上运行ssh的方式

C:\Documents and Settings\Administrator>cdc:\OpenSSH
C:\OpenSSH>cd-bin
C:\OpenSSH\bin>mkgroup-l>..\etc\group
C:\OpenSSH\bin>mkpasswd-l-u管理员>>..\etc\passwd
C:\OpenSSH\bin>net启动opensshd
请求的服务已启动。
下面是我的代码

import paramiko


class TestSSH():

    def __init__(self):
        self.ip = "172.xxx.xxx.xxx"
        self.user = "Administrator"
        self.password = "passpass"


    def run(self):
        ssh_client = paramiko.SSHClient()
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_client.connect(
            self.ip,
            username = self.user,
            password = self.password
        )
        std_in, std_out, std_err = ssh_client.exec_command("dir")

        print std_out.read()


obj = TestSSH()
obj.run()
这是我在putty课程中得到的o/p-

C:\Documents and Settings\Administrator目录 2013年11月14日下午3:11。 2013年11月14日下午3:11。。 2013年11月14日下午3:12桌面 2011年7月27日下午6:00最爱 2013年11月14日下午03:11赫曼特 2011年7月27日下午6:00我的文件 2011年7月27日晚上11:12开始菜单 0个文件0个字节 7个目录39932612608可用字节 C:\Documents and Settings\Administrator> 但是我没有收到任何订单

我已经尝试过windows name FreeShd的其他SSHutability,我可以通过putty和execute命令进行连接,但是,我只能连接但不能执行该命令。 我在freeshd服务器上遇到以下错误

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


此o/p进入std\U out而不是std\U err变量。

您没有得到任何输出的原因是没有输出,因为远程系统无法运行
dir
命令。您确实收到了一条错误消息,但它是打印到stderr而不是stdout的,因此除非您打印出
std\u err.read()
,否则您永远不会看到它

至于你为什么会出错,没有更多的信息很难猜测。这里有一些可能性

首先,
dir:notfound
,它看起来像是从POSIX shell中得到的错误消息。(这正是我从
ksh
sh
/
bash
csh
/
tcsh
,和
zsh
中得到的,它们都是相似的,但并不完全相同。)而且大多数POSIX系统在路径上的任何地方都不会有一个名为
dir
的程序。您是否可能意外连接到错误的计算机,而该计算机不是Windows机箱

如果它是Windows box,但安装了*nix样式的shell(例如通过cygwin或MinGW),这可能是用户的默认shell,还是ssh服务器配置中指定的shell?如果您正在使用cygwin
sshd
而不是本机Windows ssh服务器,则很可能出现这种情况


可以将Powershell配置为提供简短错误,而不是通常的详细错误。我从来没有这样做过,所以我不知道它的简短错误“术语'dir'未被识别为cmdlet、函数、脚本文件或可操作程序的名称…”看起来像“dir:not found”,但这并非不可能。当然,您还必须将Powershell设置为用户的默认shell,或者覆盖ssh服务器配置中的默认shell以实现此目的,我非常确定
dir
在默认别名列表中,因此您也必须覆盖它。

您没有得到任何输出的原因是没有输出,因为远程系统无法运行
dir
命令。您确实收到了一条错误消息,但它是打印到stderr而不是stdout的,因此除非您打印出
std\u err.read()
,否则您永远不会看到它

至于你为什么会出错,没有更多的信息很难猜测。这里有一些可能性

首先,
dir:notfound
,它看起来像是从POSIX shell中得到的错误消息。(这正是我从
ksh
sh
/
bash
csh
/
tcsh
,和
zsh
中得到的,它们都是相似的,但并不完全相同。)而且大多数POSIX系统在路径上的任何地方都不会有一个名为
dir
的程序。您是否可能意外连接到错误的计算机,而该计算机不是Windows机箱

如果它是Windows box,但安装了*nix样式的shell(例如通过cygwin或MinGW),这可能是用户的默认shell,还是ssh服务器配置中指定的shell?如果您正在使用cygwin
sshd
而不是本机Windows ssh服务器,则很可能出现这种情况


可以将Powershell配置为提供简短错误,而不是通常的详细错误。我从来没有这样做过,所以我不知道它的简短错误“术语'dir'未被识别为cmdlet、函数、脚本文件或可操作程序的名称…”看起来像“dir:not found”,但这并非不可能。当然,您还必须将Powershell设置为用户的默认shell,或者覆盖ssh服务器配置中的默认shell以实现这一点,我非常确定
dir
在默认别名列表中,因此您也必须覆盖它。

我不知道如何解决您原始ssh服务器的问题,但现在您已经切换到FreeShd,您遇到了一个不同的问题

无法在远程系统上执行命令或shell:无法执行进程
基本上意味着它试图在没有shell的情况下执行
dir
,这将不起作用。您的
路径上没有
dir.exe
cmd.exe
中内置了一个
dir
命令

换句话说,这与执行ba时遇到的问题相同
cmd /c dir