Java 进程中的 Sudo

2023-12-21

我正在开发一个终端应用程序,它允许人们从 Swing GUI 执行 bash 命令。尝试使用 sudo 执行命令时遇到以下问题:

sudo cd /Users/{myname}/Desktop

sudo:不存在 tty 且未指定 Askpass 程序

这是我的代码:

package me.nrubin29.jterminal;

import javax.swing.*;
import javax.swing.filechooser.FileSystemView;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.*;
import java.util.ArrayList;

public class JTerminal extends JFrame {

    private JTextPane area = new JTextPane();
    private JTextField input = new JTextField("Input");

    private SimpleAttributeSet inputSAS = new SimpleAttributeSet(), output = new SimpleAttributeSet(), error = new SimpleAttributeSet();

    private File workingFolder = FileSystemView.getFileSystemView().getDefaultDirectory();

    public JTerminal() throws IOException {
        super("JTerminal");

        getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));

        StyleConstants.setForeground(inputSAS, Color.GREEN);
        StyleConstants.setBackground(inputSAS, Color.BLACK);

        StyleConstants.setForeground(output, Color.WHITE);
        StyleConstants.setBackground(output, Color.BLACK);

        StyleConstants.setForeground(error, Color.RED);
        StyleConstants.setBackground(error, Color.BLACK);

        input.addKeyListener(new KeyListener() {
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    try {
                        String command = input.getText();
                        if (command.equals("")) return;

                        setTitle("JTerminal (" + command.split(" ")[0] + ")");

                        input.setText("");
                        input.setEditable(false);

                        write(inputSAS, command);

                        Process bash = new ProcessBuilder("bash").directory(workingFolder).start();

                        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(bash.getOutputStream());
                        outputStreamWriter.write(command);
                        outputStreamWriter.close();

                        int code = bash.waitFor();

                        writeStream(bash.getErrorStream(), error);
                        writeStream(bash.getInputStream(), output);

                        input.setEditable(true);
                        setTitle("JTerminal");

                        if (code == 0 && command.split(" ").length > 1) workingFolder = new File(command.split(" ")[1]);

                    } catch (Exception ex) { error(ex); }
                }
            }

            public void keyTyped(KeyEvent e) {}
            public void keyReleased(KeyEvent e) {}
        });

        area.setBackground(Color.black);
        area.setCaretColor(Color.green);
        area.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 14));
        area.setEditable(false);

        JScrollPane pane = new JScrollPane(area);
        pane.setBorder(BorderFactory.createLineBorder(Color.GREEN));
        pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        pane.setPreferredSize(new Dimension(640, 460));

        input.setBackground(Color.black);
        input.setForeground(Color.green);
        input.setCaretColor(Color.green);
        input.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 14));
        input.setBorder(BorderFactory.createLineBorder(Color.GREEN));

        add(pane);
        add(input);

        Dimension DIM = new Dimension(640, 480);
        setPreferredSize(DIM);
        setSize(DIM);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(true);
        pack();
        setVisible(true);

        input.requestFocus();
    }

    public static void main(String[] args) throws IOException {
        new JTerminal();
    }

    private void write(SimpleAttributeSet attributeSet, String... lines) {
        try {
            if (lines.length == 0) return;
            for (String line : lines) {
                area.getStyledDocument().insertString(area.getStyledDocument().getLength(), line + "\n", attributeSet);
            }
            area.getStyledDocument().insertString(area.getStyledDocument().getLength(), "\n", attributeSet);
        }
        catch (Exception e) { error(e); }
    }

    private void error(Exception e) {
        write(error, "An error has occured: " + e.getLocalizedMessage());
        e.printStackTrace(); //TODO: temp.
    }

    private void writeStream(InputStream s, SimpleAttributeSet color) {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(s));

            ArrayList<String> strs = new ArrayList<String>();

            while(reader.ready()) strs.add(reader.readLine());

            if (strs.size() > 0) write(color, strs.toArray(new String[strs.size()]));
        }
        catch (Exception e) { error(e); }
    }
}

由于这是一个 Swing 应用程序,因此确实不存在终端 (tty),即使您使用的是 JTerminal(它好像一个终端,但实际上并没有接管你的 tty)。相反,您需要设置一个askpass程序(如错误消息所示),它将提示用户输入密码。

要设置一个askpass程序,您可以设置SUDO_ASKPASS环境变量,或者将其设置在sudoers using Path askpass ...。请参阅手册页 http://www.sudo.ws/sudo/man/1.8.7/sudo.man.html更多细节。

或者,如果您的密码不是很秘密并且您不介意看到它在屏幕上回显,请使用以下命令运行 sudo-S option.

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

Java 进程中的 Sudo 的相关文章

  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • 在文本文件中搜索单词并返回其频率

    如何在包含单词文本的文本文件中搜索特定单词并返回其频率或出现次数 使用扫描仪 String text Question how to search for a particular word in a text file containin
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • 如果使用的 JVM 是 x86 或 x64,则以不同的方式解决 Maven 依赖关系?

    我设置了一个 Maven 存储库来托管一些 dll 但我需要我的 Maven 项目根据使用的 JVM 是 x86 还是 x64 下载不同的 dll 例如 在运行 x86 版本 JVM 的计算机上 我需要从存储库下载 ABC dll 作为依赖
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • bash中的用户名、密码程序

    我有一个程序 要求用户输入用户名和密码 然后将其存储在文本文件中 第一列是用户名 第二列是密码 我需要一个命令 在用户输入用户名和新密码时替换密码 如下我拥有的 bin bash admin menu Register User echo
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • 在初始化脚本中切换用户?

    这是我的 Ubuntu 工作站上的初始化脚本 我需要以除 root 之外的其他用户身份运行命令 但我就是不知道应该如何完成它 两者都不sudo u or su newuser似乎有效 剧本 respawn console none star
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • 启动Java项目时发生类冲突:ClassMetadataReadingVisitor将接口org.springframework.asm.ClassVisitor作为超类

    我正在使用最新的Spring框架版本 3 2 2 RELEASE 开发一个Java Web项目 但是现在项目启动时遇到了问题 详细错误是 java lang IncompleteClassChangeError 类 org springfr
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在

随机推荐

  • 如何在 r markdown 中将 kable 和 ggplot 对齐在一行(并排)?

    我正在尝试编织一个 r markdown 文件pdf 但我无法将 ggplot 和 kable 对齐在一行中 我尝试过以下方法 猫 双列 kable styling 位置 float right 下面是一个最小的 可重现的示例 title
  • 从 Jenkinsfile 中的共享库导入类

    我有一个具有以下结构的共享库存储库 root src com company DeploySteps groovy vars MainDeploySteps groovy 该库通过 Jenkinsfile 导入到作业中 如下所示 libra
  • 保存后显示相同页面

    我想显示一个带有某些字段 示例中的一个 的表单 提交它 保存并显示同一页面并重置所有字段 当我提交问题时 我执行 保存 操作 但是当我显示视图时 表单仍然被填写 该模型 public class TestingModel public st
  • 多个已编译的 linq 查询可以链接在一起吗?

    我正在尝试将多个已编译的 linq 查询链接在一起 我已经成功地将两个查询链接在一起 但我无法让三个查询链正常工作 因此 这里减少了我的代码以重现问题 我的两个问题是 为什么这不起作用 以及 是否有更好的方法来保持编译查询的性能优势并避免重
  • 如何在 PHP Web 应用程序中实现 Mozilla DeepSpeech 以将语音转换为文本?

    我有一个 PHP Web 应用程序 正在寻找一种开源 高精度的语音到文本识别实现 该实现将采用语音命令来打开用户的网页 例子 进行销售 这将打开创建销售 PHP 页面 下达采购订单 打开日终报告 etc 我的问题 我想知道我们是否可以使用M
  • 如何使用代表点对复杂形状进行建模?

    我想将该图像中的白色像素数量减少到输出图像中的一些候选点或代表点 目标是对不同类型的形状进行建模 如果您只是将输出图像中的灰点连接在一起 您将拥有相同的路径 但白色像素较少 这条路径应该只有一个起点和一个终点 并且涵盖从起点到终点的所有路径
  • GDB未知目标异常(在64位环境下调试32位目标时)

    我想使用 64 位版本的 MinGW w64 x86 64 w64 mingw32 提供的 GDB 调试器来调试使用 32 位版本的 MinGW w64 x86 64 w64 mingw32 创建的 32 位目标 根据在 64 位环境中使用
  • GSON 未以 UTF-8 发送

    以下方法发送 JSON 回复 然而 在接收端 我不断收到无效字符 并且 UTF 8 无法解码数据 我究竟做错了什么 对客户端的响应 数据输出流 Get the client request clientRequest new Buffere
  • Android oreo 在白色圆形内显示图标

    我的 Android 应用程序在 Android oreo 版本上显示白色圆圈内的启动器图标 我想显示启动器图标 因为默认情况下它在奥利奥设备上是方形的 浏览了各种博客 发现 1 移动用户可以从主屏幕设置屏幕更改图标类型 但我不想要 我想默
  • getElementById 的 Javascript 简写

    JavaScript document getElementById 是否有简写 或者有什么方法可以定义一个吗 它会重复重新输入over and over var function id return document getElement
  • C# 中的自动属性是什么?它们的用途是什么?

    有人可以对 C 中的自动属性及其用途提供一个非常简单的解释吗 也许还可以提供一些示例 请尽量用通俗易懂的语言来表达 拜托 当属性访问器中不需要附加逻辑时 将使用自动属性 该声明看起来像这样 public int SomeProperty g
  • Jersey 不支持嵌套资源中的声明性超链接,这是否正确?

    public class Widget Ref resource WidgetResource class URI url public URI getUrl return url public Wonkle getWonkle retur
  • 匹配函数来匹配多个值

    我有两列 Column A Column B Apple A banana B Grape C Apple D Banana F 现在我想找到有数据的行的行号Apple D 他们的使用方式是Match函数获取行号 你可以使用这个 LOOKU
  • Jqgrid 数据类型从数组本地加载

    在我询问如何在从本地 js var 刷新下划线数据后重新应用工具栏过滤器时在这里问 https stackoverflow com questions 12983215 alternative to jqgrid triggertoolba
  • 如果您已经拥有资源,为什么要将 ETag 设置为必须要求?

    为什么要将 ETag 设置为 必须要求级别 您在 ETag 返回之前获取资源 我正在开发一个项目 其中我是向服务器发送 HTTP 请求的客户端 该服务器返回带有 ETag 的 HTTP Cache Control 标头来缓存响应 其中在每个
  • 插入具有多对一关系的 Hibernate 实体

    我对 Hibernate 相当陌生 并且有一个关于当实体具有 FK 时如何处理插入的问题 具体来说如何创建要插入的实体 我的实体简化了以下结构 Entity Table name event public class Event imple
  • 访问修饰符有什么用

    编程语言中需要使用访问修饰符吗 如果我们选择所有成员和方法作为私有 那么输出会是什么 See 封装 http en wikipedia org wiki Encapsulation object oriented programming 维
  • java 8 嵌套流

    假设您有这样的结构类 public class Review private Integer idReview private String description private ArrayList
  • Apache 2.4 with mod_wsgi: 403 Forbidden, 无权访问此服务器上的 /calbase

    所以我尝试使用 apache 2 4 和 mod wsgi 和 pythong 3 4 在 Windows 服务器上部署我的 django 项目 在我配置 httpd conf 并尝试启动安装了 mod wsgi 的 apache 之前 它
  • Java 进程中的 Sudo

    我正在开发一个终端应用程序 它允许人们从 Swing GUI 执行 bash 命令 尝试使用 sudo 执行命令时遇到以下问题 sudo cd Users myname Desktop sudo 不存在 tty 且未指定 Askpass 程