【问题标题】:SSH session not returning o/p after executing the command执行命令后 SSH 会话不返回 o/p
【发布时间】:2013-11-27 10:46:44
【问题描述】:

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

这是我在 putty 会话中得到的 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 变量。

【问题讨论】:

  • 我喜欢你删除了你的内部网络 IP 地址,但留下了你的密码。 (话又说回来,如果'passpass' 是你的真实密码,那它可能不是需要太多安全性的局域网……)
  • @abarnert 它不是:)
  • 更严重的是......你能打印std_err.read(),只是为了确保dir不会以某种方式失败吗?
  • @abarnert std_err.read() 的值为“dir: not found”。我该如何解决这个有任何想法。我什至尝试用“time”代替 dir,但发现同样的错误。
  • 这是错误信息的准确引用吗?

标签: python ssh stdout paramiko


【解决方案1】:

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

Unable to execute command or shell on remote system: Failed to Execute process 基本上意味着它试图在没有 shell 的情况下执行dir,这是行不通的。您的PATH 上没有dir.execmd.exe 内置了一个 dir 命令。

换句话说,这与您在 POSIX 系统上尝试在没有 shell 的情况下执行 bash 内置函数时遇到的问题相同。解决方法是一样的:以dir作为命令执行shell。

这样做的方法是:

cmd /c dir

freeSSHd 可能还有一个错误,它会做一些花哨的事情,试图隐藏 cmd.exe 终端和 POSIX 终端之间的差异,这可能会导致您收到有关“找不到控制台窗口”的错误。希望你不会遇到那个;如果你这样做了,仔细研究一下偏好,应该有一个复选框可以关闭这些东西。


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

【讨论】:

  • 非常感谢您的解决方案。
【解决方案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?如果您使用的是 cygwin sshd 而不是本机 Windows ssh 服务器,则很有可能发生这种情况。

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

【讨论】:

  • 我可以使用 Putty.exe 运行目录,但不能使用 python 程序。我认为两种情况下的默认外壳都是相同的。
  • 如何将默认 shell 设置为 unix/linux 等 shell。我可以使用 cmd /c 运行命令,但是当我尝试将文件传输到远程机器时,我无法这样做。我正在打开一个 sftp 会话,然后使用 put 传输文件,但是,当 put 尝试在远程计算机上打开文件时,它会出错。你知道如何解决这个问题吗?
  • 嗯,首先,您必须在 Windows 机器上拥有一个类 Unix 外壳(例如,通过 MinGW 或 Cygwin 的 bash); Windows 没有自带。其次,您不希望将 Windows 机器上的默认 shell 设置为 bash 之类的东西。但是某些 Windows ssh 服务器将允许您为 ssh 会话设置不同于默认设置的 shell。 Cygwin ssh 服务器默认为 Cygwin bash shell。或者,您可以远程执行任何特定的 shell,而不是使用默认的远程 shell,只要您知道它的路径或它在 PATH 上。
  • @Hemant:换句话说,如果bash 在你的PATH 上,你可以bash -c ls 代替cmd /c dir,如果不在,你可以/path/to/bash -c ls
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 2017-08-13
  • 1970-01-01
  • 2015-08-26
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多