Skip to main content
 首页 » 编程设计

python之执行命令后 SSH session 不返回 o/p

2025年05月04日14luoye11

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

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

这就是我在 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 session 中得到的 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 为 windows 名称 freeSSHd,我能够通过 putty 连接并执行命令,但是,我只能连接但不能执行命令。 我在使用 freeSSHd 服务器时遇到以下错误。

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

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

请您参考如下方法:

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

Unable to execute command or shell on remote system: Failed to Execute process 基本上意味着它试图在没有 shell 的情况下执行 dir,这是行不通的。您的PATH 上没有dir.exe; cmd.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。