我有两个安全的Linux服务器。 在一台机器上我的Java应用程序正在运行。 我需要从Java的第一台机器在第二台机器上运行Linux命令。 我该怎么做?
Jsch( 这里 )允许你使用SSH连接到远程服务器,并且很容易执行shell命令(还有很多其他的东西,如SCP,SFTP …)。 没有太多的文档,但是这里有一些真正有用的实现例子(甚至是你想在这里做的一个例子)。
你也可以把Jsch与Expect4j结合起来,这样就可以更好地控制你要执行的命令( 这里是一个很好的例子)。
实质上,您需要在Java应用程序中打开与其他服务器的ssh连接。 OpenSSH网站提供了一些关于库的有用信息,这些信息将为您提供对Java的ssh支持。
看起来像Java的Ganymed SSH-2是最好的选择,但我没有使用任何一个,所以你需要看看你需要什么。
一旦你有一个SSH连接,你将能够运行命令就像你使用任何其他SSH客户端登录。
你可以通过多种方式来做到这一点。 然而,几乎每一种方式都涉及网络连接。
你可以写一个客户端 – 服务器对的Java程序,客户端连接到服务器并提交命令。
您可以编写Java来使用现有的服务器,如sshd,telnetd,rsh,ftpd或预先存在的允许在远端执行命令的其他服务器。
您可以利用架构来处理建立客户端 – 服务器对的某些方面,如RMI,SOAP,CORBA等。
最后Java支持大量的网络选项,所以你有更多的方式来做这个比你想象的。 只要确保不要在Web浏览器中执行此操作,因为这些JVM已启动沙盒,并且无需任何帮助即可离开沙盒。
检查套接字可能会更容易,因为您可以在不需要设置任何外部库的情况下执行您正在尝试执行的操作。
在主机上,你要设置一个serverSocket对象,并从客户机上打开一个Socket。 我没有时间打出整个示例,但请检查此方法,以便在Java中通过Internet建立服务器 – 主机连接的简单方法。
http://zerioh.tripod.com/ressources/sockets.html
一旦你建立起来了,你想从应该执行这个命令的计算机上的serverSocket输入你的shell命令,并且做些什么
String command = "get this from the ObjectInputStream attached to your serverSocket"; Runtime run = Runtime.getRuntime(); Process pr = run.exec(command) ; pr.waitFor() ; BufferedReader buffer = new BufferedReader( new InputStreamReader( pr.getInputStream() ) ) ; String line; while ( ( line = buffer.readLine() ) != null ) { System.out.println(line); }
棘手的部分是与套接字建立一个可靠的主机 – 客户端连接,但如果你正在做一些简单的事情,你应该罚款从上面的链接的例子。