我正在使用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变量。
答案 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
/ bash
,csh
/ tcsh
和zsh
都相似但不相同。并且大多数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
在默认的别名列表中,所以你也必须覆盖它。