1

我正在使用 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

我已经尝试过使用 Windows 名称 freeSSHd 的其他 sshutility,我可以通过 putty 连接并执行命令,但是,我只能连接但不能执行命令。freeSSHd 服务器出现以下错误。

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

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

4

2 回答 2

7

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

Unable to execute command or shell on remote system: Failed to Execute process基本上意味着它试图在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.

于 2013-11-15T19:05:22.850 回答
2

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

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

首先,dir: not found这看起来像是您从 POSIX shell 收到的错误消息。(这正是我从ksh; sh/ bashcsh/得到的tcshzsh它们都相似但不完全相同。)大多数 POSIX 系统不会dir在 PATH 的任何位置命名程序。是否有可能您不小心连接到了错误的计算机,并且它不是 Windows 机器?

如果它是一个 Windows 机器,但它安装了 *nix 样式的 shell,例如,通过 cygwin 或 MinGW,这可能是用户的默认 shell,还是 ssh 服务器配置中指定的 shell?如果您使用的是 cygwinsshd而不是本机 Windows ssh 服务器,则这种情况很可能发生。

可以将 Powershell 配置为给出简短的错误,而不是通常的冗长错误。我从来没有这样做过,所以我不知道它的简短错误是否“术语'dir'不被识别为cmdlet、函数、脚本文件或可运行程序的名称......”看起来像“dir: not found ”,但这并非不可能。当然,您还必须将 Powershell 设置为用户的默认 shell 或覆盖 ssh 服务器配置中的默认 shell 才能发生这种情况,我很确定dir它在默认的别名列表中,所以你必须也覆盖它。

于 2013-11-14T19:15:11.383 回答