js运行shell命令,shell远程执行命令
本文详细介绍了使用JSch远程执行Shell命令的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
如何解决写爬虫IP受阻的问题?立即使用。
JSch是Java安全通道的缩写。JSch是SSH2的纯Java实现。它允许您连接到SSH服务器,并可以使用端口转发、X11转发、文件传输等。当然,您也可以将其功能集成到您自己的应用程序中。Jsch是一个很老的框架,更新到2016年,现在也不更新了。
JSch 使用 shell 执行命令,有两种方法
ChannelExec:一次执行一个命令。一般来说,这对我们来说已经足够了。
ChannelShell:可以执行多个命令,很少用于开发。请根据你的需要来;
channel exec channel exec=(channel exec)session . open channel( exec );//只能执行一条指令(或者可以执行符合的指令)
channel shell channel shell=(channel shell)session . open channel( shell );//可以执行多个命令,但是每个命令只需要iostream
1. ChannelExec
;分开。注意:每个命令的执行都是成功的,不会影响其他命令的执行。换句话说,每个命令都会被执行,但不能保证每个命令都会被成功执行。
每个命令由一个分隔。注意:如果前一个命令成功执行,将执行下面的命令。这可以确保所有命令都成功执行。
每个命令都用分隔。注意:表示“或”,只有在前一条命令失败后才会执行下一条命令,直到一条命令执行成功。
2. ChannelShell
对于ChannelShell,以输入流的形式,可以执行多条指令,就像在本地计算机上使用交互Shell一样(通常用于:交互使用)。如果你想停下来,有两种方法:
发送退出命令,告诉程序本次交互结束;
使用字节流中可用的方法获取数据的总大小,然后在循环中读取它。
使用示例
1. 引入 pom 依赖
依赖性
groupIdcom.jcraft/groupId
artifactIdjsch/artifactId
版本0 . 1 . 53/版本
/dependency
2. jsch 使用示例
在这里封装了一个shell工具类,用来执行Shell命令。具体使用细节在代码注释里有说明,可以直接复制使用。代码如下:
包org . example . shell;/**
*由强好好于2021/3/28创建
*/import com . j craft . jsch . channel exec;导入com . j craft . jsch . jsch;导入com . j craft . jsch . session;导入Java . io . buffered reader;导入Java . io . io exception;导入Java . io . inputstreamreader;/**
* @描述:
* @作者:qianghaohao
* @时间:2021/3/28
*/公共类外壳程序{
私有字符串主机;
私有字符串用户名;
私有字符串密码;
private int port=22
private int timeout=60 * 60 * 1000
公共Shell(字符串主机、字符串用户名、字符串密码、int端口、int超时){
this.host=host
this.username=用户名;
this.password=密码;
this.port=port
this . time out=time out;
}
公共Shell(字符串主机、字符串用户名、字符串密码){
this.host=host
this.username=用户名;
this.password=密码;
}
公共字符串execCommand(字符串cmd) {
JSch JSch=new JSch();
Session session=null
ChannelExec channelExec=null
buffered reader inputStreamReader=null;
buffered reader errInputStreamReader=null;
StringBuilder runLog=new StringBuilder(“”);
StringBuilder errLog=new StringBuilder(“”);
尝试{
//1.获取ssh会话
session=jSch.getSession(用户名,主机,端口);
session.setPassword(密码);
session.setTimeout(超时);
session . set config( StrictHostKeyChecking , no );
session . connect();//获取ssh会话
//2.在执行模式下执行shell命令。
channel exec=(channel exec)session . open channel( exec );
渠道主管。设置命令(cmd);
渠道主管。connect();//执行命令
//3.获取标准输入流
inputStreamReader=新的缓冲读取器(新的inputStreamReader(通道执行。getinputstream()));
//4.获取标准错误输入流
errInputStreamReader=新缓冲读取器(新输入流读取器(通道执行。geterrstream()));
//5.记录命令执行原木
字符串行=空
while((line=inputstreamreader。readline())!=null) {
runLog.append(行)。追加( \ n );
}
//6.记录命令执行错误原木
String errLine=null
while((errLine=errinputstreamreader。readline())!=null) {
errLog.append(errLine).追加( \ n );
}
//7.输出壳命令执行日志
系统。出去。println( exit status= channel exec。getexit status(),openChannel.isClosed=
渠道主管。是封闭的());
System.out.println(命令执行完成,执行日志如下:);
系统。出去。println(runlog。tostring());
System.out.println(命令执行完成,执行错误日志如下:);
系统。出去。println(错误日志。tostring());
} catch(异常e) {
e。printstacktrace();
}最后{
尝试{
if (inputStreamReader!=null) {
inputstreamreader。close();
}
if (errInputStreamReader!=null) {
errinputstreamreader。close();
}
if (channelExec!=null) {
渠道主管。disconnect();
}
如果(会话!=null) {
会话。disconnect();
}
} catch (IOException e) {
e。printstacktrace();
}
}
返回运行日志。tostring();
}}上述工具类使用:
包org .示例导入org。举例。贝壳。外壳;/**
*你好,世界!
*
*/公共类应用程序{
公共静态void main( String[] args ) {
字符串cmd= ls-1 ;
Shell Shell=新壳( 192。168 .10 .10 , ubuntu , 11111 );
字符串exec log=shell。执行命令(cmd);
系统。出去。println(execLog);
}}推荐: 《java视频教程》 以上就是JSch如何远程执行壳命令的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。