我试图连接到主机,然后更改用户使用“苏 – 约翰”,然后执行一个命令为约翰。 仅使用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的日志文件可读。 (另外,我希望你的真实密码比你的源代码更好。)