使用 JSch sudo 示例和 Channel.setPty 在远程主机上运行 sudo 命令

2024-01-04

我在以下链接中使用了 JSch Sudo 示例:

http://www.jcraft.com/jsch/examples/Sudo.java.html http://www.jcraft.com/jsch/examples/Sudo.java.html

并对它进行了一些更改并删除了所有对话框,因为我必须使用 PuTTY 将其用于 EC2 实例。

现在我的代码如下所示:

import com.jcraft.jsch.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;

public class sudo{
  public static void main(String[] arg){
    try{
      JSch jsch=new JSch();

      String host=null;
      if(arg.length>0){
        host=arg[0];
      }

      String privateKey = "my private key.pem";

      jsch.addIdentity(privateKey, "");
      Session session=jsch.getSession("ec2-user", "xx.xx.xx.xx", 22);

      session.setPassword("");
      java.util.Properties config = new java.util.Properties();
      config.put("StrictHostKeyChecking", "no");
      session.setConfig(config);

      session.connect();

      String command="sudo mkdir /data";
      String sudo_pass="";

      Channel channel=session.openChannel("exec");

      // man sudo
      // -S The -S (stdin) option causes sudo to read the password from the
      // standard input instead of the terminal device.
      // -p The -p (prompt) option allows you to override the default
      // password prompt and use a custom one.
      ((ChannelExec)channel).setCommand("sudo -S -p '' "+command);

      InputStream in=channel.getInputStream();
      OutputStream out=channel.getOutputStream();
      ((ChannelExec)channel).setErrStream(System.err);

      channel.connect();

      out.write((sudo_pass+"\n").getBytes());
      out.flush();

      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();
    }
    catch(Exception e){
      System.out.println(e);
    }
  }
}

但我收到错误

抱歉,您必须有 tty 才能运行 sudo

我也尝试使用((ChannelExec) channel).setPty(true)但我可以运行该程序一次,但下次,对于同一个 EC2 实例,我收到以下错误,但对于新实例,它第一次再次运行良好。

com.jcraft.jsch.JSchException: Session.connect: java.io.IOException: End of IO Stream Read
sudo mkdir /data
Exception in thread "main" com.jcraft.jsch.JSchException: session is down
        at com.jcraft.jsch.Session.openChannel(Session.java:791)

然后我也无法从命令行 ssh 远程主机。

有人可以指导我,我需要做什么才能运行sudo远程主机上的命令。


我正在处理的项目中有类似的代码,并且遇到了相同的错误。我使用以下方法解决了这个问题setPty(true)正如你所做的那样。

我认为您收到此错误是因为您没有关闭代码中的流。如果您使用的是 Java 1.7,则可以按如下方式使用资源块:

try( InputStream in=channel.getInputStream() ) {
    try( OutputStream out = channel.getOutputStream() ) {
    ...
    }
}

或者过去版本中的 try...finally 块模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JSch sudo 示例和 Channel.setPty 在远程主机上运行 sudo 命令 的相关文章

随机推荐

  • 列出可用 avdname 的命令是什么

    我知道我可以通过输入启动模拟器 avd emulator exe avdname 但是有没有一个命令可以列出可用的 avdnames 这个 avd 配置存储在哪里 使用sdk 工具 模拟器 这将列出所有可用的 avd emulator li
  • 马克·西曼关于私生子注射的相互矛盾的陈述。需要一些澄清

    我正在读他的书网络中的依赖注入 https rads stackoverflow com amzn click com 1935182501 1 Here https stackoverflow com questions 8393357
  • ORACLE:查找具有两列(名称如 ID、NUM)的表的 SQL 语法

    我的问题基于 查找具有两个列名的表 https stackoverflow com questions 6658696 oracle sql how to find out which table has the following two
  • Appveyor nuget分析器

    我正在尝试发明一种将 Roslyn 分析器项目打包到 NuGet 中的好方法 它需要特定的 NuGet 包结构 dll投入 analyzer not lib 为了这个工作 我必须打电话nuget pack
  • Excel 的 VBA - 设置范围

    我有一个关于设定范围的问题 我正在尝试一些东西 但它不起作用 假设我有范围 r 例如我写道 set r range a1 但此范围对于活动工作表有效 例如 如果我在工作表 1 上并且编写 r value 1 那么它将更改活动工作表上该单元格
  • 如何将用户控件添加到面板

    我在项目中创建了多个用户控件 我需要做的是能够在面板控件上在它们之间进行切换 例如 如果用户单击button1 则在删除其上的所有控件后 userControl1将被添加到面板中 依此类推 我有这个代码 panel1 Controls Ad
  • IFERROR、INDEX、MATCH 返回零而不是空格

    我正在使用以下公式 IFERROR INDEX Cleaned Post W W MATCH Combined C2 Cleaned Post C C 0 这个公式运行得很好 除了对于空白单元格 它返回 0 我希望空白单元格返回为空白 具体
  • 可可绑定问题;绑定表列不显示任何数据,控制台中没有错误

    我在将 Cocoa 项目从手动同步接口模型转换为绑定模型时遇到问题 这样我就不必担心接口粘合代码 我关注了 CocoaDevCentralCocoa 绑定教程 http cocoadevcentral com articles 000080
  • C++ 模板元编程的最佳介绍? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 静态元编程 又名 模板元编程 是一项出色的 C 技术 允许在编译时执行程序 当我读到这个规范的元编程示例
  • 当容器视图缩放centerInside时,找到android imageview中位图的位置

    我有一个RelativeLayout 其中包含一个自定义ImageView scaleType centerInside 我加载位图 通常小于imageView 如何获取绘制位图的顶部 左侧位置 我需要能够在相对于位图的位置上添加视图 Re
  • Knockoutjs - 对大型可观察数组进行排序

    我在带有可观察数组的页面上定义了一个淘汰模型 我想要有按钮来按不同属性对数组进行排序 我有一个 工作 解决方案 但对于大型数组来说它非常慢 jsFiddle http jsfiddle net 7JNrc http jsfiddle net
  • 从生成的 Protocol Buffer 类继承

    Protocol Buffer 文档警告 您永远不应该通过继承向生成的类添加行为 从他们 这会破坏内部机制并且不好 无论如何 面向对象的实践 source 协议缓冲区基础知识 https developers google com prot
  • Google Play 服务以编程方式设置应用 ID

    我知道你可以通过AndroidManifest设置com google android gms games APP ID 但是有没有办法通过某些生成器或类似的东西以编程方式设置它 None
  • 更改南迁目录

    如何更改 South 查找应用程序迁移的位置 默认情况下 South 假定应用程序的迁移位于 migrations 中 但是 我已经迁移了安装在 usr local lib python 2 6 dist packages 的第三方包的模型
  • VHDL - PhysDesignRules:367

    当我尝试从 VHDL 代码合成 实现和生成程序文件时 我收到警告 当我尝试合成时出现此错误 WARNING Xst 647 Input
  • 如何将 pyspark 数据框列拆分为两列(下面的示例)?

    该列在单行中多次使用分隔符 因此split并不那么简单 分裂后 只有第一个分隔符在这种情况下必须考虑发生的情况 截至目前 我正在这样做 不过 我觉得可以有更好的解决方案 testdf spark createDataFrame Dog me
  • 如何在android中处理搜索视图的后退按钮

    SearchView searchView SearchView MenuItemCompat getActionView menu findItem Menus SEARCH searchView setQueryHint this ge
  • 由信用卡资助的 Paypal 账户 = 10417 错误

    我来这里是为了尝试解决贝宝中没有人可以帮助我们的黑洞 我们有一个企业帐户 Paypal Express 数字商品 已验证 限制解除等 我们将贝宝快递集成罚款作为我们唯一的付款方式 但有一个问题 任何由信用卡资助的 Paypal 帐户都会完全
  • YUI - 获取真实的元素宽度?

    我正在使用 YUI 需要获取元素的真实宽度 元素的宽度可以如下确定 宽度 左边框 右边框 左内边距 右内边距 左外边距 右外边距 以下是我的想法 它似乎正在发挥作用 我只是想知道这是否是确定此问题的最佳方法 或者是否有更有效的方法 YUI
  • 使用 JSch sudo 示例和 Channel.setPty 在远程主机上运行 sudo 命令

    我在以下链接中使用了 JSch Sudo 示例 http www jcraft com jsch examples Sudo java html http www jcraft com jsch examples Sudo java htm