如何终止无响应的 Linux 会话

使用 Linux 终端时,有时会卡住,失去响应,这时应该如何终止会话? 对于Linux用户来说,遇到卡住或不想要的用户会话可能是一种令人沮丧的体验。同时,这些会话可能会使您的系统面临潜在风险,使其容易受到未经授权的访问或数据泄露的影响。 无论是由行为不端的应用程序、系统故障还是用户错误引起的,这些延迟的会话都会阻碍生产力,并危及系统的安全性和性能。 但不要害怕;本文旨在为您提供重新获得控制权和维护平稳运行的Linux系统的知识和工具。通过学习处理这些情况的正确方法,您可以确保一个更安全的计算环境,并保护您的宝贵数据。 然而,在我们继续之前,我们需要澄清两个术语 TTY 和 PTS 的含义,它们在 Linux 中直接涉及到终止用户会话。 在Linux中什么是 TTY 和 PTS? 在Linux中,“PTS”和“TTY”都指用于在用户和操作系统之间进行通信的不同终端设备。它们充当输入命令和接收系统输出的接口。 TTY (Teletype) “TTY”最初代表电传打字机(Teletype),这是一种类似打字机的设备,在计算机早期用于输入和输出。 在现代 Linux 系统中,TTY 代表一个物理或虚拟控制台,用户可以在此处直接与系统互动。 PTS (Pseudo-Terminal Slave) PTS代表伪终端从设备。它是一个虚拟终端,模拟硬件终端,但不直接连接到任何物理设备。 相反,系统创建并管理它,以支持终端多路复用、远程登录和各种交互式应用程序。 例如,当您使用终端模拟器应用程序(如GNOME的终端或KDE的Konsole)来访问Linux系统时,通常会使用伪终端。 这些仿真器充当伪终端的“主”端,而shell或在终端中运行的进程充当“从”端。 当您打开多个终端窗口或选项卡时,每个窗口或选项卡对应一个单独的PTS。例如,如果打开三个终端窗口,它们可能被标识为/dev/pts/0、/dev/pts/1和/dev/pts/2。 总之,TTY和PTS都是Linux中的终端设备,允许用户与操作系统交互。TTY表示物理或虚拟控制台,而PTS用于终端模拟器,并提供多路复用和远程登录的附加功能。 有了这样的澄清,我们现在可以继续讨论主要议题。 如何在Linux中终止阻塞/不需要的用户会话 阻塞我们一般俗称“卡住” 😆 你可以通过两种方式来实现这一点,因此我们将在下面分别进行研究。 通过 TTY 终止用户会话 我们将使用 w 命令来获取有关我们 Linux 系统上已登录用户的信息。它显示了当前登录用户的信息和他们的活动。 当你运行 w 命令时,它会为每个用户提供以下细节的摘要: USER: 当前登录用户的用户名 TTY: 与用户会话相关联的终端名称或设备(例如/dev/tty1,pts/0) FROM: 用户登录的远程主机或IP地址。如果用户在本地登录,它将显示 TTY’s name 或者 - 符号 LOGIN@: 用户登录的日期和时间 IDLE: 用户会话处于非活动状态的持续时间。如果用户主动使用终端,它将显示 old JCPU: 与用户会话相关联的所有进程使用的CPU总时间 PCPU: 用户当前进程使用的CPU时间. WHAT: 用户执行的命令或与终端相关联的进程 以下是 w 命令的输出示例: ...

September 9, 2023

Python函数式编程之 update_in_fn

接上一篇内容 Python函数式编程之自定义函数get_in 。这次我们来编写函数式风格的修改字典/列表值的通用函数。 我们先来假设一种情况,你有一个嵌套的动态字典,想要更新里面某个键对应的值,我们用代码来说明 data = {'a': {'b': 1}} 现在有一个变量data 他的值是一个两层的字典,如果我要更新 b 的值到 2 常规的做法是这样的 data['a]['b'] = 2 如果我有一个更加深的字典 data = {'a': {'b': {'c': {'d': 1}}}} 更新值的写法 data['a']['b']['c']['d''] = 2 这里有一个情况发生了,当 data 是一个动态数组,你不确定中间的某个键是否存在的时候就会有报错 假如这个数据是你的系统里面其他团队开发的一个微服务,报错的信息是int 对象是不可读取索引的,这会让人很奇怪,2这个int对象明明是一个值,而不是用来查找索引数据的。 这时候程序的健壮性是比较差的,要想让程序保证健壮,我们可以使用 if-else 来判断每个键是否存在,就像这样 这里的三个if 看起来一点都不够优雅,如果其他地方也有同样的写法,只是键的顺序和名字不一样而已呢。能不能封装一个通用的函数来处理类似的情况呢? update_in Python支持面向过程、面向对象、函数式等多范式编程。我们可以使用函数式编程思想来达到这一点。先来看一个简单一点的 update_in 函数 from typing import Dict, List, T def update_in(data: Dict, ks: List, value: T): """Updates a value in a nested associative structure. Args: data (Dict): nested associative structure ks (List): sequence of keys value (Any): new value """ if len(ks) == 0: return cursor = data for k in ks[:-1]: if k not in cursor: cursor[k] = {} elif not isinstance(cursor[k], dict): cursor[k] = {} cursor = cursor[k] cursor[ks[-1]] = value 这里有一个类型 T ,这是Python内置的任意类型,在 typing 模块可以看到定义 T = TypeVar('T') ...

May 19, 2023

使用MobaXterm做端口转发

SSH端口转发的作用 SSH端口转发是一种网络技术,它允许用户通过SSH连接到远程主机并在两个计算机之间安全地传输数据。SSH端口转发将本地端口绑定到远程主机上的一个端口,从而允许用户在本地主机上运行服务并让远程主机访问该服务。 SSH端口转发可以用于以下几种情况: 安全访问远程服务:在某些情况下,用户需要访问远程主机上的服务,但是这些服务可能不安全或未加密。使用SSH端口转发,用户可以通过SSH隧道连接到远程主机,并将本地端口绑定到远程主机上的服务端口,从而安全地访问远程服务。 绕过防火墙限制:某些网络环境下,防火墙可能会限制对某些端口的访问。使用SSH端口转发,用户可以将本地端口绑定到远程主机上的允许端口,并通过SSH隧道访问被限制的服务。 远程调试应用程序:使用SSH端口转发,开发人员可以在本地主机上运行调试器,并将本地端口绑定到远程主机上的应用程序端口,从而可以在本地主机上调试远程应用程序。 SSH端口转发是一种强大的网络技术,可以帮助用户安全地访问远程服务,绕过防火墙限制以及进行远程调试应用程序等操作。 SSH端口转发的应用场景 SSH端口转发可以用于以下场景: 访问本地服务:在某些情况下,用户需要访问本地主机上的服务,但是该主机无法公开访问。使用SSH端口转发,用户可以将本地服务端口绑定到远程主机上的端口,从而在远程主机上访问本地服务。 跳板机访问内网服务:在企业内部网络中,某些服务可能只能在内网中访问。使用SSH端口转发,用户可以通过跳板机访问内网服务,而无需直接暴露内网服务。 安全文件传输:使用SSH端口转发,用户可以在两台主机之间安全地传输文件,而无需将文件暴露在公共网络中。 SSH端口转发是一种非常有用的网络技术,可以帮助用户在各种场景下安全地访问服务和传输数据。 MobaXterm软件 MobaXterm是一款功能强大的终端软件,不仅支持SSH连接,还支持端口转发功能。在MobaXterm中进行端口转发非常简单,只需要在SSH会话中配置端口转发规则即可。用户可以通过MobaXterm实现安全访问远程服务、绕过防火墙限制、访问本地服务、跳板机访问内网服务以及安全文件传输等操作。 配置MobaXterm端口转发访问服务器内网的数据库案例 假设用户需要从本地主机访问远程服务器内网中的数据库,可以使用MobaXterm进行端口转发。首先,在MobaXterm中创建一个SSH会话到远程服务器,然后在“端口转发”选项卡中添加一个新的端口转发规则。用户需要将本地主机上任意一个端口绑定到远程服务器上的数据库端口(通常是3306),并选择“本地端口绑定到远程端口”选项。然后,用户可以在本地主机上使用数据库客户端连接到绑定的本地端口,从而访问远程服务器内网中的数据库。 首先找到工具栏上的 Tunneling 按钮,如图1 图1 在弹出的 MobaSSHTunnel 窗口的左下角点击 New SSH tunnel 按钮,如图2 图2 在弹出的配置窗口,填写本地监听的端口 Forwarded port , SSH server SSH login SSH port ,然后是目标服务器的IP地址和端口 Remote server Remote port 图3 SSH login 指得是登录跳板机的用户名 可以把登录的服务器当中跳板机,把本地的端口转发到内网的其他机器 当然,还有更简单的一行命令就可以搞定的方式 😁 ssh -L local_port:remote_server:remote_port ssh_login@ssh_host_or_ip 名称 解释 local_port 本地监听端口 remote_server 目标服务器内网IP remote_port 目标服务器端口 ssh_login 跳板机使用用户名 ssh_host_or_ip 跳板机的host或者ip Socks协议 偷偷的告诉你,还可以使用这种方式来进行socks协议的转发,这个办法可以用来科学上网哟 😀上 ...

February 24, 2023

保持SSH会话在线

保持SSH会话在线 1. 概览 有多少次,我们想要保持SSH会话一直处于连接状态,以保持应用程序运行,或者只是避免在返回我们使用的SSH窗口时感到沮丧。 在本教程中,你将获得如何通过防止SSH会话超时,直到你关闭终端窗口。 2. 为什么SSH会关闭连接? 我们为了使用SSH登录到服务器上,目的服务器上的守护进程(sshd)一定是保持运行状态。如果SSH客户端一段时间没有发送到目的服务器,服务器会在超过一段时间后关闭连接。 为了防止关闭SSH连接,我们可以在客户端或者服务端进行配置。 3. 设置配置文件 有几个配置文件可以修改,以保持SSH会话的连接,避免超时。要看是从客户端配置还是服务端配置。 3.1 客户端配置 客户端文件位置 $HOME/.ssh/config 如果我们使用使用 cat $HOME/.ssh/config ,可能会得到一个错误信息 “no file found”。 $ cat $HOME/.ssh/config cat: /.ssh/config: No such file or directory 如果我们看到这个错误消息,意味着我们需要手动创建这个配置文件。如果 .ssh 目录不存在,首先创建 .ssh 目录,使用命令 mkdir $HOME/.ssh 来创建目录,如果提示目录已经存在,我们将会看到一个消息 “File exists”,请忽略即可;如果目录创建成功,我们不会看到任何输出信息。 $ mkdir $HOME/.ssh 然后创建配置文件 touch $HOME/.ssh/config。 $ touch $HOME/.ssh/config 一旦我们创建好配置文件,我们还需要使用 chmod 修改配置文件的权限,不能让所有人都可以编辑这个配置文件。 $ chmod 600 $HOME/.ssh/config 现在我们可以任何编辑器来编辑这个配置文件了,比如 nano 或者 vim ,在终端使用 vim $HOME/.ssh/config 打开配置文件。 现在让我们来添加一些配置信息到配置文件里面。在 vim 按 i 进入编辑模式,然后输入下面的内容: ...

November 29, 2022