如何用java程序(JSch)运行远程linux主机上的shell脚本
运行远程主机上的shell脚本
下面的例子是教给大家如何通过java程序,运行远程主机上的shell脚本。(我讲的不是一个黑客学习教程,而是使用用户名密码去执行有用户认证资格的主机上的shell脚本)。并且通过java程序获得shell脚本的输出。
首先通过maven坐标引入JSch依赖库,我们正是通过JSch去执行远程主机上的脚本。
com.jcraft jsch 0.1.55
当然以下java代码可执行的的前提是,远程主机已经开通SSH服务(也就是我们平时登录主机所使用的服务)。
远程shell脚本
下面的代码放入一个文件:hello.sh,脚本的内容很简单只是用来测试,回显输出“hello<参数1>”
#!/bin/sh echo"hello$1\n";
然后我把它放到远程主机的/root目录下面,远程主机的IP是1.1.1.1(当然我真实测试时候不是这个IP,我不能把我的真实IP写到这个文章里面,以免被攻击)。并且在远程主机上,为这个脚本设置可执行权限,方法如下:
$chmod+xhello.sh
本地java程序
我们可以使用下面的代码,去远程的linux主机执行shell脚本,详细功能请看代码注释
importcom.jcraft.jsch.*;
importjava.io.IOException;
importjava.io.InputStream;
publicclassRunRemoteScript{
//远程主机IP
privatestaticfinalStringREMOTE_HOST="1.1.1.1";
//远程主机用户名
privatestaticfinalStringUSERNAME="";
//远程主机密码
privatestaticfinalStringPASSWORD="";
//SSH服务端口
privatestaticfinalintREMOTE_PORT=22;
//会话超时时间
privatestaticfinalintSESSION_TIMEOUT=10000;
//管道流超时时间(执行脚本超时时间)
privatestaticfinalintCHANNEL_TIMEOUT=5000;
publicstaticvoidmain(String[]args){
//脚本名称及路径,与上文要对上
StringremoteShellScript="/root/hello.sh";
SessionjschSession=null;
try{
JSchjsch=newJSch();
//SSH授信客户端文件位置,一般是用户主目录下的.ssh/known_hosts
jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
jschSession=jsch.getSession(USERNAME,REMOTE_HOST,REMOTE_PORT);
//密码认证
jschSession.setPassword(PASSWORD);
//建立session
jschSession.connect(SESSION_TIMEOUT);
//建立可执行管道
ChannelExecchannelExec=(ChannelExec)jschSession.openChannel("exec");
//执行脚本命令"sh/root/hello.shzimug"
channelExec.setCommand("sh"+remoteShellScript+"zimug");
//获取执行脚本可能出现的错误日志
channelExec.setErrStream(System.err);
//脚本执行结果输出,对于程序来说是输入流
InputStreamin=channelExec.getInputStream();
//5秒执行管道超时
channelExec.connect(CHANNEL_TIMEOUT);
//从远程主机读取输入流,获得脚本执行结果
byte[]tmp=newbyte[1024];
while(true){
while(in.available()>0){
inti=in.read(tmp,0,1024);
if(i<0)break;
//执行结果打印到程序控制台
System.out.print(newString(tmp,0,i));
}
if(channelExec.isClosed()){
if(in.available()>0)continue;
//获取退出状态,状态0表示脚本被正确执行
System.out.println("exit-status:"
+channelExec.getExitStatus());
break;
}
try{
Thread.sleep(1000);
}catch(Exceptionee){
}
}
channelExec.disconnect();
}catch(JSchException|IOExceptione){
e.printStackTrace();
}finally{
if(jschSession!=null){
jschSession.disconnect();
}
}
}
}
最终在本地控制台,获得远程主机上shell脚本的执行结果。如下
hellozimug exit-status:0
当然,我只是为大家演示这样一个例子,上面的代码可以通过更好的封装,从而提供更简单的使用方式。
以上就是如何用java程序(JSch)运行远程linux主机上的shell脚本的详细内容,更多关于JAVA运行Linux的shell脚本的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。