分类 技术 下的文章

Ubuntu 的 Snap 版本你不喜欢?不喜欢每一次 Firefox 的发布都要不断地改变东西?如果你重视稳定性而不是功能,你可以试试 Firefox ESR 版本。

什么是 Firefox ESR?

Firefox ESR 是 Firefox 的特别版,它不一定像普通版那样每月都有新功能,但它能提供稳定和安全的浏览体验。这适用于企业、组织和机构,在这些地方,稳定性和核心功能比闪亮的新功能更重要。

可以把 Firefox ESR 看作是 Linux 发行版的长期稳定版本。它们不一定得到全新的功能,但它们会得到定期的安全和维护更新。这给了用户一个熟悉和稳定的环境。

你为什么要关心 Firefox ESR?

Firefox 几乎每个月都会发布一个新版本。它包含安全和功能更新。

但有些人可能不喜欢各种功能的加入和删除。如果在更新之后,你一直想知道某些设置到哪里去了,或者不喜欢与以前不同的东西,Firefox ESR 可能值得一试。

基本上,如果你更看重稳定性而不是新功能,那么 Firefox ESR 就适合你。这也是 Debian 中携带的 Firefox 版本,Debian 以其是市场上最稳定的发行版之一而闻名。

让我告诉你如何在 Ubuntu 上获得 Firefox ESR。你可以同时安装 Firefox 和 Firefox-ESR 两个版本。它们的标识没有视觉上的区别,所以你必须注意你打开的是哪个火狐版本。

在 Ubuntu 中安装 Firefox ESR

在进入安装之前,让我来分享一下普通 Firefox 和 Firefox-ESR 之间的版本差异是什么。在写这篇文章的时候:

  • Firefox 的版本是 107.0-2
  • Firefox-ESR 目前的版本是 102.5.0esr

所以,如果这对你来说没问题,让我们看看第一个方法。

方法 1:使用 PPA 安装 Firefox-ESR

Firefox-ESR 在 Ubuntu 的默认仓库中是不可用的,所以你可以使用 PPA。

PPA 只不过是一个由个别技术人员或开发者维护的仓库,拥有默认仓库所没有的东西。

如果你想了解更多关于 PPA 的信息,我建议你查看我们的其他指南,其中解释了 如何在 Linux 上使用 PPA

打开你的终端,使用给定的命令来添加 Firefox-ESR 的 PPA:

sudo add-apt-repository ppa:mozillateam/ppa

然后按回车键确认你要添加 PPA:

add firefox esr repository in ubuntu

完成后,你需要更新 Ubuntu 中的仓库索引,以便从这些变化中生效:

sudo apt update

现在,你可以通过使用给定的命令来安装 Firefox-ESR:

sudo apt install firefox-esr

接下来,你可以使用给定的命令来检查你系统中 Firefox-ESR 的安装版本:

firefox-esr -v

check installed version of firefox esr in ubuntu

如何从 Ubuntu 卸载 Firefox-ESR?

如果 ESR 对你的工作来说感觉太过时了,或者由于其他原因你想从你的系统中删除它,你可以按照以下步骤删除 Firefox-ESR 包和仓库。

首先,让我们用下面的方法删除 Firefox-ESR 包:

sudo apt remove firefox-esr

现在,你可以使用给定的命令来 从 Ubuntu 删除 PPA

sudo add-apt-repository --remove ppa:mozillateam/ppa

这就完成了!

方法 2:使用 Snap 安装 Firefox-ESR

不管你爱不爱它,Snap 在 Ubuntu 上是预先配置好的,我发现使用 Snap 是安装软件包的一个很好的方法,特别是当你想避免从源码构建它们或使用 PPA 时。

使用 Snap 安装 Firefox-ESR,你需要做的就是使用给定的命令:

sudo snap install firefox --channel=esr/stable

install firefox esr using snaps in ubuntu

如何删除 Firefox-ESR Snap?

要删除 Firefox-ESR(snap 包),请使用 snap remove 命令

sudo snap remove firefox

这就完成了!

总结

我在本指南中解释了如何使用多种方法在 Ubuntu 中安装 Firefox-ESR。我个人使用 Firefox-ESR 而不是普通版本,因为我有随机崩溃的情况。

自从我改用 Firefox-ESR 后,一切都变得稳如磐石。如果你也有同样的问题,你应该试一试。


via: https://itsfoss.com/firefox-esr-ubuntu/

作者:Sagar Sharma 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我使用笔记本电脑很长时间了,但最近才切换到台式机上,以便进行远程工作。

我注意到我的扬声器不断发出嗡嗡声。这很烦人,让我头疼。我开始着手解决这个问题。了解问题的根本原因非常有趣。

我将分享我在 Linux 中修复扬声器嗡嗡声的经验。我发现它可以在同一硬件上对 Ubuntu、Debian 和 Pop OS 都有效。

需要考虑的一件事是,如果本指南不适合你,你可能遇到了严重的硬件问题。对于大多数用户来说,给定的方案应该可以解决问题。

在尝试修复之前

我试图让事情变得容易安全地遵循。你可以尝试临时修复,如果有效,则将更改永久化。但是,最好使用 Timeshift 制作系统快照。如果你在出现故障时很容易惊慌失措,你可以将系统恢复到之前的状态。

另外,检查你的声卡。在我的例子中,它是 snd_hda_intel。对于 USB 卡,它可以是 snd_usb_audio。你必须根据你的声卡更改命令。

cat /proc/asound/modules

Linux 中扬声器发出嗡嗡声的原因

梳理了无数的论坛帖子和网站后,我了解了问题的根本原因。这是因为扬声器中的电容放电。它可以通过关闭声卡的省电设置来解决。

通过关闭省电,你允许系统在这些电容放电时为其充电。这类似于在一直充电时使用电话。

你可以使用给定的命令检查你的系统是否启用了声卡的省电设置:

cat /sys/module/snd_hda_intel/parameters/power_save

power saving setting in sound card making buzzing sound in linux

如果你像我一样输出是 1,那么省电功能已打开。因此,让我们看一下方案。

不用担心。这不会显著影响你的电池百分比,因为所示方法仅适用于声卡。

尝试修复嗡嗡声问题(临时)

我之所以包括临时方法是为了确定嗡嗡声是由于电容放电引起的,还是存在严重的硬件问题。

如果此临时方案有效,你可以继续使用永久方案。

第一步是切换到 root 用户:

sudo su

然后,执行给定的命令,它应该停止嗡嗡声直到下次启动:

echo 0 > /sys/module/snd_hda_intel/parameters/power_save

如果你使用的是 USB 声卡,则必须将 snd_hda_intel 替换为 snd_usb_audio,如下所示:

echo 0 > /sys/module/snd_usb_audio/parameters/power_save

如果上述技巧解决了问题,那么你必须使变更永久化。否则,下次重启系统时更改将丢失。

修复嗡嗡声问题(永久)

在这里,我将对内核参数进行更改。

将你的工作目录更改为 /etc/modprobe.d

cd /etc/modprobe.d

现在,创建一个名为 audio_disable_powersave.conf 的新文件,并使用给定命令使用 nano 文本编辑器打开:

sudo nano audio_disable_powersave.conf

并在该文件中放入以下行以永久关闭声卡中的省电设置:

options snd_hda_intel power_save=0

fix buzzing sound in linux

对于 USB 声卡,你需要使用 snd_usb_audio

options snd_usb_audio power_save=0

现在,保存更改并退出 Nano 文本编辑器 并按 Ctrl+X 键。重启你的系统,你就可以享受无噪音的工作空间。

总结

本指南解释了嗡嗡声的原因以及如何直接解决该问题。

同样,除了电容放电之外,你可能还有其他问题,因此你应该始终尝试临时方法。

让我知道你是否能够以这种方式解决 Linux 中扬声器发出的嗡嗡声。


via: https://itsfoss.com/buzzing-noise-speaker-linux

作者:Sagar Sharma 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

BioArchLinux 是生物工作者的 Arch Linux 社区,它包含了一个生物信息学软件的 Arch Linux 仓库。这个仓库易于贡献,用户友好,可以帮助大家在 Arch Linux 及其衍生的发行版、Windows 以及 Docker 下面快速安装好生物信息软件。

BioArchLinux

为什么会有 BioArchLinux 项目?

以目前科学相关的发行版为例,它们大多基于 Ubuntu ,比如 Bio-Linux 以及 Poseidon Linux ;也有基于 CentOS 或者 RHEL 的,比如 Scientific Linux 。但是最终这些发行版都慢慢不再活跃,Scientific Linux 发出的各种 公告 也是表现出身不由己。

从 Scientific Linux 的经历可以看出,如果将各种软件包打包在一个依赖商业公司或者由商业公司主导的发行版上,发展方向就会变得不可知,最初的目标和规划自然不能得以实现。最初 Scientific Linux 依赖付费的 Linux 发行版 RHEL ,后期依赖商业公司的免费社群发行版 CentOS(CentOS 8 以及之前是一个稳定的发行版),红帽将 CentOS 8 的生命周期草草结束,进而支持滚动发行版 CentOS Stream(现在是 RHEL 的上游发行版),因此 Scientific Linux 不得不变成基于 CentOS Stream 的发行版。只能说,Scientific Linux 一开始就选择错了。

再从 Bio-Linux 的角度来看待,Bio-Linux 本质上是把各类软件包打包到 Ubuntu 内之后形成的一个发行版。这必然有一个周期,在这个一年或者两年的周期内,各类软件总会有更新的,而 Bio-Linux 不考虑这个问题,所以会出现使用过时的版本来分析数据的情况,很明显这不利于研究。而且, Bio-Linux 8 自 2014 年发布了基于 Ubuntu 14.04 LTS 的发行版之后,就没在发行新的版本了,而目前 Ubuntu 22.04 LTS 都已经出来了。Bio-Linux 的 软件包 除了老旧,还特别冗杂,我需要的包他们不全有,我不需要的包他们有很多,这毫无疑问增加了我 PC 的负担。

Poseidon Linux 也有着类似的问题。这种发布发行版的方式滞后且需要重装系统,特别不方便。实在不如直接经营一个各类包的仓库,可以快速更新,不必频繁发布 ISO 文件又可以将软件更新到最新版。

所以,如果你希望想长期使用,那么就建议使用非商业公司关联的 Linux 系统;如果你需要参与 Linux 的发展,那么你就要寻找一个方便使用第三方仓库/官方仓库、且非商业公司关联的发行版。这里我们就选择了 Arch Linux。

同时,我们也不希望只是一群为 AUR 做贡献人,因为曾经我自己的设想是这个团体可以像 RedHat 那些发行版之类的 SIG,但是 SIG 的运作模式是为官方仓库贡献包。而 AUR 只是存储一个脚本,并不是一个预先编译好的包。这样带来的麻烦有很多,首先是 AUR 不能和官方仓库的包有冲突,但是这对于生物信息的目标用户群体是个麻烦事情,比如我要找 picard,但是 community 仓库里的 picard 已经是别的同名软件了,但是它只是在 community 仓库里,我不会用到它,因此我要几经周折地找到 AUR 里的 picard-tools。AUR 另外一个不方便的点在于软件包的来源不一定不被封锁,曾经我向我师姐十分热情的推销 Arch 系的发行版,她也觉得蛮好用,但当她想从 AUR 里下载软件时候,互联网限制了她的想象。但是,当我们组成了一个有镜像源的仓库的时候,我们就不需要担心这个问题了,来自互联网封锁国家的人们就无需忍受缓慢的互联网速度和法律风险访问他们所需要的软件了。

如何使用 BioArchLinux?

首先,BioArchLinux 本身的属性决定了用户可以在哪些地方使用它。 BioArchLinux 是一个生物工作者的 Arch Linux 社区,包含了一个生物学软件的 Arch Linux 存储库、可以编辑的 wiki 以及 Matrix 聊天频道。

在 Arch Linux 中使用 BioArchLinux

正如它本身的属性所定义,它可以用于 Arch Linux 及其衍生发行版(不包括 Manjaro stable & testing),从 BioArchLinux 安装软件很容易。只需几个简单的命令即可安装所需的软件包。

# echo -e "[bioarchlinux]\nServer = https://repo.bioarchlinux.org/\$arch" >> /etc/pacman.conf
# pacman-key --recv-keys B1F96021DB62254D
# pacman-key --finger B1F96021DB62254D
# pacman-key --lsign-key B1F96021DB62254D
# pacman -Syy
# pacman -S pkg_name

在最初接触 Linux 时候,我使用 Ubuntu 。当我想要安装生信软件的时候,我曾经一下午都在处理循环依赖的问题。这或许是某些发行版的特性,而且由于我是图形化安装的,我其实对未来怎么迁移系统并没有足够的把握。对于小白来说,好不容易装好的环境想要迁移很难避免重复性的工作。Arch Linux 的特性避免了这里很多问题,从打包的粒度考虑,循环依赖可以说是很罕见的了。另外就是当你需要构建一个包,你只需要会写 Shell 脚本再看一看维基,事情会容易很多。相比于 Debian 等发行版,这样其实会有利于你迁移你安装的软件。

当然,和其他软件仓库不同的是,BioArchLinux 仓库在可能的情况下,在每个包描述中提供了一个 DOI。 这使用户能够轻松地了解有关每个包的用途和方法的更多信息,并在准备出版物时快速识别适当的引用。

$ pacman -Ss doi_number
$ pacman -Qi pkg_name

在 WSL 中使用 BioArchLinux

另外,当 Windows 和 macOS 用户需要使用 Linux 环境来运行生物信息软件的时候,也可以轻松使用 BioArchLinux。因为 BioArchLinux 同样提供 WSL 以及 Docker 镜像。

对于 Windows 用户优先推荐 WSL,因为 Docker 在 Windows 下依赖 WSL。只需要在任意一个镜像站点的 wsl 文件夹下找到 tar 文件即可。解压它,在安装了 wsl 的前提下双击 BioArch.exe 文件,就可以开始成功安装,安装好后键入下述命令即可进入:

wsl -d BioArch

在使用前需要做一些初始化的任务,比如初始化 WSL,这里的镜像地址可以更改为你喜欢的镜像,镜像列表见 mirrorlist 仓库 里的 mirrorlist.bio

# echo 'Server = https://mirrors.sdu.edu.cn/archlinux/$repo/os/$arch' > /etc/pacman.d/mirrorlist
# echo 'Server = https://mirrors.sdu.edu.cn/bioarchlinux/$arch' > /etc/pacman.d/mirrorlist.bio
# pacman -Syu

此时,你就可以使用该 WSL 了。

在 Docker 中使用 BioArchLinux

至于 Docker 的使用和 WSL 类似,只不过在安装完 Docker 后使用如下命令进入。进入后依然需要使用 WSL 初始化的命令初始 Docker 容器。

# docker pull bioarchlinux/bioarchlinux
# docker run -it --privileged --name container_name --restart=always bioarchlinux/bioarchlinux /bin/bash

BioArchLinux 如何运作?

BioArchLinux 运行流程

BioArchLinux 存储库由几个开源软件包维护。 主要工具是一个名为 lilac 的 python 应用程序。

最基本的步骤是按照 Arch Linux 和 lilac.yaml 的标准编写脚本。我们编写一个 PKGBUILD shell 脚本和一个 YAML 文件(以及可选的 Python 脚本),并将它们放在 Git 存储库的一个文件夹中。

nvchecker 读取 lilac.yaml,获取上游网站的信息,可以查看最新版本。如果 nvchecker 无法从上游网站找到包版本,它会向管理员发送电子邮件报告问题。

nvchecker 的信息发送给 lilac,由 lilac 判断包是否需要升级。如果软件包需要升级,lilac 会将软件包发送到 Arch Linux 打包工具 devtools

devtools 为软件包提供了一个干净的环境,只有 PKGBUILD shell 脚本中的依赖项列表允许构建。这可以避免在使用过程中丢失依赖项。如果包构建失败,则会自动向包维护者发送警告电子邮件。如果包构建成功,archrepo2 会将 Arch Linux 包放入特定路径,并生成一个新的数据库文件,形成一个全新的包仓库。如果 lilac.yaml 中含有维护 AUR 的指令,包更新也将退送给 AUR。

整个构建过程被记录为日志文件,可以使用 Rust 应用程序 bioarchlinux-packages 读取,并显示在日志网站上。

我们的维基网站是基于 MediaWiki 构建的。所有人都可以自由地为本网站贡献关于生物信息学软件的使用以及生物信息学概念和术语。

BioArchLinux 展望

上面讲了那么多的好,其实 BioArchLinux 也有很多的不足。

先从仓库说起,我们虽然在短短一年内有了约 4.2 k 的软件包,维护了约 4.7% AUR 包,但是,我们相比于 Debian Med 以及 bioconda 都有很大的数量上的差距,急需更多的维护者参与进来,并且需要不断提升打包的质量。

除此之外,比较急切的是我们国内镜像源目前仅仅有几家高校,南京大学、西安交通大学、山东大学以及南京邮电大学,我们希望更多的镜像站能够添加我们。另外因为计算机资源的问题,我们也没有 archive 网站,这给回滚造成了一定程度的困难。

其余就是扩大仓库的受众和加强社区的维护。虽然我们有了 WSL 还有 Dokcer,但是有些人很喜欢在虚拟机里运行,我们却提供不了 ISO 文件,也需要相关的维护人员。我们也没有专门的维基管理人员,有段时间因为没有限制用户注册,网站有被垃圾信息灌爆。

甚至我们在网站的搭建上面还是有欠缺,比如没有像 Arch Linux 那样的搜包界面,这需要更多开发人员的参与。除此之外,如何以非 root 用户的角色使用仓库仍然是一个很大的课题。

我们十分欢迎更多的人参与到我们的社区中来,一起做一些疯狂且美好的事情,不管再多困难,我相信,这个那么 FFF(community friendly, user friendly, earth friendly)的项目会长命百岁。(注:community friendly 帮助维护 Arch Linux community 的 AUR 软件包;user friendly 易于使用、以用户为中心;earth friendly 减少大家编译的次数,尽可能减少计算机资源的消耗。)

致谢

非常感谢 xTom、Mick Elliot 以及 Bipin Kumar 对这个项目的资助,也十分感谢一起为仓库工作的所有 BioArchLinux 成员。另外特别感谢 Arch Linux CN 依云 以及 imlonghao,没了他们维护的软件,BioArchLinux 不可能那么顺利的运作。同时也感谢南京大学、西安交通大学、山东大学以及南京邮电大学和其他为 BioArchLinux 提供镜像的机构和个人。最后,感谢之前 Bioinformatics Open Source Conference(BOSC)为参会免除会议费用。


作者简介:

MRes Evolutionary Biology, International Society for Computational Biology 会员


作者:Guoyi 编辑:wxy

本文由贡献者投稿至 Linux 中国公开投稿计划,采用 CC-BY-SA 协议 发布,Linux中国 荣誉推出

CFW(Cyber Firewall)是一个人性化的 Linux 防火墙。

概括

CFW(Cyber Firewall)是一个人性化的 Linux 防火墙。它旨在协助阻止拒绝服务攻击(DDoS),同时能控制 Linux 系统端口的开关。CFW 基于 Linux 原生基础设施运行,拥有良好的软件兼容性。

该软件基于 iptables 和 ipset,使用 Python 开发,使用时建议关闭发行版自带的防火墙(如 firewalld、ufw)避免冲突。

通过 CFW,你将能够:

  • 通过自定义的规则自动封禁互联网中的恶意 IP,以防止拒绝服务攻击
  • 保护 Linux 的所有端口遭受 DDoS 攻击,而不仅仅是 Web 应用
  • 获得良好的软件兼容性,原生支持 Nginx、Caddy 等服务器
  • 支持配合 CDN 使用,使用 CDN 时请将 CDN 的 IP 段设置为 CFW 白名单
  • 控制开启或关闭 Linux 系统的 TCP/UDP 端口
  • 获得友好的命令行交互式体验

背景

Web 应用程序运行在复杂的互联网中,随时可能面临恶意攻击,导致拒绝服务现象。为了封禁这些不友好的 IP,CFW 正是为此而诞生。

CFW 的灵感最初来自宝塔面板的 Nginx 防火墙。然而,使用 Nginx 防火墙的过程中遇到诸多不顺。该防火墙仅针对 Web 应用(通常是 80 和 443 端口)防御 CC 攻击,无法保护 Linux 服务器的其他端口。同时,该防火墙需要按月付费,并始终捆绑宝塔生态(最新的宝塔面板甚至需要登录绑定手机实名制的账号),从而限制了软件自由度。我们想在纯净的 Linux 中运行防火墙,并对所有端口生效,于是自己开发了一个。

由于 CFW 基于 iptables 和 ipset,不免会与发行版自带的防火墙(如 firewalld、ufw)冲突,我们增加了 CFW 对端口开关的控制。

实现

CFW 通过 ss -Hntu | awk '{print $5,$6}' 命令获取当前服务器的所有连接。客户端的请求若超过设定并发数,该 IP 将被 iptables 封禁,并存储在 ipset 数据结构中。

CFW 通过调用 iptables 命令实现 Linux 端口的开关。

安装

请先确保系统拥有以下依赖。

对于 Debian、Ubuntu 等:

sudo apt install -y curl ipset python3 git net-tools

对于 CentOS 等:

sudo yum install -y curl ipset python3 git net-tools

安装好系统依赖后,输入以下命令安装 CFW:

sudo curl https://raw.githubusercontent.com/Cyberbolt/cfw/main/install.py | python3

你也可以下载该脚本阅读,以了解该脚本所进行的工作后再执行上述命令。

完成安装后,使用 source ~/.bashrc 激活 CFW 的环境变量。(或者新打开一个 shell 环境,自动激活环境变量。)

在 Linux 终端输入 systemctl status cfw,显示 active (running) 字样说明 CFW 已成功运行,同时会在服务器重启时自动运行。

卸载

sudo curl https://raw.githubusercontent.com/Cyberbolt/cfw/main/uninstall.py | python3

配置

配置文件在 /etc/cfw/config.yaml 中,修改配置文件后运行 systemctl restart cfw 即可生效。

配置文件参数说明:

# CFW 运行端口
port: 6680
# CFW 检测连接的频率,单位:秒。此处默认 5 秒一次。
frequency: 5
# 允许每个 IP 连接的最大并发数,超过将被 CFW 封禁。
max_num: 100
# 解封 IP 的时间。此处默认 IP 被封禁后 600 秒将自动解封。若此处值为 0,则永久封禁。
unblock_time: 600
# 数据备份时间,单位:秒。
backup_time: 60

# IPv4 白名单路径。写在文本文件中,一行一个 IP,支持子网掩码。)本地地址、内网地址默认在该文件中)
whitelist: /etc/cfw/ip_list/whitelist.txt
# IPv4 黑名单路径。写在文本文件中,一行一个 IP,支持子网掩码。
blacklist: /etc/cfw/ip_list/blacklist.txt

# IPv6 白名单路径。写在文本文件中,一行一个 IP。
whitelist6: /etc/cfw/ip_list/whitelist6.txt
# IPv6 黑名单路径。写在文本文件中,一行一个 IP。
blacklist6: /etc/cfw/ip_list/blacklist6.txt

# 日志文件的路径
log_file_path: /etc/cfw/log/log.csv
# 日志文件的最大行数。(达到最大行数后将自动滚动。若此处值为 0,则不限制最大行数)
log_max_lines: 10000000

命令

命令中 [] 表示变量。

运行

  • 停止 CFW:systemctl stop cfw
  • 启动 CFW:systemctl start cfw
  • 重启 CFW:systemctl restart cfw

IP 黑名单管理

  • 手动封禁单个 IPv4 地址:cfw block [ip]
  • 手动解封单个 IPv4 地址:cfw unblock [ip]
  • 查看 IPv4 黑名单:cfw blacklist
  • 手动封禁单个 IPv6 地址:cfw block6 [ip]
  • 手动解封单个 IPv6 地址:cfw unblock6 [ip]
  • 查看 IPv6 黑名单:cfw blacklist6

Linux 端口操作

  • 放行 IPv4 端口:cfw allow [port]
  • 阻止 IPv4 端口:cfw deny [port]
  • 单独放行 IPv4 TCP 端口:cfw allow [port]/tcp,示例如 cfw allow 69.162.81.155/tcp
  • 单独阻止 IPv4 TCP 端口:cfw deny [port]/tcp,示例如 cfw deny 69.162.81.155/tcp
  • IPv4 UDP 端口操作同理
  • 查看所有放行的 IPv4 端口:cfw status
  • 放行 IPv6 端口:cfw allow6 [port]
  • 阻止 IPv6 端口:cfw deny6 [port]
  • 单独放行 IPv6 TCP 端口:cfw allow6 [port]/tcp,示例如 cfw allow6 69.162.81.155/tcp
  • 单独阻止 IPv6 TCP 端口:cfw deny6 [port]/tcp,示例如 cfw deny6 69.162.81.155/tcp
  • IPv6 UDP 端口操作同理
  • 查看所有放行的 IPv6 端口:cfw status6

日志操作

动态查询日志 cfw log [num][num] 为查询日志的条数,查询结果将按时间倒序。

相关链接

更多

如果你在使用中遇到任何问题,欢迎在 https://github.com/Cyberbolt/cfw/issues 处留言。有了你的帮助,CFW 才能日渐壮大。

总结

CFW 可以防止一定程度的 DDoS 攻击,同时能控制开启或关闭 Linux 系统的 TCP/UDP 端口,很好地帮助我们解决恶意 IP 入侵的问题。但是不要做不切实际的想象,认为 CFW 可以抵御大型 DDoS 攻击。DDoS 攻击的规模往往与成本是正相关的,必要时提升网络带宽才能解决问题的根本。


作者简介:

Cyberbolt:一个自由的 Python 开发者。


作者:Cyberbolt 编辑:wxy

本文由贡献者投稿至 Linux 中国公开投稿计划,采用 CC-BY-SA 协议 发布,Linux中国 荣誉推出

我相信几乎所有的 Linux 用户都会保持他们系统的更新。

但这种更新通常是针对默认的 包管理器。例如,更新 Ubuntu 往往意味着更新所有的 APT 软件包。

然而,还有其他的打包格式,如 Snap 和 Flatpak。Snap 应用程序会自动更新,但 Flatpak 不会。

那么你如何更新 Flatpak 软件包呢?好吧,你可以用这个命令来更新所有已安装和可更新的 Flatpak 包:

flatpak update

这很简单。但让我再讨论一下关于更新 Flatpak 的一些事情,比如说:

  • 更新所有或特定的 Flatpak 包
  • 通过软件中心更新 Flatpak 包

让我们先从终端的方法开始。

方法 1:使用终端来更新 Flatpak 包

首先让我从最实用的方法开始,你也应该从这个方法开始。

更新每一个过时的 Flatpak 包

更新现有的 Flatpak 包的整个目录是很容易的。

输入给定的命令,就可以得到过期包的列表:

flatpak update

update flatpak packages in linux

你只需输入 Y 并按下回车键,就能搞定每一个更新。

更新特定的 Flatpak 包

要更新特定的软件包,你需要可以更新的软件包的列表。你用的是你之前看到的那个命令。

flatpak update

update flatpak packages in linux

从输出中复制你要更新的软件包的名称。在以下命令中使用软件包的名称:

flatpak update package_name

例如,如果你想更新 Telegram,下面的命令可以完成这项工作:

flatpak update org.telegram.desktop

update specific package in flatpak

这就完成了。

方法 2:从软件中心更新 Flatpak 应用

有 Flatpak 内置支持的发行版会在软件中心提供 Flatpak 应用的更新。Fedora 和 Linux Mint 就是这样的发行版。

但如果你使用的是 Ubuntu,你就需要在 GNOME 软件中心添加 Flatpak 支持:

sudo apt install gnome-software-plugin-flatpak

完成后,你将在 Ubuntu 中拥有两个软件中心。这是因为默认的软件中心不是 GNOME 的,而是 Snap Store。

从系统菜单中打开这个新的软件中心:

open software center in ubuntu

进入“ 更新 Update ”页面,你会发现过时的软件包列表。这包括 APT 和 Flatpak 软件包。

update flatpak from software center

在这里,你可以一次更新所有的软件包,或者你可以有选择地更新什么。

总结

许多 Linux 桌面用户往往忘记更新 Flatpak 软件包,因为它们不包括在定期的系统更新中。

由于 Flatpak 是一个沙盒式的打包解决方案,你可能不会面临任何与过时的软件包有关的问题,但你肯定会错过新的功能和修复。

这就是为什么我建议每隔几周运行一次 Flatpak 更新命令。

我希望你喜欢这个快速的 Flatpak 小技巧。


via: https://itsfoss.com/update-flatpak/

作者:Sagar Sharma 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

使用 C 扩展为 Python 提供特定功能。

在前一篇文章中,我介绍了 六个 Python 解释器。在大多数系统上,CPython 是默认的解释器,而且根据民意调查显示,它还是最流行的解释器。Cpython 的独有功能是使用扩展 API 用 C 语言编写 Python 模块。用 C 语言编写 Python 模块允许你将计算密集型代码转移到 C,同时保留 Python 的易用性。

在本文中,我将向你展示如何编写一个 C++ 扩展模块。使用 C++ 而不是 C,因为大多数编译器通常都能理解这两种语言。我必须提前说明缺点:以这种方式构建的 Python 模块不能移植到其他解释器中。它们只与 CPython 解释器配合工作。因此,如果你正在寻找一种可移植性更好的与 C 语言模块交互的方式,考虑下使用 ctypes 模块。

源代码

和往常一样,你可以在 GitHub 上找到相关的源代码。仓库中的 C++ 文件有以下用途:

  • my_py_module.cpp: Python 模块 MyModule 的定义
  • my_cpp_class.h: 一个头文件 - 只有一个暴露给 Python 的 C++ 类
  • my_class_py_type.h/cpp: Python 形式的 C++ 类
  • pydbg.cpp: 用于调试的单独应用程序

本文构建的 Python 模块不会有任何实际用途,但它是一个很好的示例。

构建模块

在查看源代码之前,你可以检查它是否能在你的系统上编译。我使用 CMake 来创建构建的配置信息,因此你的系统上必须安装 CMake。为了配置和构建这个模块,可以让 Python 去执行这个过程:

$ python3 setup.py build

或者手动执行:

$ cmake -B build
$ cmake --build build

之后,在 /build 子目录下你会有一个名为 MyModule. so 的文件。

定义扩展模块

首先,看一下 my_py_module.cpp 文件,尤其是 PyInit_MyModule 函数:

PyMODINIT_FUNC
PyInit_MyModule(void) {
    PyObject* module = PyModule_Create(&my_module);
    
    PyObject *myclass = PyType_FromSpec(&spec_myclass);
    if (myclass == NULL){
        return NULL;
    }
    Py_INCREF(myclass);
    
    if(PyModule_AddObject(module, "MyClass", myclass) < 0){
        Py_DECREF(myclass);
        Py_DECREF(module);
        return NULL;
    }
    return module;
}

这是本例中最重要的代码,因为它是 CPython 的入口点。一般来说,当一个 Python C 扩展被编译并作为共享对象二进制文件提供时,CPython 会在同名二进制文件中(<ModuleName>.so)搜索 PyInit_<ModuleName> 函数,并在试图导入时执行它。

无论是声明还是实例,所有 Python 类型都是 PyObject 的一个指针。在此函数的第一部分中,module 通过 PyModule_Create(...) 创建的。正如你在 module 详述(my_py_module,同名文件)中看到的,它没有任何特殊的功能。

之后,调用 PyType\_FromSpec 为自定义类型 MyClass 创建一个 Python 堆类型 定义。一个堆类型对应于一个 Python 类,然后将它赋值给 MyModule 模块。

注意,如果其中一个函数返回失败,则必须减少以前创建的复制对象的引用计数,以便解释器删除它们。

指定 Python 类型

MyClass 详述在 my\_class\_py\_type.h 中可以找到,它作为 PyType\_Spec 的一个实例:

static PyType_Spec spec_myclass = {
    "MyClass",                                  // name
    sizeof(MyClassObject) + sizeof(MyClass),    // basicsize
    0,                                          // itemsize
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,   // flags
    MyClass_slots                               // slots
};

它定义了一些基本类型信息,它的大小包括 Python 表示的大小(MyClassObject)和普通 C++ 类的大小(MyClass)。MyClassObject 定义如下:

typedef struct {
    PyObject_HEAD
    int         m_value;
    MyClass*    m_myclass;
} MyClassObject;

Python 表示的话就是 PyObject 类型,由 PyObject_HEAD 宏和其他一些成员定义。成员 m_value 视为普通类成员,而成员 m_myclass 只能在 C++ 代码内部访问。

PyType\_Slot 定义了一些其他功能:

static PyType_Slot MyClass_slots[] = {
    {Py_tp_new,     (void*)MyClass_new},
    {Py_tp_init,    (void*)MyClass_init},
    {Py_tp_dealloc, (void*)MyClass_Dealloc},
    {Py_tp_members, MyClass_members},
    {Py_tp_methods, MyClass_methods},
    {0, 0} /* Sentinel */
};

在这里,设置了一些初始化和析构函数的跳转,还有普通的类方法和成员,还可以设置其他功能,如分配初始属性字典,但这是可选的。这些定义通常以一个哨兵结束,包含 NULL 值。

要完成类型详述,还包括下面的方法和成员表:

static PyMethodDef MyClass_methods[] = {
    {"addOne", (PyCFunction)MyClass_addOne, METH_NOARGS,  PyDoc_STR("Return an incrmented integer")},
    {NULL, NULL} /* Sentinel */
};

static struct PyMemberDef MyClass_members[] = {
    {"value", T_INT, offsetof(MyClassObject, m_value)},
    {NULL} /* Sentinel */
};

在方法表中,定义了 Python 方法 addOne,它指向相关的 C++ 函数 MyClass_addOne。它充当了一个包装器,它在 C++ 类中调用 addOne() 方法。

在成员表中,只有一个为演示目的而定义的成员。不幸的是,在 PyMemberDef 中使用的 offsetof 不允许添加 C++ 类型到 MyClassObject。如果你试图放置一些 C++ 类型的容器(如 std::optional),编译器会抱怨一些内存布局相关的警告。

初始化和析构

MyClass_new 方法只为 MyClassObject 提供一些初始值,并为其类型分配内存:

PyObject *MyClass_new(PyTypeObject *type, PyObject *args, PyObject *kwds){
    std::cout << "MtClass_new() called!" << std::endl;

    MyClassObject *self;
    self = (MyClassObject*) type->tp_alloc(type, 0);
    if(self != NULL){ // -> 分配成功
        // 赋初始值
        self->m_value   = 0;
        self->m_myclass = NULL; 
    }
    return (PyObject*) self;
}

实际的初始化发生在 MyClass_init 中,它对应于 Python 中的 \_\_init\_\_() 方法:

int MyClass_init(PyObject *self, PyObject *args, PyObject *kwds){
    
    ((MyClassObject *)self)->m_value = 123;
    
    MyClassObject* m = (MyClassObject*)self;
    m->m_myclass = (MyClass*)PyObject_Malloc(sizeof(MyClass));

    if(!m->m_myclass){
        PyErr_SetString(PyExc_RuntimeError, "Memory allocation failed");
        return -1;
    }

    try {
        new (m->m_myclass) MyClass();
    } catch (const std::exception& ex) {
        PyObject_Free(m->m_myclass);
        m->m_myclass = NULL;
        m->m_value   = 0;
        PyErr_SetString(PyExc_RuntimeError, ex.what());
        return -1;
    } catch(...) {
        PyObject_Free(m->m_myclass);
        m->m_myclass = NULL;
        m->m_value   = 0;
        PyErr_SetString(PyExc_RuntimeError, "Initialization failed");
        return -1;
    }

    return 0;
}

如果你想在初始化过程中传递参数,必须在此时调用 PyArg\_ParseTuple。简单起见,本例将忽略初始化过程中传递的所有参数。在函数的第一部分中,PyObject 指针(self)被强转为 MyClassObject 类型的指针,以便访问其他成员。此外,还分配了 C++ 类的内存,并执行了构造函数。

注意,为了防止内存泄漏,必须仔细执行异常处理和内存分配(还有释放)。当引用计数将为零时,MyClass_dealloc 函数负责释放所有相关的堆内存。在文档中有一个章节专门讲述关于 C 和 C++ 扩展的内存管理。

包装方法

从 Python 类中调用相关的 C++ 类方法很简单:

PyObject* MyClass_addOne(PyObject *self, PyObject *args){
    assert(self);

    MyClassObject* _self = reinterpret_cast<MyClassObject*>(self);
    unsigned long val = _self->m_myclass->addOne();
    return PyLong_FromUnsignedLong(val);
}

同样,PyObject 参数(self)被强转为 MyClassObject 类型以便访问 m_myclass,它指向 C++ 对应类实例的指针。有了这些信息,调用 addOne() 类方法,并且结果以 Python 整数对象 返回。

3 种方法调试

出于调试目的,在调试配置中编译 CPython 解释器是很有价值的。详细描述参阅 官方文档。只要下载了预安装的解释器的其他调试符号,就可以按照下面的步骤进行操作。

GNU 调试器

当然,老式的 GNU 调试器(GDB) 也可以派上用场。源码中包含了一个 gdbinit 文件,定义了一些选项和断点,另外还有一个 gdb.sh 脚本,它会创建一个调试构建并启动一个 GDB 会话:

Gnu 调试器(GDB)对于 Python C 和 C++ 扩展非常有用

GDB 使用脚本文件 main.py 调用 CPython 解释器,它允许你轻松定义你想要使用 Python 扩展模块执行的所有操作。

C++ 应用

另一种方法是将 CPython 解释器嵌入到一个单独的 C++ 应用程序中。可以在仓库的 pydbg.cpp 文件中找到:

int main(int argc, char *argv[], char *envp[])
{
    Py_SetProgramName(L"DbgPythonCppExtension");
    Py_Initialize();

    PyObject *pmodule = PyImport_ImportModule("MyModule");
    if (!pmodule) {
        PyErr_Print();
        std::cerr << "Failed to import module MyModule" << std::endl;
        return -1;
    }

    PyObject *myClassType = PyObject_GetAttrString(pmodule, "MyClass");
    if (!myClassType) {
        std::cerr << "Unable to get type MyClass from MyModule" << std::endl;
        return -1;
    }

    PyObject *myClassInstance = PyObject_CallObject(myClassType, NULL);

    if (!myClassInstance) {
        std::cerr << "Instantioation of MyClass failed" << std::endl;
        return -1;
    }

    Py_DecRef(myClassInstance); // invoke deallocation
    return 0;
}

使用 高级接口,可以导入扩展模块并对其执行操作。它允许你在本地 IDE 环境中进行调试,还能让你更好地控制传递或来自扩展模块的变量。

缺点是创建一个额外的应用程序的成本很高。

VSCode 和 VSCodium LLDB 扩展

使用像 CodeLLDB 这样的调试器扩展可能是最方便的调试选项。仓库包含了一些 VSCode/VSCodium 的配置文件,用于构建扩展,如 task.jsonCMake Tools 和调用调试器(launch.json)。这种方法结合了前面几种方法的优点:在图形 IDE 中调试,在 Python 脚本文件中定义操作,甚至在解释器提示符中动态定义操作。

VSCodium 有一个集成的调试器。

用 C++ 扩展 Python

Python 的所有功能也可以从 C 或 C++ 扩展中获得。虽然用 Python 写代码通常认为是一件容易的事情,但用 C 或 C++ 扩展 Python 代码是一件痛苦的事情。另一方面,虽然原生 Python 代码比 C++ 慢,但 C 或 C++ 扩展可以将计算密集型任务提升到原生机器码的速度。

你还必须考虑 ABI 的使用。稳定的 ABI 提供了一种方法来保持旧版本 CPython 的向后兼容性,如 文档 所述。

最后,你必须自己权衡利弊。如果你决定使用 C 语言来扩展 Python 中的一些功能,你已经看到了如何实现它。


via: https://opensource.com/article/22/11/extend-c-python

作者:Stephan Avenwedde 选题:lkxed 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出