ssh - 断开连接时终止远程 ssh 命令

标签 ssh mina

我正在使用 Mina SSHD 客户端在 OpenSSH 服务器上运行远程命令。 我正在远程服务器上执行一个长时间运行的命令,并希望它在客户端 session 关闭时终止。

当我从我的 PC 终端运行这个命令时:

\#ssh -t user@server sleep 12345

这是我在远程机器上找到的:

\# ps -axf

---- Omitted for clarity

12158 ?        Ss     0:29 /usr/sbin/sshd -4
22708 ?        Ss     0:11  \\_ sshd: user@pts/3,pts/4
16894 pts/3    Ss     0:00  |   \\_ -bash
17750 pts/3    R+     0:00  |   |   \\_ ps -axf
17606 pts/4    Ss+    0:00  |   \\_ sleep 12345

---- Omitted for clarity

当我在我的机器上终止 ssh 客户端时,“sleep 12345”在远程机器上终止。

但是,当我使用 Mina Java SSH 客户端运行完全相同时,这就是我所看到的。

    SshClient client = SshClient.setUpDefaultClient();
    client.start();
    ConnectFuture connect = client.connect("user", "server", 22);

    connect.await(10000); //ms
    ClientSession session = connect.getSession();
    session.addPasswordIdentity("password");
    AuthFuture auth = session.auth();
    auth.await(10000);

    ClientChannel channel = session.createExecChannel("sleep 12345");

    OpenFuture open = channel.open();
    open.await(10000);
    Thread.sleep(15000); // ms, wait for command to run
    channel.close(true);
    session.close(true);
    client.stop();


\# ps -axf

---- Omitted for clarity

27364 ?        Ss     0:00  \\_ sshd: user@pts/0  
3277 pts/0    Ss     0:00  |   \\_ -bash
22306 pts/0    R+     0:00  |       \\_ ps axf
21699 ?        Ss     0:00  \\_ sshd: user@notty  
21796 ?        Ss     0:00      \\_ sleep 12345

---- Omitted for clarity

代码终止后,命令的父级成为初始 pid:

\# ps -axf 

21796 ?        Ss     0:00 sleep 12345


\#ps -ef | grep sleep

root     21796     1  0 08:26 ?        00:00:00 sleep 12345

Mina 中是否有一些标志或选项导致它在关闭 session 时终止我在远程服务器上的命令?

最佳答案

ssh -t user@server sleep 12345

由于“-t”选项,这会为远程 session 分配一个 PTY(伪 tty)。当 ssh session 断开连接时,PTY 将向附加到 PTY 的每个进程发送 SIGHUP。这会导致“休眠”进程退出。

要从 Mina session 中获得相同的行为,请为 channel 请求 PTY。我以前没有和 Mina 一起工作过,但看起来是这样做的:

ChannelExec channel = session.createExecChannel("sleep 12345");
channel.setUsePty(true);
// Optionally set the PTY terminal type, lines, and columns
OpenFuture open = channel.open();
...

setUsePty() 和其他 PTY 函数在 PtyCapableChannelSession 中定义这是 ChannelExec 的父类.

关于ssh - 断开连接时终止远程 ssh 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28806466/

相关文章:

ubuntu - ubuntu aws 实例上没有用户

ruby-on-rails - Rails - Mina - 无法在 database.yml 文件中加载环境变量

java - Apache Mina,如何检测何时使用无效套接字向客户端发送消息?

java - 有没有办法取消一个 key ,以便我以后仍然可以使用 java nio 读取它

linux - 控制客户端(linux)

github - teamcity github ssh 连接挂起

java - 应用程序需要很长时间才能终止

java - 如何在java中实现无符号字节,限制是大小只能是1个字节

bash - 自动化 SSH 和运行命令

amazon-web-services - scp(安全复制)到 ec2 实例,无需密码