Java 和 SSH:维护连接

2023-11-30

目标:通过一个连接和多个会话或一个持久会话远程控制 ssh 服务器。

问题 1:我目前使用 sshj 通过 SSH 进行一些远程控制,它运行良好,但我似乎无法让它正确处理提示。 (主机不提供真正的root权限,只提供sudo -i,所以我需要先登录)。 问题 2:我下载了 ExpectJ 来处理提示,但我无法在登录并以 root 身份进行身份验证后弄清楚如何维护会话。

目前的Hack解决方案要求我每次都重新登录:

public class Expect {
    Spawn shell;
    ExpectJ exp;
    String host;
    int port;
    String username;
    String passwd;
    boolean sudo = false;
    public Expect(String host,int port,String username,String passwd) throws IOException, TimeoutException, ExpectJException{

        exp = new ExpectJ(5);
        this.host = host;
        this.port = port;
        this.username = username;
        this.passwd = passwd;
        shell = exp.spawn(host, port, username, passwd);
        shell.send("sudo netstat -natvp  | grep Xtightvnc\n");
        System.out.println(shell.getCurrentStandardOutContents());
        try{
            shell.expect("[sudo] password for #######:");
            shell.send(passwd+"\n");
        }
        catch (IOException ex){
            String err = ex.toString();
            if(!err.equals("java.io.IOException: End of stream reached, no match found")){
                throw new IOException(ex);
            }
        }
    }

问题1:ssh可以用来“期待”密码提示吗?我找不到任何暗示此类控制的文档。

问题2:如何修改上面的Expect代码来维持一个可以多次调用的持久连接?我希望在达到 root 身份验证状态后能够继续交互,但一旦发送初始命令,Spawn 总是会关闭。


问题1:ssh可以用来“期待”密码提示吗?我找不到任何暗示此类控制的文档。

sshj 提供的主要是 shell 或命令的 I/O 流的句柄,以及获取退出状态等信息的方法。

问题2:如何修改上面的Expect代码来维持一个可以多次调用的持久连接?我希望在达到 root 身份验证状态后能够继续交互,但一旦发送初始命令,Spawn 总是会关闭。

支持多路复用会话,甚至支持单个 SSH 连接上的并发会话。但请注意,一个 shell/命令/子系统只能有一个会话。

您使用哪种类型的会话,即Session.Shell(通过session.startShell)或Session.Command(通过session.exec)?在后一种情况下,一旦执行完命令,会话就会meant to关闭,这是预期的行为。

通常不会推荐使用 Shell 而不是 Command,但由于您配备了 ExpectJ,我猜它可以处理提示等,您可能会想走这条路。如果存在字符回显等问题,请使用 PTY 选项(而不是 session.allocateDefaultPTY 调用 session.allocatePTY ,它需要一大堆参数,请查看allocateDefaultPTY 的来源).

代码示例:Shell, Command

另外,如果您将问题范围缩小到 sshj 的错误,请在问题跟踪器上报告它:)

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

Java 和 SSH:维护连接 的相关文章

随机推荐

  • 在电子中打开pdf文件

    我需要构建一个应用程序 用户可以在应用程序中打开 PDF 文件 即不通过打开新的浏览器窗口 我需要实现一个后退按钮 可能还需要在 PDF 上实现一些覆盖 有谁知道在 Electron 中是否有一个好的方法来做到这一点 如果您对 Chrome
  • Future.wait() 用于多个 future

    当我的设备没有互联网连接时 我试图捕获错误 我构建了 2 个未来方法 1 个用于导入 json 1 个用于查看数据库 我有一个未来的构建器 它应该在构建网格视图之前等待两个未来完成 但似乎由于连接错误而过早地调用了offlineFlashC
  • 通过 OBEX Object PushProfile 通过蓝牙接收文件

    我的设备使用 OBEX 对象推送配置文件 OPP 通过蓝牙发送数据 使用 adb logcat 我看到我的 Android 设备收到一个连接 但中止此连接 08 22 11 14 37 939 I BtOppRfcommListener 2
  • xslt1.0 替换不起作用

    我的 URL 带有一些特殊字符 我想替换它们 并且我正在使用 xslt 1 0 所以我编写如下代码
  • 限制 Docker 仅公开来自特定 IP 地址的端口

    如何限制 Docker 暴露的容器端口仅来自 IP 列表 只有此 IP 列表才能访问此端口 我尝试过 iptables I DOCKER p tcp dport PORT X j REJECT reject with icmp port u
  • GDB远程调试:无法停止线程

    我有一个数据库服务器在一个目标上 我像这样发射gdbserver 2345 bin ls 接下来 我从主机连接 gdb 并尝试发出下一个命令 gdb target remote 192 168 1 2 2345 Remote debuggi
  • 在 Access SQL 中查询“工作周”

    我有一个来自 MS Excel 2007 的公式 它返回特定月份内特定日期的工作周 B1 IF AND WEEKDAY A2 1 lt gt 1 A2 DATE YEAR A2 MONTH A2 1 A2 WEEKDAY A2 1 7 IF
  • 用于向量和矩阵计算的高性能数学库

    在哪里可以找到矢量和矩阵计算的快速库 我需要高性能 Update I need it for games calculations Go for Blaze Also check out the bench marking in paral
  • 即使显式调用析构函数后也会自动销毁对象

    以下程序 include
  • 应用程序在 iOS 9 上卡在启动屏幕中且没有错误

    我的应用程序在 iPhone 和模拟器上的 iOS 9 中都卡在启动屏幕上 我可以在 iOS 8 或更低版本的设备和模拟器上运行它 没有任何问题 我的同事在开发同一个应用程序时也遇到了完全相同的问题 没有错误或任何东西 只是挂在启动屏幕上
  • 在 Android 中的 FirestoreRecyclerAdapter 中显示 ServerValue.TIMESTAMP

    我想在列表中显示服务器时间戳 实际上是日期 这FirestoreRecyclerAdapter由此类提供 仅保留时间戳相关方法 public class Lista private Long timestamp private Map
  • 基于日期比较R的子集数据集

    我有一个数据集 如下所示 Col1 Col2 Col3 CutoffDate 12001 Yes 2008 08 15 2008 08 10 12001 Yes 2008 08 22 2008 08 10 12001 Yes 2008 08
  • 如何修复从 GEOS 转换为 s2 引起的球面几何误差

    我有同样的问题连接空间数据时如何解决球面几何故障 我以前可以使用的代码现在不能用于从 GEOS 到 s2 的转换 我不确定如何创建此错误的可重现示例 sf 包附带的示例数据集可以很好地使用此代码 因为我确信它们也已更新为可以与 s2 包一起
  • 带控件的表单级别的按键

    我想知道是否可以处理KeyPress表单级别的事件当有控制时以一种形式 当表单上没有控件时 我可以实现此目的 但是当我添加某些内容 例如按钮 时 表单会失去焦点 并且我无法将其返回 即使使用Me Focus 焦点仍位于按钮上 有办法做到吗
  • 成功更改 JS 中的不可变或原始数据类型。那么这些是原语还是 JS 概念是错误的?

    据我所知 JS 中有 4 个原语 直接存储值 而不是引用另一个内存位置的原语 String Number Boolean Symbol 我没有数undefined null 因为它们是特殊的数据类型 并且不通过继承链共享对象构造函数 现在
  • 清除 ASP.NET 中的文本框历史记录

    如何清除文本框的历史记录 我已设置 autocomplet off 并将 AutoCompleteType 设置为禁用 当我在 Chrome Firefox 中双击文本框时 会出现历史记录 文本 因此当我单击它时 文本将被插入到文本框中 有
  • 何时使用 OpenCL API 标量数据类型?

    我一直无法理解何时使用 OpenCL API 数据类型 如 cl float cl uchar 等 可以在此处找到 http www khronos org registry cl sdk 1 0 docs man xhtml scalar
  • Java:如何使用 switch 语句[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Java 中比较字符串 我无法理解如何使用 Java switch 语句 在执行其中一个 case 语句中的方法后 它仍然会转到默认语句并运行该语句 这是代码 Scanner scanner
  • Sympy:求解具有初始条件误差的微分方程

    SinceSympy版本 1 2 PythonSympy已经实现了在给定一些初始条件的情况下求解简单微分方程中的常数的能力 我试图测试此功能 但不断出现我不知道如何解决的错误 The 文档表示初始条件的格式如下 我尝试遵循实现该功能的实际拉
  • Java 和 SSH:维护连接

    目标 通过一个连接和多个会话或一个持久会话远程控制 ssh 服务器 问题 1 我目前使用 sshj 通过 SSH 进行一些远程控制 它运行良好 但我似乎无法让它正确处理提示 主机不提供真正的root权限 只提供sudo i 所以我需要先登录