• [原]使用Jsch执行Shell脚本


    首发CSDN http://blog.csdn.net/basecn/archive/2010/12/16/6080741.aspx

    作者:BaseCN Email:basecn@163.com

    -----------------------------------------------

    Jsch是JAVA的SSH客户端,使用的目的是执行远程服务器上的命令。

    关于Session的使用,创建连接后这个session是一直可用的,所以不需要关闭。由Session中open的Channel在使用后应该关闭。

    测试了exec的方式,具体参考jsch自带example中的Exec.java。

    有两个问题:

    1、无法执行多条命令,每次ChannelExec在connect前要先setCommand,最后一次的设置生效。

    2、由于第一个原因的限制,如果执行的命令需要环境变量(如JAVA_HOME),就没有办法了。这种方式执行基本的ls,ps之类的命令没有问题,需要复杂的环境变量时有点力不从心。

    要是哪位知道exec如何解决上面现两个问题,请分享一下!

    -----------------------------------------------

    虽然exec可以得到命令的执行结果,但无法满足应用,无奈之下放弃exec转而使用ChannelShell。

    在使用ChannelShell的时候需要特别关注jsch的输入和输出流的设置。

    输出

    为了得到脚本的运行结果,设置jsch的outputStream为FileOutputStream,把shell的输出结果保存到本地文件。虽然最简单的方式是设置System.out为jsch的OutputStream,在控制台看到结果,只是无法保存下来。

     

    输入

    短时间运行的程序,输入可以直接设置为System.in,而长期运行的程序不能使用人工方式输入,必须由程序自动生成命令来执行。所以使用PipeStream来实现字符串输入命令:

     

    调用pipeOut.write( cmd.getBytes() );把生成的命令输出给ssh。

    运行

    jsch是以多线程方式运行的,所以代码在connect后如果不disconnect Channel和Session,以及相关的Stream,程序会一直等待,直到关闭,目前还没有找到判断关闭或主动关闭的方法,相信应该有这方面的机制。

    要注意一个问题,相关的Stream和Channel是一定要关闭的,那么应该在什么时候来关。执行connect后,jsch接收客户端结果需要一定的时间(以秒计),如果马上关闭session就会发现什么都没接收到或内容不全。

    可以采取两个办法来解决这个问题,一个开源一个节流

    1、在connect增加一个等待延迟,等待1~2秒,这个是开源;

    2、减小server端脚本的执行时间,这个是节流。给命令加上"nohup XXXX > output &",以后台方式运行,并把运行结果输出到服务器端的本地目录下。这样脚本的执行时间可以是最小。

    -----------------------------------------------

    最后还有一点注意,使用shell时,看到有的朋友说执行后没有结果。解决的办法是在命令后加上"/n"字符,server端就认为是一条完整命令了。很奇怪的特性!

    -----------------------------------------------

    附上类代码

    作者:basecn 发表于2010-12-16 19:04:00 原文链接
    阅读:770 评论:1 查看评论
  • 相关阅读:
    Python的一些小技巧
    Python连接sqlite3数据库
    闭包和toString方法的使用
    webpack(10) webpack扩展(插件. loader)
    webpack(9) 配置文件
    webpack(8) plugin
    webpack(7) 样式处理和图片处理之手写loader
    webpack(6) loader
    webpack(5)入口和出口
    webpack(4)编译过程分析
  • 原文地址:https://www.cnblogs.com/basecn/p/3264310.html
Copyright © 2020-2023  润新知