为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过 JSch java api 执行 linux 命令“dzdo su - john”

如何通过 JSch java api 执行 linux 命令“dzdo su - john”

RISEBY 2021-10-27 18:55:42
我想使用 java jsch 库连接到远程 linux 服务器并使用命令 dzdo su - john 切换到另一个用户,我想对该用户执行一些命令。我已经针对此要求尝试了多种方法,但我无法做到这一点,任何人都可以对此提供帮助。 public static void main(String args[])    {    String host="xxxxx.yyyy.com";    String user="user";    String password="password";    String command1="dzdo su - lucy";    try{            java.util.Properties config = new java.util.Properties();         config.put("StrictHostKeyChecking", "no");        JSch jsch = new JSch();        Session session=jsch.getSession(user, host, 22);        session.setPassword(password);        session.setConfig(config);        session.connect();        System.out.println("Connected");        Channel channel=session.openChannel("shell");        OutputStream ops = channel.getOutputStream();        PrintStream ps = new PrintStream(ops, true);         channel.connect();         ps.println(command1);         ps.println("ls -ltr");        InputStream in=channel.getInputStream();        byte[] tmp=new byte[1024];        while(true){          while(in.available()>0){            int i=in.read(tmp, 0, 1024);            if(i<0)break;            System.out.print(new String(tmp, 0, i));          }          if(channel.isClosed()){            System.out.println("exit-status: "+channel.getExitStatus());            break;          }          try{Thread.sleep(1000);}catch(Exception ee){}        }        channel.disconnect();        session.disconnect();        System.out.println("DONE");    }catch(Exception e){        e.printStackTrace();    }}    }通过执行这段代码,我得到了这样的输出并且程序没有停止 ConnectedLast login: Thu Oct  4 13:24:38 2018 from xx.xx.xxx.xx    $  dzdo su - lucy    xxxx@zr1.xxxx.com:/u/zr1.xxxx.com/lucy $ 命令 ls -ltr 没有执行。程序将在语句 while(true){---code---} 中无限循环
查看完整描述

1 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

可能是时间问题。


考虑Thread.sleep在两个println调用之间添加。


ps.println(command1);

Thread.sleep(1000);

ps.println("ls -ltr");

或者尝试禁用 PTY:


((ChannelShell)channel).setPty(false);

channel.connect();

如果可行,那么它是比延迟更强大的解决方案。


查看完整回答
反对 回复 2021-10-27
  • 1 回答
  • 0 关注
  • 220 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信