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

我试图连接到主机,然后更改用户使用“苏 – 约翰”,然后执行一个命令为约翰。 仅使用JSch可能吗?

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

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

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();

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

在CentOS上运行SymmetricDS作为服务

如何设置Java线程的CPU核心亲和力?

在Windows控制台比预期更多的Unicode字符

你如何保持机器清醒?

设置Apache POI的path

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(); }

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

因为如果我使用

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

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

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

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

无法在Eclipse中导入Apache HTTP

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

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

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

这里有几个问题。

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

runSshCommand("cd Documents",session); runSshCommand("ls -l",session);

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

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

runSshCommand("cd Documents; ls -l");

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

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

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

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

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

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

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

相关文章

本文从从Bitcask存储模型讲起,谈轻量级KV系统设计与实现。从...
内部的放到gitlab pages的博客,需要统计PV,不蒜子不能准确...
PCM 自然界中的声音非常复杂,波形极其复杂,通常我们采用的...
本文介绍如何离线生成sst并在线加载,提供一种用rocksdb建立...
验证用户输入是否正确是我们应用程序中的常见功能。Spring提...
引入pdf2dom &lt;dependency&gt; &lt;groupId&a...