Java JSch更改远程机器上的用户并执行命令

编程之家收集整理的这篇文章主要介绍了Java JSch更改远程机器上的用户并执行命令编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_404_0@我试图连接到主机,然后更改用户使用“苏 – 约翰”,然后执行一个命令为约翰。 仅使用Jsch可能吗?

@H_404_0@问题是,我创build一个会议后,打开通道并执行上述命令它应该要求密码,但没有任何反应。

@H_404_0@这是我如何连接到远程机器:

@H_404_0@String address = "myremote.computer.com"; Jsch Jsch = new Jsch(); String user = "tom"; String host = address; String password = "l33tpaSSw0rd"; Session session = Jsch.getSession( user,host,22 ); java.util.PropertIEs config = new java.util.PropertIEs(); config.put( "StrictHostKeyChecking","no" ); session.setConfig( config ); session.setPassword( password ); session.connect();

@H_404_0@然后我通过runSshCommand()方法执行命令,如下所示:

@H_404_0@在CentOS上运行SymmetricDS作为服务

@H_404_0@如何设置Java线程的cpu核心亲和力?

@H_404_0@在windows控制台比预期更多的Unicode字符

@H_404_0@你如何保持机器清醒?

@H_404_0@设置Apache POI的path

@H_404_0@try { Channel channel = session.openChannel( "exec" ); channel.setinputStream( null ); channel.setoutputStream( System.out ); ( (ChannelExec) channel ).setCommand( command ); channel.connect(); inputStream in = channel.getinputStream(); byte[] tmp = new byte[1024]; while ( true ) { while ( in.available() > 0 ) { int i = in.read( tmp,1024 ); if ( i < 0 ) { break; } System.out.print( new String( tmp,i ) ); } if ( channel.isClosed() ) { break; } try { Thread.sleep( 1000 ); } catch ( Exception ee ) { } } channel.disconnect(); } catch ( Exception e ) { e.printstacktrace(); }

@H_404_0@当我改变用户,或者如何做这个工作时,我是否需要创build另一个频道?

@H_404_0@因为如果我使用

@H_404_0@runSshCommand("su - john",session); runSshCommand("tail -1 ~/mylog.log",session);

@H_404_0@它只是执行“su”命令,但没有完成用户的更改,之后执行“tail”会导致错误,因为“tom”没有得到文件:/

@H_404_0@基本上我想我的应用程序连接到机器,更改用户,读取一个文件并返回数据。 任何人都可以点亮一下吗?

@H_404_0@哪些软件库可以通过编程方式创buildphotomosaics?

@H_404_0@无法在Eclipse中导入Apache http

@H_404_0@使用httpS和SSL的安全性:-javax.net.ssl.SSLHandshakeException:证书已过期

@H_404_0@在<4GB RAM的64位虚拟机上Java中的对象头大小

@H_404_0@杀死另一个java进程产生的java进程

@H_404_0@这里有几个问题

@H_404_0@首先,SSH连接中的每个通道独立于其他通道,并且每个可执行通道中的命令都在其自己的shell(命令行解释器)中执行。 因此,您在一个频道中所做的任何更改对其他频道都没有任何影响。 你也不能做这样的事情:

@H_404_0@runSshCommand("cd documents",session); runSshCommand("ls -l",session);

@H_404_0@(其实你可以做到这一点,但不会显示documents目录内容,而是显示目录内容。)

@H_404_0@对于cd ,可以通过将两个命令作为一个“命令”传递给同一个exec通道使用

@H_404_0@runSshCommand("cd documents; ls -l");

@H_404_0@(而不是;你也可以使用换行符来分隔命令,或者其他你的shell接受的东西。)

@H_404_0@对于su这是行不通的,我们到了第二个问题

@H_404_0@su不是一个改变当前shell状态的命令(如cd ),而是一个在现有shell中打开一个新shell的命令。 当你离开由su启动的shell时(例如通过exit , logout或者end-of-file),它只会返回到外壳,然后你再次是和以前一样的用户

@H_404_0@要传递命令到“内壳”,你必须把它们传递给shell输入。 或者使用su的-c (– --command )参数

@H_404_0@runSshCommand("su -c 'tail -1 ~/mylog.log' - john ",session);

@H_404_0@您可能会遇到第三个问题 : su会询问john的密码,并可能拒绝从标准输入读取它,但是尝试从终端读取。 而你的频道没有伪终端。 您可以尝试使用cannel.setPty(true) ,然后将密码写入输出流,但我不确定这是否正常。

@H_404_0@替代方案:而不是su -c你可以使用sudo ,它可以被配置为不要求某些命令和用户的密码(否则你将再次遇到相同的终端问题)。 或者你可以直接以john身份登录,或者使tom的日志文件可读。 (另外,我希望你的真实密码比你的源代码更好。)

解锁查看全部内容

付费后查看完整内容
限时 微信扫码支付 ¥9.9 19.9

总结

以上是编程之家为你收集整理的Java JSch更改远程机器上的用户并执行命令全部内容,希望文章能够帮你解决Java JSch更改远程机器上的用户并执行命令所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

Java相关文章

为什么套接字连接()到它自己的临时端口?
如何删除特定字符后的string中的所有内容?
如何在Linux上findJava或JRuby中的PID?
如何使用文件path自动完成bash命令行?
三星Galaxy 7“(GT-P6210)没有检测到USBdebugging?
在Linux上创buildJava守护程序服务的工具
Tomcat 7:如何正确设置初始堆大小?
脚本Gnuplot在Windows操作系统
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注