Java exec或运行时不使用ssh

时间:2011-07-05 14:22:34

标签: java ssh runtime exec runtime.exec

我正在尝试使用exec ssh到ubuntu,但出于某种原因,当我从代码执行时出现错误 端口22:拒绝连接

在代码中我使用concat将字符串放在一起,但是我知道它们已经正确放在一起,因为我将它们打印出来,如果我将它们复制并粘贴到命令行中,那么它将正确地ssh。 我的代码尝试:

p1= Runtime.getRuntime().exec(run1);
p1.waitfor();

其中

run1 = "ssh -o StrictHostKeyChecking=no -v -i key " + "ubuntu@"+ DNS + " sudo mke2fs -F -j "+device;

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您正在启动连接,因此要拒绝它,这意味着您尝试进入的计算机拒绝您ssh访问。

通过您拥有的任何方式登录该计算机并验证ssh服务器是否正在运行。如果是,则验证防火墙是否阻塞端口22;因为,有时ssh服务器正在运行,但由于端口阻塞规则,防火墙不允许网络访问ssh服务器。

---在评论问题后编辑---

Is there a difference between ssh in the command line and using exec? Because I can 
connect to the server through the command line, which I assume is still using port 22. 
So if I can ssh that way does that mean port 22 is working?

有几种可能性。 Java附带了一个安全管理器,它只用于拒绝程序访问机器资源。这就是为什么可以安全地运行从远程服务器下载的applet代码,因为安全管理器拒绝访问硬盘驱动器或连接到其他机器的权限。在applet沙箱中,它允许连接回原始Web服务器(下载更多代码和图像)。

但是,缺少安全性异常会导致怀疑远离安全管理器。消息使用“连接被拒绝”字样这一事实强烈表明您连接的SSH服务器不接受您的连接。

也许通过在命令行上运行,ssh命令正在使用不同的环境或配置。如果ssh连接对密钥对做出一些假设,我会看看该命令是否有别名。如果没有任何东西似乎与命令不符,我会检查你的程序是否与ssh版本2连接(由于安全漏洞,许多人不允许版本1)。

然后我也会寻找可能存在的名称解析差异。您可能在命令行中解析主机名的方式与从Java程序解析主机名的方式不同。这可能意味着Java程序正在尝试连接到另一台没有运行安全shell服务器的计算机。

无论哪种方式,似乎您必须进行一些调试以隔离它是否是真正的编码问题或环境问题。

答案 1 :(得分:0)

如果您拒绝连接,则SSHD未运行或您被防火墙阻止(或类似)。