Java operate file or system between different service

阅读更多

 

设想:能不能在不同服务器之间文件传输,或是执行操作系统的命令的方式来操作服务器?

答案:当然可以

 

首先,在这里介绍一下不用密码怎么去访问别的service。(这是后续操作的基础)

 

 

要让 HostB 允许HostA 上的用户User1 进行操作,需要:

 

1. HostA 上以 User1 登陆,或 su - User1

2. 用ssh-keygen 命令,来生成HostA 的密钥对文件

ssh-keygen -t rsa 

生成目录:/home/User1/.ssh/

id_rsa 是私钥文件

id_rsa.pub 是公钥文件

3. 修改公钥文件属性

chmod 755 /home/User1/.ssh/id_rsa.pub

4. 将 HostA 上的公钥内容 id_rsa.pub 添加到 HostB 上  

如果HostB上没有  /home/User1/.ssh 目录或authorized_keys 则需要新建

将HostA 的 id_rsa.pub 文件内容,添加到 /home/User1/.ssh/authorized_keys 文件中

5. 测试:(注意需要以 User1 登陆)

scp  1.txt UserB@HostB:/****/xxxx/

 

在不需要密码的情况下能把1.txt文件从HostA  copy  至HostB,那么,该配置设置ok。

 

补充:有可能出现按照上述设置,任然不可以的现象,做如下操作:

在HostA上

chmod 700 .ssh

chmod 600 ./ssh/authorized_keys

 

 

其次,网上有很多java实现的ssh,比如jsch等。我们在这里介绍两种底层的操作,更加简明、高效

 

1. Runtime.getRuntime().exec()

 

我想大家对这个不陌生吧,Runtime这个东西很强大,只要是你的操作系统能够完成的,它都能完成。比如linux系统中我们常用的scp命令,跨服务操作

Runtime.getRuntime().exec("scp -r /###/dir  user@HostB:/dir") ;这样就可以把你的服务器上的文件copy至HostB上。强大吧,当然该功能需要借助于上述说的公钥文件的配置。至于采用scp来copy file和directory的具体参数就不多说了。

 

举例:

(1) 用Runtime.getRuntime().exec 打开文件(windows) Runtime.getRuntime().exec("cmd.exe /c start E://1.xlsx") ;

 

(2) Runtime.getRuntime().exec执行结果:

 

Process prs =  Runtime.getRuntime().exec("cmd.exe /c start E://test//1.xlsx") ; 

prs.waitFor() ;

int i = prs.exitValue() ;// i 即为执行结果

prs.destroy() ;

 

当然,在用完该方法后,最好Process prs =  Runtime.getRuntime().exec("") ;  ......  prs.destroy() ;

 

 

 

2. ganymed-ssh2-build210.jar包提供了很多从方法

(API:http://www.ganymed.ethz.ch/ssh2/javadoc/index-all.html#_R_)它的sess.execCommand(command) ;方法依旧能完成上述scp的功能。

 

这两者的共同之处在于它们都是在执行操作系统底层的东西,简洁、高效、非常强大。不仅仅是我在上面介绍的scp的功能,比如删除目录以及该目录下所有的目录&文件呢?rm -rf /###/drectory ......

 

哈哈,大家也许看明白了,只要是你的操作系统所能执行的命令,这里都可以帮你完成,要让我用一句话评价,那就是:强大!

 

 

 

你可能感兴趣的:(java,linux,服务器访问,系统操作,ssh)