执行命令后,SSH会话不返回o / p

时间:2013-11-14 12:16:40

标签: python ssh stdout paramiko

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

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

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

C:\Documents and Settings\Administrator>cd c:\OpenSSH    
C:\OpenSSH>cd bin    
C:\OpenSSH\bin>mkgroup -l >> ..\etc\group    
C:\OpenSSH\bin>mkpasswd -l -u administrator >> ..\etc\passwd    
C:\OpenSSH\bin>net start opensshd
The requested service has already been started.

以下是我的相同代码

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()

这是o / p我进入腻子会议 -

Directory of C:\Documents and Settings\Administrator

11/14/2013  03:11 PM    <DIR>          .
11/14/2013  03:11 PM    <DIR>          ..
11/14/2013  03:12 PM    <DIR>          Desktop
07/27/2011  06:00 PM    <DIR>          Favorites
11/14/2013  03:11 PM    <DIR>          hemant
07/27/2011  06:00 PM    <DIR>          My Documents
07/27/2011  11:12 PM    <DIR>          Start Menu
               0 File(s)              0 bytes
               7 Dir(s)  39,932,612,608 bytes free

C:\Documents and Settings\Administrator>

然而我没有得到任何o / p

我尝试过其他sshutility for windows name freeSSHd,我可以通过putty和execute命令连接,但是,我只能连接但不能执行命令。 我在freeSSHd服务器上收到以下错误。

Unable to execute command or shell on remote system: Failed to Execute process.

这个o / p进入std_out而不是std_err变量。

2 个答案:

答案 0 :(得分:4)

我不知道如何解决原始SSH服务器的问题,但现在你已经切换到freeSSHd,你的有不同的问题。

Unable to execute command or shell on remote system: Failed to Execute process基本上意味着它试图在没有shell的情况下执行dir,这将无效。 dir.exe上没有PATH; dir内置了cmd.exe命令。

换句话说,在POSIX系统上尝试在没有shell的情况下执行bash内置的问题也是同样的问题。解决方案是相同的:以dir作为命令执行shell。

这样做的方法是:

cmd /c dir

你可能还有一个freeSSHd的错误,它会尝试隐藏cmd.exe终端和POSIX终端之间的差异,这些错误会导致你发现“找不到控制台窗口”的错误。希望你不会遇到那个;如果你这样做,挖掘首选项,应该有一个复选框来关闭这些东西。


而且,现在我想起来了,无论出于什么原因,你的原始ssh服务器表现得很奇怪(运行ksh或其他东西),让它执行cmd /c dir而不是dir也可以解决这个问题;在最糟糕的情况下,你将运行一个不必要的shell-inside-a-shell,这很愚蠢,但不会破坏像dir这样简单的事情。

答案 1 :(得分:2)

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

至于为什么你会收到错误,没有更多信息就很难猜到。这是一些可能性。

首先,dir: not found看起来像是从POSIX shell获得的错误消息。 (这正是我从ksh获得的; sh / bashcsh / tcshzsh都相似但不相同。并且大多数POSIX系统在PATH上的任何地方都没有名为dir的程序。您是否可能意外连接到错误的计算机,而且它不是Windows框?

如果它是一个Windows框,但它安装了* nix风格的shell,例如,通过cygwin或MinGW,这可能是用户的默认shell,还是ssh服务器配置中指定的shell?如果您使用的是cygwin sshd而非本机Windows ssh服务器,则很可能会这样做。

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