Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSch问题-无法检索完整的命令输出_Java_Ssh_Jsch - Fatal编程技术网

Java JSch问题-无法检索完整的命令输出

Java JSch问题-无法检索完整的命令输出,java,ssh,jsch,Java,Ssh,Jsch,我使用JSch连接到SSH并执行命令。其中一个命令发出一个大输出。在终端中,如果执行命令,则必须按enter键才能查看整个输出。使用JSch我无法检索整个输出 当我使用交互式终端登录时,命令输出在填充屏幕后停止,并等待输入 代码取自 : 公共类SshConnectionManager{ 非公开静态会议; 专用静态信道; 私有静态字符串username=“”; 私有静态字符串密码=”; 私有静态字符串hostname=“”; 私有静态会话getSession(){ if(session==null

我使用JSch连接到SSH并执行命令。其中一个命令发出一个大输出。在终端中,如果执行命令,则必须按enter键才能查看整个输出。使用JSch我无法检索整个输出

当我使用交互式终端登录时,命令输出在填充屏幕后停止,并等待输入

代码取自 :

公共类SshConnectionManager{
非公开静态会议;
专用静态信道;
私有静态字符串username=“”;
私有静态字符串密码=”;
私有静态字符串hostname=“”;
私有静态会话getSession(){
if(session==null | |!session.isConnected()){
会话=连接(主机名、用户名、密码);
}
返回会议;
}
专用静态通道getChannel(){
if(channel==null | |!channel.isConnected()){
试一试{
channel=(ChannelShell)getSession().openChannel(“shell”);
channel.connect();
}捕获(例外e){
System.out.println(“打开通道时出错:+e”);
}
}
返回通道;
}
专用静态会话连接(字符串主机名、字符串用户名、字符串密码){
JSch JSch=新的JSch();
试一试{
session=jSch.getSession(用户名、主机名、22);
属性配置=新属性();
配置放置(“检查”、“否”);
session.setConfig(config);
session.setPassword(密码);
System.out.println(“将SSH连接到“+hostname+”-请等待几秒钟…”);
session.connect();
System.out.println(“已连接!”);
}捕获(例外e){
System.out.println(“连接到“+hostname+”:“+e”时出错);
}
返回会议;
}
私有静态void executeCommands(列表命令){
试一试{
Channel=getChannel();
System.out.println(“发送命令…”);
发送命令(通道、命令);
读通道输出(通道);
System.out.println(“发送命令完成!”);
}捕获(例外e){
System.out.println(“在执行命令时发生错误:”+e);
}
}
专用静态无效发送命令(通道、通道、列表命令){
试一试{
PrintStream out=新的PrintStream(channel.getOutputStream());
out.println(“#!/bin/bash”);
用于(字符串命令:命令){
out.println(命令);
}
out.println(“退出”);
out.flush();
}捕获(例外e){
System.out.println(“发送命令时出错:“+e”);
}
}
专用静态无效读通道输出(通道){
字节[]缓冲区=新字节[1024];
试一试{
InputStream in=channel.getInputStream();
字符串行=”;
while(true){
while(in.available()>0){
inti=in.read(缓冲区,0,1024);
if(i<0){
打破
}
行=新字符串(缓冲区,0,i);
系统输出打印项次(行);
}
如果(第行包含(“注销”)){
打破
}
if(channel.isClosed()){
打破
}
试一试{
睡眠(1000);
}捕获(异常ee){}
}
}捕获(例外e){
System.out.println(“读取通道输出时出错:+e”);
}
}
公共静态无效关闭(){
通道断开();
session.disconnect();
System.out.println(“断开的通道和会话”);
}
公共静态void main(字符串[]args){
List命令=new ArrayList();
命令。添加(“ls-l”);
executeCommands(命令);
close();
}
}

通常不应使用“shell”通道来自动执行命令

“shell”频道旨在实现交互式shell会话

因此,它需要PTY(伪终端),它具有对人类友好,但对机器不友好的副作用,会破坏代码

改用“exec”频道


如果您出于某种原因需要或想要使用“shell”频道(但不要这样做,它无论如何都会咬到您),请确保在
之前调用
.setPty(false)
。connect

channel = (ChannelShell)getSession().openChannel("shell");
channel.setPty(false);
channel.connect();

旁注:

  • “#!/bin/bash”
    完全是胡说八道。shell忽略所有以
    #
    开头的命令(它是注释)。发送它没有意义
  • 不要使用StrichostKeyChecking=no。看

通常不应使用“shell”通道来自动执行命令

“shell”频道旨在实现交互式shell会话

因此,它需要PTY(伪终端),它具有对人类友好,但对机器不友好的副作用,会破坏代码

改用“exec”频道


如果您出于某种原因需要或想要使用“shell”频道(但不要这样做,它无论如何都会咬到您),请确保在
之前调用
.setPty(false)
。connect

channel = (ChannelShell)getSession().openChannel("shell");
channel.setPty(false);
channel.connect();

旁注:

  • “#!/bin/bash”
    完全是胡说八道。shell忽略所有以
    #
    开头的命令(它是注释)。发送它没有意义
  • 不要使用StrichostKeyChecking=no。看

您链接到的问题中有许多不同的代码。给我们看看你的代码!检查链接内的SshConnectionManager代码。我使用相同的代码进行ssh连接和执行。它是