Linux 常见用例汇总

注:本文为 Linux 常见用例文章合辑

部分内容已过时,未更新整理。


img
img


检查 Linux 上的 glibc 版本

译者:joeren

| 2014-11-27 21:33

问:检查 Linux 系统上的 GNU C 库(glibc)的版本?

GNU C 库(glibc)是标准 C 库的 GNU 实现。glibc 是 GNU 工具链的关键组件,用于和二进制工具和编译器一起使用,为目标架构生成用户空间应用程序。

当从源码进行构建时,一些 Linux 程序可能需要链接到某个特定版本的 glibc。在这种情况下,你可能想要检查已安装的 glibc 信息以查看是否满足依赖关系。

这里介绍几种简单的方法,方便你检查 Linux 上的 glibc 版本。

方法一

下面给出了命令行下检查 GNU C 库的简单命令。

$ ldd --version

img

在本例中,glibc 版本是2.19

方法二

另一个方法是在命令行 “输入”glibc 库的名称(如,libc.so.6),就像命令一样执行。

输出结果会显示更多关于glibc 库的详细信息,包括 glibc 的版本以及使用的 GNU 编译器,也提供了 glibc 扩展的信息。glibc 变量的位置取决于 Linux 版本和处理器架构。

在基于 Debian 的 64 位系统上:

$ /lib/x86_64-linux-gnu/libc.so.6

在基于 Debian 的 32 位系统上:

$ /lib/i386-linux-gnu/libc.so.6

在基于 Red Hat 的 64 位系统上:

$ /lib64/libc.so.6

在基于 Red Hat 的 32 位系统上:

$ /lib/libc.so.6

下图中是输入 glibc 库后的输出结果样例。

img

via: http://ask.xmodulo.com/check-glibc-version-linux.html


在 wget 中禁用 HTTP 转发

译者:geekpi

校对:wxy

| 2014-11-26 22:47

问: 当用 wget 获取一个重定向到 URL Y 的 URL X 的时候,wget 默认会自动获取 URL Y。
要强制获取不带重定向的 URL X,该如何禁用 wget 重定向 URL 的功能。

在 HTTP 标准中,重定向响应(带 3XX 的 HTTP 响应)说明请求的 URL 被移到了新的位置。重定向相应接着包含了目标重定向的 URL。

像常规的 HTTP 客户端,wget 支持 URL 重定向(也叫 URL 转发),意味着当你尝试下载一个重定向的 URL 时,wget 会自动跟随 URL 重定向获取重定向后的资源。如果你由于一些原因想要禁用 URL 重定向,并停止 3XX 的状态码,你可以使用 wget 的 “–max-redirect=number” 选项。这个选项用来指定最大(递归)重定向的数字,默认是 20。

如果你想要禁用 wget 中的 HTTP 重定向,使用 “–max-redirect=0”

$ wget --max-redirect=0 http://www.aaa.com/a.html

--2014-10-31 23:08:58--  http://www.aaa.com/a.htmlResolving aaa.com (aaa.com)... 1.2.3.4Connecting to aaa.com (aaa.com)|1.2.3.4|:80... connected.HTTP request sent, awaiting response... 301 Moved PermanentlyLocation: http://www.bbb.com/b.html [following] 0 redirections exceeded.

如你所见,当 wget 遇到 HTTP 重定向响应时,它不会跟着重定向,并以 “0 redirections exceeded”(超出 0 次重定向)的错误信息停止。它同样会显示一个 HTTP 的状态码(比如 301)。

注意一下 curl,另外一个类似的 HTTP 客户端,行为正好相反。默认上,curl 并不会跟随 URL 重定向。要强制使 cutl 重定向到一个 URL,你要使用 “-L” 选项。

via: http://ask.xmodulo.com/disable-http-redirect-wget.html


创建和挂载 XFS 文件系统

译者: LCTT Vic___

| 2014-11-18 07:50

问: 格式化和挂载 XFS 文件系统的 Linux 命令是什么呢?

XFS 是高性能文件系统,SGI 为他们的 IRIX 平台而设计。自从 2001 年移植到 Linux 内核上,由于它的高性能.,XFS 成为了许多企业级系统的首选,特别是有大量数据,需要结构化伸缩性和稳定性的。例如,RHEL/CentOS 7 和 Oracle Linux 将 XFS 作为默认文件系统,SUSE/openSUSE 已经为 XFS 做了长期支持。

XFS 有许多独特的性能提升功能使他从众多文件系统中脱颖而出,像可伸缩 / 并行 IO,元数据日志,热碎片整理,IO 暂停 / 恢复,延迟分配等。

如果你想要创建和挂载 XFS 文件系统到你的 Linux 平台,下面是相关的操作命令。

img

安装 XFS 系统工具集

首先,你需要安装 XFS 系统工具集,这样允许你执行许多 XFS 相关的管理任务。(例如:格式化,扩展,修复,设置配额,改变参数等)

Debian, Ubuntu , Linux Mint 系统:

$ sudo apt-get install xfsprogs

Fedora, CentOS, RHEL 系统:

$ sudo yum install xfsprogs

其他版本 Linux:

$ sudo pacman -S xfsprogs

创建 XFS 格式分区

先准备一个分区来创建 XFS。假设你的分区在 /dev/sdb, 如下:

$ sudo fdisk /dev/sdb

img

假设此创建的分区叫 /dev/sdb1。

接下来,格式化分区为 XFS,使用 mkfs.xfs 命令。如果已有其他文件系统创建在此分区,必须加上 “-f” 参数来覆盖它。

$ sudo mkfs.xfs -f /dev/sdb1

img

至此你已经准备好格式化后分区来挂载。假设 /storage 是 XFS 本地挂载点。使用下述命令挂载:

$ sudo mount -t xfs /dev/sdb1 /storage

验证 XFS 挂载是否成功:

$ df -Th /storage

img

如果你想要启动时自动挂载 XFS 分区在 /storage 上,加入下列行到 /etc/fstab:

/dev/sdb1  /storage xfs  defaults  0  0

via: http://ask.xmodulo.com/create-mount-xfs-file-system-linux.html

译者:Vic___/VicYu 校对:wxy


XFS 文件系统扩展

译者:GOLinux

校对:wxy

| 2014-10-12 14:58

:我的磁盘上有额外的空间,所以我想要扩展其上创建的现存的 XFS 文件系统,以完全使用额外空间。怎样才是扩展 XFS 文件系统的正确途径?

XFS 是一个开源的(GPL)日志文件系统,最初由硅谷图形(SGI)开发,现在大多数的 Linux 发行版都支持。事实上,XFS 已被最新的 CentOS/RHEL 7 采用,成为其默认的文件系统。在其众多的特性中,包含了 “在线调整大小” 这一特性,使得现存的 XFS 文件系统在已经挂载的情况下可以进行扩展。然而,对于 XFS 文件系统的缩减却还没有支持。

要扩展一个现存的 XFS 文件系统,你可以使用命令行工具 xfs_growfs,这在大多数 Linux 发行版上都默认可用。由于 XFS 支持在线调整大小,目标文件系统可以挂在,也可以不挂载。

下面展示了xfs_growfs的基本用法:

img

作为目标 XFS 文件系统来扩展,你可以指定挂载点、磁盘分区或者逻辑卷(在使用 LVM 时),使用数据块数量来指定新的 XFS 文件系统的大小。你可以使用 xfs_info 命令行工具来检查数据块大小和数量:

img

要将 XFS 文件扩展到 1986208:

$ sudo xfs_growfs /dev/centos/root -D 1986208

如果你不使用 “-D” 选项来指定大小,xfs_growfs 将会自动扩展 XFS 文件系统到最大的可用大小。

$ sudo xfs_growfs /dev/centos/root

img

注意,当你扩展一个现存的 XFS 文件系统时,必须准备好事先添加用于 XFS 文件系统扩展的空间。这虽然是很显然的事,但是如果在所在的分区或磁盘卷上没有空闲空间可用的话,xfsgrowfs 就没有办法了。同时,如果你尝试扩展 XFS 文件系统大小到超过磁盘分区或卷的大小,xfsgrowfs 将会失败。

img

via: http://ask.xmodulo.com/expand-xfs-file-system.html


如何修复 “sshd error: could not load host key”

译者:GOLinux

校对:wxy

| 2014-11-14 16:00

:当我尝试 SSH 到一台远程服务器时,SSH 客户端登陆失败并提示 “Connection closed by X.X.X.X”。在 SSH 服务器那端,我看到这样的错误消息:“sshd error: could not load host key.”。这发生了什么问题,我怎样才能修复该错误?

该 SSH 连接错误的详细症状如下。

SSH 客户端方面:当你尝试 SSH 到一台远程主机时,你没有看见登录屏幕,你的 SSH 连接就立即关闭,并提示此消息:“Connection closed by X.X.X.X”。

SSH 服务器方面:在系统日志中,你看到如下错误消息(如,在 Debian/Ubuntu 上,/var/log/auth.log)。

Oct 16 08:59:45 openstack sshd [1214]: error: Could not load host key: /etc/ssh/ssh_host_rsa_keyOct 16 08:59:45 openstack sshd [1214]: error: Could not load host key: /etc/ssh/ssh_host_dsa_keyOct 16 08:59:45 openstack sshd [1214]: error: Could not load host key: /etc/ssh/ssh_host_ecdsa_keyOct 16 08:59:45 openstack sshd [1214]: fatal: No supported key exchange algorithms [preauth]

导致该问题的根源是,sshd 守护进程不知怎么地不能加载 SSH 主机密钥了。

当 OpenSSH 服务器第一次安装到 Linux 系统时,SSH 主机密钥应该会自动生成以供后续使用。如果,不管怎样,密钥生成过程没有成功完成,那就会导致这样的 SSH 登录问题。

让我们检查能否在相应的地方找到 SSH 主机密钥。

$ ls -al /etc/ssh/ssh*key

img

如果 SSH 主机密钥在那里找不到,或者它们的大小被截断成为 0(就像上面那样),你需要从头开始重新生成主机密钥。

重新生成 SSH 主机密钥

在 Debian、Ubuntu 或其衍生版上,你可以使用 dpkg-reconfigure 工具来重新生成 SSH 主机密钥,过程如下:

$ sudo rm -r /etc/ssh/ssh*key$ sudo dpkg-reconfigure openssh-server

img

在 CentOS、RHEL 或 Fedora 上,你所要做的是,删除现存(有问题的)密钥,然后重启 sshd 服务。

$ sudo rm -r /etc/ssh/ssh*key$ sudo systemctl restart sshd

另外一个重新生成 SSH 主机密钥的方式是,使用 ssh-keygen 命令来手动生成。

$ sudo ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key$ sudo ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key$ sudo ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key

img

在生成新的 SSH 主机密钥后,确保它们能在 /etc/ssh 目录中找到。此时,不必重启 sshd 服务。

 $ ls -al /etc/ssh/ssh*key

现在,再试试 SSH 到 SSH 服务器吧,看看问题是否已经离你而去了。


via: http://ask.xmodulo.com/sshd-error-could-not-load-host-key.html


安装 autossh SSH 会话管理工具

作者:Dan Nanni

译者:Vic020/VicYu

校对:wxy

| 2015-05-18 08:50

问: 我打算在 linux 上安装 autossh,我应该怎么做呢?

autossh 是一款开源工具,可以帮助管理 SSH 会话、自动重连和停止转发流量。autossh 会假定目标主机已经设定 无密码 SSH 登陆,以便 autossh 可以重连断开的 SSH 会话而不用用户操作。

只要你建立 反向 SSH 隧道 或者 挂载基于 SSH 的远程文件夹,autossh 迟早会派上用场。基本上只要需要维持 SSH 会话,autossh 肯定是有用的。

img

下面有许多 linux 发行版 autossh 的安装方法。

Debian 或 Ubuntu 系统

autossh 已经加入基于 Debian 系统的基础库,所以可以很方便的安装。

$ sudo apt-get install autossh

Fedora 系统

Fedora 库同样包含 autossh 包,使用 yum 安装。

$ sudo yum install autossh

CentOS 或 RHEL 系统

CentOS/RHEL 6 或早期版本,需要开启第三库 Repoforge 库, 然后才能使用 yum 安装.

$ sudo yum install autossh

CentOS/RHEL 7 以后,autossh 已经不在 Repoforge 库中。你需要从源码编译安装(例子在下面)。

Arch Linux 系统

$ sudo pacman -S autossh

Debian 或 Ubuntu 系统中从源码编译安装

如果你想要使用最新版本的 autossh,你可以自己编译源码安装

$ sudo apt-get install gcc make$ wget http://www.harding.motd.ca/autossh/autossh-1.4e.tgz$ tar -xf autossh-1.4e.tgz$ cd autossh-1.4e$ ./configure$ make$ sudo make install

CentOS, Fedora 或 RHEL 系统中从源码编译安装

在 CentOS/RHEL 7 以后,autossh 不在是预编译包。所以你不得不从源码编译安装。

$ sudo yum install wget gcc make$ wget http://www.harding.motd.ca/autossh/autossh-1.4e.tgz$ tar -xf autossh-1.4e.tgz$ cd autossh-1.4e$ ./configure$ make$ sudo make install

via: http://ask.xmodulo.com/install-autossh-linux.html


在 Linux 中更改文本文件的字符编码

译者:wangjiezhe

校对:wxy

| 2014-11-14 15:42

:在我的 Linux 系统中有一个编码为 iso-8859-1 的字幕文件,其中部分字符无法正常显示,我想把文本改为 utf8 编码。在 Linux 中,有没有一个好的工具来转换文本文件的字符编码?

正如我们所知道的那样,电脑只能够处理低级的二进制值,并不能直接处理字符。当一个文本文件被存储时,文件中的每一个字符都被映射成二进制值,实际存储在硬盘中的正是这些 “二进制值”。之后当程序打开文本文件时,所有二进制值都被读入并映射回原始的可读字符。只有当所有需要访问这个文件的程序都能够 “理解” 它的编码,即二进制值到字符的映射时,这个 “保存和打开” 的过程才能很好地完成,这也确保了可理解数据的往返过程。

如果不同的程序使用不同的编码来处理同一个文件,源文件中的特殊字符就无法正常显示。这里的特殊字符指的是非英文字母的字符,例如带重音的字符(比如 ñ,á,ü)。

然后问题就来了: 1)我们如何确定一个确定的文本文件使用的是什么字符编码? 2)我们如何把文件转换成已选择的字符编码?

img

步骤一

为了确定文件的字符编码,我们使用一个名为 “file” 的命令行工具。因为 file 命令是一个标准的 UNIX 程序,所以我们可以在所有现代的 Linux 发行版中找到它。

运行下面的命令:

$ file --mime-encoding filename

img

步骤二

下一步是查看你的 Linux 系统所支持的文件编码种类。为此,我们使用名为 iconv 的工具及 “-l” 选项(L 的小写)来列出所有当前支持的编码。

$ iconv -l

iconv 工具是 GNU libc 库组成部分,因此它在所有 Linux 发行版中都是开箱即用的。

步骤三

在我们在我们的 Linux 系统所支持的编码里面选定了目标编码之后,运行下面的命令来完成编码转换:

$ iconv -f old_encoding -t new_encoding filename

例如,把 iso-8859-1 编码转换为 utf-8 编码:

$ iconv -f iso-8859-1 -t utf-8 input.txt

img

了解了我们演示的如何使用这些工具之后,你可以像下面这样修复一个受损的字幕文件:

img


via: http://ask.xmodulo.com/change-character-encoding-text-file-linux.html


在 Linux 上通过命令行来更改日期和时间

译者:wangjiezhe

校对:wxy

| 2014-11-08 21:42

问: 在 Linux 上,我怎样通过命令行来改变日期和时间?

在 Linux 系统中保持日期和时间的同步是每一个 Linux 用户和系统管理员的重要责任。很多程序都依靠精确的时间信息得以正常工作。另外,不精确的日期和时间会使得日志文件中的时间戳变得毫无意义,减弱了它们在系统检查和检修中的作用。对于生产系统来说,精确的日期和时间甚至更为重要。例如,在零售公司中,所有产品必须时刻准确地计数 (并储存在数据库服务器中) 以便于财政部门计算每天及每周,每月,每年的支出和收入.

我们必须注意,在 Linux 机器上有两种时钟:由内核维持的软件时钟 (又称系统时钟) 和在机器关机后记录时间的 (电池供电的) 硬件时钟。启动的时候,内核会把系统时钟与硬件时钟同步。之后,两个时钟各自独立运行.

方法一: Date 命令

在 Linux 中,你可以通过 date 命令来更改系统的日期和时间:

# date --set='NEW_DATE'

其中 NEW_DATE 是诸如 “Sun, 28 Sep 2014 16:21:42” 或者 “2014-09-29 16:21:42” 的可读格式的日期字符串.

日期格式也可以手动指定以获得更精确的结果:

# date +FORMAT --set='NEW_DATE'

例如:

# date +’% Y% m% d % H% m’ --set='20140928 1518'

img

你也可以用相对的方式地增加或减少一定的天数,周数,月数和秒数,分钟数,小时数。 你也可以把日期和时间的参数放到一个命令中。

# date --set='+5 minutes'# date --set='-2 weeks'# date --set='+3 months'# date --set='-3 months +2 weeks -5 minutes'

img

最后,把硬件时钟设置为当前系统时钟:

# hwclock --systohc

运行hwclock --systohc的目的是将硬件时钟同软件时钟同步,这可以更正硬件时钟的系统漂移 (即时钟按照一定的速度走快或走慢).

另一方面,如果硬件时钟是正确的,但系统时钟有误,可以用下面的命令更正:

 # hwclock --hctosys

在两种情况下,hwclock 命令都是将两个时钟同步。否则,重启后时间会是错误的,因为当电源关闭时硬件时钟会记忆时间。然而,这对于虚拟机器并不适用,因为虚拟机器并不能访问硬件时钟.

如果你的 Linux 系统上的默认时区是错误的,你可以按照 这个指导 进行更正.

方法二: NTP

另一种使系统日期和时间保持精确的方法是使用 NTP (网络时间协议). 在 Linux 上,ntpdate 命令通过 NTP 将系统时钟和 公共 NTP 服务器 同步.

你可以使用如下命令来安装ntpdate:

在 Debian 及基于 Debian 的发行版上:

# aptitude install ntpdate

在基于 Ret Hat 的发行版上:

# yum install ntpdate

使用 NTP 同步系统时钟:

# ntpdate -u <NTP 服务器名或 IP># hwclock --systohc

img

除了一次性使用 ntpdate 来同步时钟,你也可以使用 NTP 守护进程 (ntpd), 它会始终在后台运行,不断地通过 NTP 来调整系统时钟。关于 NTP 的设置,请参考 这个指导.


via: http://ask.xmodulo.com/change-date-time-command-line-linux.html


#修复 “fatal error: openssl/aes.h: No such file or directory

译者:geekpi

校对:wxy

| 2014-11-02 15:51

Question:我尝试在 Linux 编译一个程序,但是编译失败并报了一个错,“fatal error: openssl/aes.h: No such file or directory”。我该怎样安装要求的头文件并在我的 Linux 上解决这个问题?

fatal error: openssl/aes.h: No such file or directory

如果你在编译时遇到这个错误,这可能是下面的原因:你尝试编译的程序使用 OpenSSL,但是需要和 OpenSSL 链接的文件(库和头文件)在你 Linux 平台上缺少。(LCTT 译注:其它类似的错误也可以照此处理)

要解决这个问题,你需要安装 OpenSSL 开发包,这在所有的现代 Linux 发行版的标准软件仓库中都有。

要在 Debian、Ubuntu 或者其他衍生版上安装 OpenSSL:

$ sudo apt-get install libssl-dev

要在 Fedora、CentOS 或者 RHEL 上安装 OpenSSL 开发包:

$ sudo yum install openssl-devel

安装完后,尝试重新编译程序。


via: http://ask.xmodulo.com/fix-fatal-error-openssl.html


用 CheckInstall 从源码创建一个 RPM 或 DEB 包

译者:luoyutiantang

校对:wxy

| 2014-10-26 16:21

从源码创建安装软件包,而不是运行 “make install”,这样以后可以容易的卸载程序。

如果你已经从它的源码运行 “make install” 安装了 linux 程序。想完整移除它将变得真的很麻烦,除非程序的开发者在 Makefile 里提供了 uninstall 的目标设置。否则你必须在安装前后比较你系统里文件的完整列表,然后手工移除所有在安装过程中加入的文件。

这时候 Checkinstall 就可以派上使用。Checkinstall 会跟踪 install 命令行所创建或修改的所有文件的路径 (例如:“make install”、“make install_modules” 等) 并建立一个标准的二进制包,让你能用你发行版的标准包管理系统安装或卸载它,(例如 Red Hat 的 yum 或者 Debian 的 apt-get 命令)。已知它在 Slackware、SuSe、Mandrake 和 Gentoo 上也工作很好,请参考其 官方文档。

在这篇文章中,我们只集中在红帽子和 Debian 为基础的发行版,并展示怎样从源码使用 Checkinstall 创建一个 RPM 和 DEB 软件包

在 linux 上安装 Checkinstall

在 Debian 及其衍生发行版上安装 Checkinstall:

# aptitude install checkinstall

在红帽子的发行版上安装 Checkinstall,你需要下载一个已经打包好的 Checkinstall rpm 包 (例如:从 http://rpm.pbone.net 找到),不过它已经从 Repoforge 库里删除了。这个包是针对 Cent OS6 的,不过也可在 Cent OS7 里工作。

# wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/ikoinoba/CentOS_CentOS-6/x86_64/checkinstall-1.6.2-3.el6.1.x86_64.rpm# yum install checkinstall-1.6.2-3.el6.1.x86_64.rpm

一旦 checkinstall 安装好,你就可以用下列格式创建一个特定的软件包

# checkinstall <install-command>

如果没有参数,默认安装命令 “make install” 将被使用

用 Checkinstall 创建一个 RPM 或 DEB 包

在这个例子里,我们将创建一个 htop 包,这是一个 linux 交互式文本模式进程查看器(类似 top)。

首先,让我们从项目的官方网站下载源代码,作为一个好的习惯,我们存储源码包到 /usr/local/src 下,并解压它。

# cd /usr/local/src
# wget http://hisham.hm/htop/releases/1.0.3/htop-1.0.3.tar.gz
# tar xzf htop-1.0.3.tar.gz
# cd htop-1.0.3

让我们看看 htop 的安装命令是什么,以便我们能用 Checkinstall 命令调用它,如下面所示,htop 用 “make install” 命令安装。

# ./configure
# make install

因此,要创建一个 htop 安装包,我们可以不带任何参数的调用 checkinstall,这将使用 “make install” 命令创建一个包。在这个过程中, checkinstall 命令会问你几个问题。

简而言之,如下命令会创建一个 htop 包:

# ./configure
# checkinstall

“Should I create a default set of package docs?(我会创建一个默认设置的包文件?)”,回答 “Y”:

img

你可以输入一个包的简短描述,然后按两次回车:

img

输入一个数字以修改下面的任何值或 ENTER 继续:

img

然后 checkinstall 将自动地创建一个.rpm 或者.deb 包,根据你的 linux 系统是什么:

在 CentOS7:

img

在 Debian 7:

img


via: http://ask.xmodulo.com/build-rpm-deb-package-source-checkinstall.html


检测并修复 bash 中的破壳漏洞

译者:GOLinux

校对:wxy

| 2014-10-23 07:01

Linux 服务器是否存在 bash 破壳漏洞,以及如何来保护 Linux 服务器不受破壳漏洞侵袭。

2014 年 9 月 24 日,一位名叫斯特凡・沙泽拉的安全研究者发现了一个名为 “破壳”(Shellshock,也称为 “bash 门” 或 “Bash 漏洞”)的 bash 漏洞。该漏洞如果被渗透,远程攻击者就可以在调用 shell 前通过在特别精心编制的环境中输出函数定义执行任何程序代码。然后,这些函数内的代码就可以在调用 bash 时立即执行。

注意,破壳漏洞影响到 bash 版本 1.14 到 4.3(当前版本)。虽然在写本文时还没有该漏洞权威而完整的修复方案,也尽管主要的 Linux 发行版(Debian,Red Hat,CentOS,Ubuntu 和 Novell/Suse)已经发布了用于部分解决与此漏洞相关的补丁(CVE-2014-6271 和 CVE-2014-7169),并且建议尽快更新 bash,并在随后数日内检查更新(LCTT 译注,可能你看到这篇文章的时候,已经有了完善的解决方案)。

检测破壳漏洞

要检查你的 Linux 系统是否存在破壳漏洞,请在终端中输入以下命令。

 $ env x='() { :;}; echo "Your bash version is vulnerable"' bash -c "echo This is a test"

如果你的 Linux 系统已经暴露给了破壳漏洞渗透,命令输出会像这样:

Your bash version is vulnerable
This is a test

在上面的命令中,一个名为 x 的环境变量已经被设置可用于用户环境。就如我们所了解到的,它并没有赋值(是一个虚函数定义),后面跟了一个任意命令(红色),该命令将在 bash 调用前执行。

为破壳漏洞应用修复

你可以按照以下方法安装新发布的 bash 补丁。

在 Debian 及其衍生版上:

# aptitude update && aptitude safe-upgrade bash

在基于 Red Hat 的发行版上:

# yum update bash

打补丁之前:

Debian:

img

CentOS:

img

打补丁之后:

Debian:

img

CentOS:

img

注意,在安装补丁前后,各个发行版中的 bash 版本没有发生变化 —— 但是你可以通过从更新命令的运行过程中看到该补丁已经被安装(很可能在安装前需要你确认)。

如果处于某种原因你不能安装该补丁,或者针对你的发行版的补丁还没有发布,那么建议你先试用另外一个 shell,直到修复补丁出现。


via: http://ask.xmodulo.com/detect-patch-shellshock-vulnerability-bash.html


检查 PDF 中使用了哪种字体

译者:GOLinux

校对:wxy

| 2014-08-27 08:46

:我想要知道 PDF 文件中使用了什么字体,或者嵌入了什么字体。Linux 中有工具可以检查 PDF 文档中使用了哪种字体吗?

要检查 PDF 文件中包含了,或者使用了什么字体,你可以使用命令行工具:pdffonts,它是一个 PDF 字体分析工具。pdffonts 是 Poppler PDF 工具集包中的一个部分。

安装 PDF 工具集到 Linux

要安装 Poppler 到 Debian,Ubuntu 或 Linux Mint:

$ sudo apt-get install poppler-utils

要安装 PDF 工具集到 Fedora,CentOS 或 RHEL:

$ sudo yum install poppler-utils

检查 PDF 字体

pdffonts可以列出 PDF 文档中使用的所有字体。pdffonts 的基本用法如下。

$ pdffonts doc.pdf

pdffonts工具显示了各个已使用的字体的各种信息,如字体名称 / 类型,或者字体是否内嵌等等。

如果一个 PDF 文档有多页,你可以使用 “-f”(首页)和 “-l”(末页)选项来限制字体扫描页面范围。例如,如果你想要找出某个文档中的 5-10 页中使用了哪种字体,运行该命令:

$ pdffonts -f 5 -l 10 doc.pdf

via: http://ask.xmodulo.com/check-which-fonts-are-used-pdf-document.html


在 PDF 中嵌入 LaTex 中的所有字体

译者:geekpi

校对:wxy

| 2014-10-17 12:41

问: 我通过编译 LaTex 源文件生成了一份 PDF 文档。然而,我注意到,并不是所有字体都嵌入到了 PDF 文档中。我怎样才能确保所有的字体嵌入在由 LaTex 生成的 PDF 文档中?

当你创建一个 PDF 文件时,在 PDF 文件中嵌入字体是一个好主意。如果你不嵌入字体,PDF 浏览器可以在计算机上没有字体的情况下使用其他东西代替。这将导致文件被在不同的 PDF 浏览器或操作系统平台上呈现不同的样式。当你打印出来的文档时,缺少的字体是一个问题。

当你从 LaTex 中生成 PDF 文档时(例如用 pdflatex 或 dvipdfm),可能并不是所有的字体都嵌入在 PDF 文档中。例如,pdffonts 下面的输出中提示 PDF 文档中有缺少的字体(如 Helvetica)。

img

为了避免这样的问题,下面是如何在 LaTex 编译时嵌入所有的字体。

$ latex document.tex
$ dvips -Ppdf -G0 -t letter -o document.ps document.dvi
$ ps2pdf -dPDFSETTINGS=/prepress \
-dCompatibilityLevel=1.4 \
-dAutoFilterColorImages=false \
-dAutoFilterGrayImages=false \
-dColorImageFilter=/FlateEncode \
-dGrayImageFilter=/FlateEncode \
-dMonoImageFilter=/FlateEncode \
-dDownsampleColorImages=false \
-dDownsampleGrayImages=false \
document.ps document.pdf

现在你可以看到所有的字体都被嵌入到 PDF 中了。

img


via: http://ask.xmodulo.com/embed-all-fonts-pdf-document-latex.html


在命令行创建一个 MySQL 数据库

译者:su-kaiyao

校对:wxy

| 2014-10-10 21:23

:在一个某处运行的 MySQL 服务器上,我该怎样通过命令行创建和安装一个 MySQL 数据库呢?

为了能通过命令行创建一个 MySQL 数据库,你可以使用 mysql 命令行客户端。下面是通过 mysql 命令行客户端创建和安装 MySQL 的步骤。

img

第一步:安装 MySQL 客户端

当然你得确保 MySQL 客户端已经安装完毕。如果没有的话,可以按照下面的方法。

在 Debian,Ubuntu 或者 Linux Mint 上:

$ sudo apt-get install mysql-client

在 Fedora,CentOS 或者 RHEL 上:

$ sudo yum install mysql

第二步:登陆到 MySQL 服务器

首先,你需要使用 root 用户登陆进你的 MySQL 数据库,如下:

$ mysql -u root -h <mysql-server-ip-address> -p

请注意:为了能登进远程的 MySQL 服务器,你需要 开启服务器上的远程访问,如果你想调用同一主机上的 MySQL 服务器,你可以省略 “-h” 参数

$ mysql -u root -p

你将需要输入 MySQL 服务器的密码,如果认证成功,MySQL 提示将会出现。

img

第三步:创建一个 MySQL 数据库

在 MySQL 提示中输入命令之前,请记住所有的命令都是以分号结束的 (否则将不会执行)。另外,考虑输入命令的时候使用大些字母,输入数据库对象使用小写字母。但那不是必须的,只是方便你的阅读。

现在,让我们创建一个叫做 xmodulo_DB 的数据库:

mysql> CREATE DATABASE IF NOT EXISTS xmodulo_DB;

img

第四步:创建一个数据库表

为了达到演示的目的,我们将会创建一个叫做 posts_tbl 的表,表里会存储关于文章的如下信息:

  • 文章的标题
  • 作者的名字
  • 作者的姓
  • 文章可用或者不可用
  • 文章创建的日期

这个过程分两步执行:

首先,选择我们需要使用的数据库:

mysql> USE xmodulo_DB;

然后,在数据库中创建新表:

mysql> CREATE TABLE 'posts_tbl' ('post_id' INT UNSIGNED NOT NULL AUTO_INCREMENT, 'content' TEXT,'author_FirstName' VARCHAR (100) NOT NULL,'author_LastName' VARCHAR (50) DEFAULT NULL ,'isEnabled' TINYINT (1) NOT NULL DEFAULT 1, 'date' TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,PRIMARY KEY ( 'post_id' ) ) TYPE = MYISAM;

img

第五步:创建一个用户,并授予权限

当涉及到访问我们新创的数据库和表的时候,创建一个新用户是一个很好的主意。这样做就可以让用户在没有整个 MySQL 服务器权限的情况下,去访问那个数据库 (而且只能是那个数据库)

你可以创建新用户,授予权限,并且使改变生效:

mysql> GRANT ALL PRIVILEGES ON xmodulo_DB.* TO 'new_user'@'%' IDENTIFIED BY 'new_password';mysql> FLUSH PRIVILEGES;

‘newuser’ 和 'newpassword’ 分别指的是新的用户名和他的密码。这条信息将会被保存在 mysql.user 表中,而且密码会被加密。

第六步:测试

让我们插入一个虚拟的记录到 posts_tbl 表:

mysql> USE xmodulo_DB;mysql> INSERT INTO posts_tbl (content, author_FirstName, author_Las tName) VALUES ('Hi! This is some dummy text.', 'Gabriel', 'Canepa');

然后查看 posts_tbl 表中的所有记录:

mysql> SELECT * FROM posts_tbl;

img

注意:MySQL 会在我们先前定义的地方自动插入适当的默认值 (比如,‘isEnabled’ 和 ‘date’)。


via: http://ask.xmodulo.com/create-mysql-database-command-line.html


使用 tcpdump 来捕获 TCP SYN,ACK 和 FIN 包

译者:GOLinux

校对:wxy

:我想要监控 TCP 连接活动(如,建立连接的三次握手,以及断开连接的四次握手)。要完成此事,我只需要捕获 TCP 控制包,如 SYN,ACK 或 FIN 标记相关的包。我怎样使用 tcpdump 来仅仅捕获 TCP SYN,ACK 和 / 或 FYN 包?

作为业界标准的捕获工具,tcpdump 提供了强大而又灵活的包过滤功能。作为 tcpdump 基础的 libpcap 包捕获引擎支持标准的包过滤规则,如基于 5 重包头的过滤(如基于源 / 目的 IP 地址 / 端口和 IP 协议类型)。

tcpdump/libpcap 的包过滤规则也支持更多通用分组表达式,在这些表达式中,包中的任意字节范围都可以使用关系或二进制操作符进行检查。对于字节范围表达,你可以使用以下格式:

proto [ expr : size ]

“proto” 可以是熟知的协议之一(如 ip,arp,tcp,udp,icmp,ipv6),“expr” 表示与指定的协议头开头相关的字节偏移量。有我们熟知的直接偏移量如 tcpflags,也有取值常量如 tcp-syn,tcp-ack 或者 tcp-fin。“size” 是可选的,表示从字节偏移量开始检查的字节数量。

使用这种格式,你可以像下面这样过滤 TCP SYN,ACK 或 FIN 包。

只捕获 TCP SYN 包:

 # tcpdump -i <interface> "tcp [tcpflags] & (tcp-syn) != 0"

只捕获 TCP ACK 包:

# tcpdump -i <interface> "tcp [tcpflags] & (tcp-ack) != 0"

只捕获 TCP FIN 包:

# tcpdump -i <interface> "tcp [tcpflags] & (tcp-fin) != 0"

之捕获 TCP SYN 或 ACK 包:

 # tcpdump -r <interface> "tcp [tcpflags] & (tcp-syn|tcp-ack) != 0"

img


via: http://ask.xmodulo.com/capture-tcp-syn-ack-fin-packets-tcpdump.html


用 Perl 检测 Linux 的发行版本

译者:geekpi

校对:wxy

| 2014-10-06 22:15

问: 我需要写一个 Perl 程序,它会包含 Linux 发行版相关的代码。为此,Perl 程序需要能够自动检测运行中的 Linux 的发行版(如 Ubuntu、CentOS、Debian、Fedora 等等),以及它是什么版本号。如何用 Perl 检测 Linux 的发行版本?

如果要用 Perl 脚本检测 Linux 的发行版,你可以使用一个名为 Linux::Distribution 的 Perl 模块。该模块通过检查 /etc/lsb-release 以及其他在 /etc 下的发行版特定的目录来猜测底层 Linux 操作系统。它支持检测所有主要的 Linux 发行版,包括 Fedora、CentOS、Arch Linux、Debian、Ubuntu、SUSE、Red Hat、Gentoo、Slackware、Knoppix 和 Mandrake。

img

要在 Perl 中使用这个模块,你首先需要安装它。

在 Debian 或者 Ubuntu 上安装 Linux::Distribution

基于 Debian 的系统直接用 apt-get 安装

$ sudo apt-get install liblinux-distribution-packages-perl

在 Fedora、CentOS 或者 RHEL 上安装 Linux::Distribution

如果你的 Linux 没有 Linux::Distribution 模块的安装包(如基于红帽的系统),你可以使用 CPAN 来构建。

首先确保你的 Linux 系统安装了 CPAN

$ sudo yum -y install perl-CPAN

然后,使用这条命令来构建并安装模块:

$ sudo perl -MCPAN -e 'install Linux::Distribution'

用 Perl 确定 Linux 发行版

Linux::Distribution 模块安装完成之后,你可以使用下面的代码片段来确定你运行的 Linux 发行版本。

use Linux::Distribution qw (distribution_name distribution_version); my $linux = Linux::Distribution->new; if ($linux) {  my $distro = $linux->distribution_name ();  my $version = $linux->distribution_version ();  print "Distro: $distro $version\n";} else {  print "Distro: unknown\n";}

via: http://ask.xmodulo.com/detect-linux-distribution-in-perl.html


查找并移除 Ubuntu 上陈旧的 PPA 仓库

译者: LCTT joeren

| 2014-09-22 14:09

:我试着通过运行 apt-get update 命令来再次同步包索引文件,但是却出现了 “404 无法找到” 的错误,看起来似乎是我不能从先前添加的第三方 PPA 仓库中获取最新的索引。我怎样才能清除这些破损而且陈旧的 PPA 仓库呢?

Err http://ppa.launchpad.net trusty/main amd64 Packages
  404  Not Found
Err http://ppa.launchpad.net trusty/main i386 Packages
  404  Not Found
W: Failed to fetch http://ppa.launchpad.net/finalterm/daily/ubuntu/dists/trusty/main/binary-amd64/Packages  404  Not Found

W: Failed to fetch http://ppa.launchpad.net/finalterm/daily/ubuntu/dists/trusty/main/binary-i386/Packages  404  Not Found

E: Some index files failed to download. They have been ignored, or old ones used instead.

当你试着更新 APT 包索引时,“404 无法找到” 错误总是会在版本更新之后发生。就是说,在你升级你的 Ubuntu 发行版后,你在旧的版本上添加的一些第三方 PPA 仓库就不再受新版本的支持。在此种情况下,你可以像下面这样来鉴别并清除那些破损的 PPA 仓库

首先,找出那些引起 “404 无法找到” 错误的 PPA。

$ sudo apt-get update | grep "Failed"

在本例中,Ubuntu Trusty 不再支持的 PPA 仓库是 “ppa:finalterm/daily”。

去 移除 PPA 仓库 吧。

 $ sudo add-apt-repository --remove ppa:finalterm/daily

你得去重复重复再重复,把上面找到的所有过时的 PPA 仓库一个一个地移除。

在移除所有过时的 PPA 仓库后,重新运行 “apt-get update” 命令来检查它们是否都被成功移除。


via: http://ask.xmodulo.com/find-remove-obsolete-ppa-repositories-ubuntu.html

译者:GOLinux 校对:Caroline


Ubuntu 如何使用命令行移除 PPA 仓库

译者:Vic___

校对:wxy

| 2014-10-06 20:31

问: 前段时间,我的 Ubuntu 增加了一个第三方的 PPA 仓库,如何才能移除这个 PPA 仓库呢?

个人软件包档案(PPA)是 Ubuntu 独有的解决方案,允许独立开发者和贡献者构建、贡献任何定制的软件包来作为通过启动面板的第三方 APT 仓库。如果你是 Ubuntu 用户,有可能你已经增加一些流行的第三方 PPA 仓库到你的 Ubuntu 系统。如果你需要删除掉已经预先配置好的 PPA 仓库,下面将教你怎么做。

假如你想增加一个叫 “ppa:webapps/preview” 第三方 PPA 仓库到你的系统中,如下:

$ sudo add-apt-repository ppa:webapps/preview

如果你想要单独地删除某个 PPA 仓库,运行下面的命令:

 $ sudo add-apt-repository --remove ppa:someppa/ppa

注意,上述命令不会同时删除任何已经安装或更新的软件包。

如果你想要完整的删除一个 PPA 仓库并包括来自这个 PPA 安装或更新过的软件包,你需要 ppa-purge 命令。

首先要安装 ppa-purge 软件包:

$ sudo apt-get install ppa-purge

然后使用如下命令删除 PPA 仓库和与之相关的软件包:

$ sudo ppa-purge ppa:webapps/preview

特别滴,在发行版更新后,当你 分辨和清除已损坏的 PPA 仓库 时这个方法特别有用!


via: http://ask.xmodulo.com/how-to-remove-ppa-repository-from-command-line-on-ubuntu.html


更新过期版本的 Ubuntu

作者:Dan Nanni

译者:GOLinux

校对:wxy

| 2015-06-10 10:04

: 我的 PC 上安装了旧版的 Ubuntu 13.04(急切的浣熊)。当我在上面运行 “sudo apt-get update” 时,它丢给了我一大堆 “404 Not Found” 错误,结果是我不能使用 apt-get 或 aptitude 来安装或更新任何软件包了。由于该错误的原因,我甚至不能将它升级到更新的版本。我怎样才能修复这个问题啊?

每个 Ubuntu 版本都有生命结束周期(EOL)时间;常规的 Ubuntu 发行版提供 18 个月的支持,而 LTS(长期支持)版本则长达 3 年(服务器版本)和 5 年(桌面版本)。当某个 Ubuntu 版本达到生命结束周期时,其仓库就不能再访问了,你也不能再从 Canonical 获取任何维护更新和安全补丁。在撰写本文时,Ubuntu 13.04(急切的浣熊)已经达到了它的生命结束周期。

如果你所使用的 Ubuntu 系统已经被结束生命周期,你就会从 apt-get 或 aptitude 得到以下 404 错误,因为它的仓库已经被遗弃了。

W: Failed to fetch http://us.archive.ubuntu.com/ubuntu/dists/raring-backports/multiverse/binary-i386/Packages  404  Not Found [IP: 91.189.91.13 80] 
W: Failed to fetch http://extras.ubuntu.com/ubuntu/dists/raring/main/binary-amd64/Packages  404  Not Found
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/raring-security/universe/binary-i386/Packages  404  Not Found [IP: 91.189.88.149 80] 
E: Some index files failed to download. They have been ignored, or old ones used instead

img

对于那些还在使用旧版本 Ubuntu 的用户,Canonical 维护了一个 old-releases.ubuntu.com 的网站,这里包含了结束生命周期的仓库归档。因此,当 Canonical 对你安装的 Ubuntu 版本结束支持时,你需要将仓库切换到 old-releases.ubuntu.com(除非你在结束生命周期之前想要升级)。

这里,通过切换到旧版本仓库提供了一个快速修复 “404 Not Found” 错误的便捷方式。

首先,使用 old-releases 仓库替换 main/security 仓库,就像下面这样。

$ sudo sed -i -r's/([a-z]{2}\.)?archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list$ sudo sed -i -r's/security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list

然后,使用文本编辑器打开 /etc/apt/sources.list,并查找 extras.ubuntu.com。该仓库也不再支持 Ubuntu 13.04 了,所以你需要使用 “#” 号将 extras.ubuntu.com 注释掉。

#deb http://extras.ubuntu.com/ubuntu raring main#deb-src http://extras.ubuntu.com/ubuntu raring main

现在,你应该可以在旧版不受支持的 Ubuntu 上安装或更新软件包了。


via: http://ask.xmodulo.com/404-not-found-error-apt-get-update-ubuntu.html


显示 Linux 网桥的 MAC 学习表

译者:GOLinux

校对:wxy

| 2014-10-03 11:27

:我想要检查一下我用 brctl 工具创建的 Linux 网桥的 MAC 地址学习状态。请问,我要怎样才能查看 Linux 网桥的 MAC 学习表(或者转发表)?

Linux 网桥是网桥的软件实现,这是 Linux 内核的内核部分。与硬件网桥相类似,Linux 网桥维护了一个 2 层转发表(也称为 MAC 学习表,转发数据库,或者仅仅称为 FDB),它跟踪记录了 MAC 地址与端口的对应关系。当一个网桥在端口 N 收到一个包时(源 MAC 地址为 X),它在 FDB 中记录为 MAC 地址 X 可以从端口 N 到达。这样的话,以后当网桥需要转发一个包到地址 X 时,它就可以从 FDB 查询知道转发到哪里。构建一个 FDB 常常称之为 “MAC 学习” 或仅仅称为 “学习” 过程。

你可以使用以下命令来检查 Linux 网桥当前转发表或 MAC 学习表。

$ sudo brctl showmacs <bridge-name>

img

该命令将显示一个学习到的 MAC 地址与关联端口的列表。各个条目都有一个相关的附于其上的老化计时器,因此转发条目可以在一定时间后刷新,以使 MAC 学习表更新到最新。


via: http://ask.xmodulo.com/show-mac-learning-table-linux-bridge.html


在 Perl 中捕捉并处理信号

译者:geekpi

校对:wxy

| 2014-10-01 18:02

问: 我需要通过使用 Perl 的自定义信号处理程序来处理一个中断信号。在一般情况下,我怎么在 Perl 程序中捕获并处理各种信号(如 INT,TERM)?

作为 POSIX 标准的异步通知机制,信号由操作系统发送给进程某个事件来通知它。当产生信号时,操作系统会中断目标程序的执行,并且该信号被发送到该程序的信号处理函数。可以定义和注册自己的信号处理程序或使用默认的信号处理程序。

img

在 Perl 中,信号可以被捕获,并由一个全局的 % SIG 哈希变量指定处理函数。这个 % SIG 哈希变量的键名是信号值,键值是对应的信号处理程序的引用。因此,如果你想为特定的信号定义自己的信号处理程序,你可以直接在 % SIG 中设置信号的哈希值。

下面是一个代码段来处理使用自定义信号处理程序中断(INT)和终止(TERM)的信号。

$SIG {INT}  = \&signal_handler;
$SIG {TERM} = \&signal_handler;

sub signal_handler {
    print "This is a custom signal handler\n";
    die "Caught a signal $!";
}

img

% SIG 其他的可用的键值有 ‘IGNORE’ 和 ‘DEFAULT’。当所指定的键值是 ‘IGNORE’(例如, S I G C H L D = ′ I G N O R E ′ )时,相应的信号将被忽略。指 定 ′ D E F A U L T ′ 的键值(例如, SIG {CHLD}='IGNORE')时,相应的信号将被忽略。指定 'DEFAULT' 的键值(例如, SIGCHLD=IGNORE)时,相应的信号将被忽略。指DEFAULT的键值(例如,SIG {HUP}=‘DEFAULT’),意味着我们将使用一个(系统)默认的信号处理程序。


via: http://ask.xmodulo.com/catch-handle-interrupt-signal-perl.html


检查 Linux 系统的最后重启时间

译者:geekpi

校对:Caroline

| 2014-09-12 09:51

问: 是否有一个命令可以快速地检查系统已经运行了多久?也就是我怎么知道 Linux 系统最后的重启时间?

有许多方法来查询系统最后的重启时间。

方法一

第一种方法是使用 last 命令。

$ last reboot

这条命令实际上显示的是最近几天的系统运行时间。last 原本被设计来显示某个特定用户的登录历史。在 Linux 中,有一个特别的 “伪用户” 称为 reboot 会在系统重启的时候立即自动登录。这样通过检查 reboot 用户的登录历史,你就可以检查最后的重启时间。

方法二

另外一个检测系统最后启动时间的方法是使用 who 命令带上‘-b’选项。

$ who -b

方法三

你同样可以使用 uptime 命令来推断系统最后的启动时间。uptime 命令会显示当前的时间,同样也会显示系统已经运行的时间。从这些信息中,你就可以计算系统最后启动的时间了

$ uptime

via: http://ask.xmodulo.com/check-last-time-system-rebooted-linux.html


在 Linux 中修改环境变量 PATH

作者:Dan Nanni

译者:geekpi

校对:wxy

| 2015-05-21 07:03

问: 当试着运行一个程序时,它提示 “command not found”。 但这个程序就在 /usr/local/bin 下。该如何添加 /usr/local/bin 到我的 PATH 变量下,这样就可以不用指定路径来运行这个命令了。

在 Linux 中,PATH 环境变量保存了一系列的目录用于用户在输入的时候搜索命令。PATH 变量的值由一系列的由冒号分隔的绝对路径组成。每个用户都有特定的 PATH 环境变量(由系统级的 PATH 变量初始化)。

img

要检查用户的环境变量,用户模式下运行下面的命令:

$ echo $PATH/usr/lib64/qt-3.3/bin:/bin:/usr/bin:/usr/sbin:/sbin:/home/xmodulo/bin

或者运行:

$ env | grep PATHPATH=/usr/lib64/qt-3.3/bin:/bin:/usr/bin:/usr/sbin:/sbin:/home/xmodulo/bin

如果你的命令不存在于上面任何一个目录内,shell 就会抛出一个错误信息:“command not found”。

如果你想要添加一个另外的目录(比如:/usr/local/bin)到你的 PATH 变量中,你可以用下面这些命令。

为特定用户修改 PATH 环境变量

如果你只想在当前的登录会话中临时地添加一个新的目录(比如:/usr/local/bin)给用户的默认搜索路径,你只需要输入下面的命令。

$ PATH=$PATH:/usr/local/bin

检查 PATH 是否已经更新:

$ echo $PATH/usr/lib64/qt-3.3/bin:/bin:/usr/bin:/usr/sbin:/sbin:/home/xmodulo/bin:/usr/local/bin

更新后的 PATH 会在当前的会话一直有效。然而,更改将在新的会话中失效。

如果你想要永久更改 PATH 变量,用编辑器打开~/.bashrc (或者~/.bash_profile),接着在最后添加下面这行。

export PATH=$PATH:/usr/local/bin

接着运行下面这行永久激活更改:

$ source ~/.bashrc (或者 source ~/.bash_profile)

改变系统级的环境变量

如果你想要永久添加 /usr/local/bin 到系统级的 PATH 变量中,像下面这样编辑 /etc/profile。

$ sudo vi /etc/profile
export PATH=$PATH:/usr/local/bin

你重新登录后,更新的环境变量就会生效了。


via: http://ask.xmodulo.com/change-path-environment-variable-linux.html


为 sudo 命令定义 PATH 环境变量

译者:nd0104

校对:Caroline

| 2014-09-02 10:04

问: 我安装了一个程序到 /usr/local/bin 目录下,这个程序需要 root 权限才能执行,当我用 sudo 去执行它时,收到 “sudo: XXXXX: command not found” 的错误提示,不知道为什么 /usr/local/bin 没有被包含到 PATH 环境变量下面来,我该如何解决这个问题?

当你使用 sudo 去执行一个程序时,处于安全的考虑,这个程序将在一个新的、最小化的环境中执行,也就是说,诸如 PATH 这样的环境变量,在 sudo 命令下已经被重置成默认状态了。所以当一个刚初始化的 PATH 变量中不包含你所要运行的程序所在的目录,用 sudo 去执行,你就会得到 “command not found” 的错误提示。

要想改变 PATH 在 sudo 会话中的初始值,用文本编辑器打开 /etc/sudoers 文件,找到 “secure_path” 一行,当你执行 sudo 命令时,“secure_path” 中包含的路径将被当做默认 PATH 变量使用。

添加所需要的路径 (如 /usr/local/bin)到 “secure_path” 下,在开篇所遇见的问题就将迎刃而解。

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

这个修改会即刻生效。


via: http://ask.xmodulo.com/define-path-environment-variable-sudo-commands.html


在 Linux 中直接挂载 LVM 分区

作者: Dan Nanni 译者: LCTT geekpi

| 2015-06-25 09:46

问: 我有一个 USB 盘包含了 LVM 分区。 我想要在 Linux 中访问这些 LVM 分区。我该如何在 Linux 中挂载 LVM 分区?

LVM 是逻辑卷管理工具,它允许你使用逻辑卷和卷组的概念来管理磁盘空间。使用 LVM 相比传统分区最大的好处是弹性地为用户和程序分配空间而不用考虑每个物理磁盘的大小。

在 LVM 中,那些创建了逻辑分区的物理存储是传统的分区(比如:/dev/sda2,/dev/sdb1)。这些分区必须被初始化为 “物理卷 PV” 并加上卷标(如,“Linux LVM”)来使它们可以在 LVM 中使用。一旦分区被标记被 LVM 分区,你不能直接用 mount 命令挂载。

如果你尝试挂载一个 LVM 分区(比如 /dev/sdb2), 你会得到下面的错误。

$ mount /dev/sdb2 /mnt
mount: unknown filesystem type 'LVM2_member'

img

要正确地挂载 LVM 分区,你必须挂载分区中创建的 “逻辑卷”。下面就是如何做的。

首先,用下面的命令检查可用的卷组:

$ sudo pvs
PV         VG                           Fmt  Attr PSize   PFree
/dev/sdb2  vg_ezsetupsystem40a8f02fadd0 lvm2 a--  237.60g    0

img

物理卷的名字和卷组的名字分别在 PV 和 VG 列的下面。本例中,只有一个创建在 dev/sdb2 下的组 “vg_ezsetupsystem40a8f02fadd0”。

接下来检查卷组中存在的逻辑卷,使用 lvdisplay 命令:

$ sudo lvdisplay <volume-group-name>

使用 lvdisplay 显示了可用卷的信息(如:设备名、卷名、卷大小等等)。

$ sudo lvdisplay /dev/vg_ezsetupsystem40a8f02fadd0

  --- Logical volume ---  LV Path                /dev/vg_ezsetupsystem40a8f02fadd0/lv_root  LV Name                lv_root  VG Name                vg_ezsetupsystem40a8f02fadd0  LV UUID                imygta-P2rv-2SMU-5ugQ-g99D-A0Cb-m31eet  LV Write Access        read/write  LV Creation host, time livecd.centos, 2015-03-16 18:38:18 -0400  LV Status              available  # open                 0  LV Size                50.00 GiB  Current LE             12800  Segments               1  Allocation             inherit  Read ahead sectors     auto  - currently set to     256  Block device           252:0

上图可以看到两个逻辑卷的名字:lv_root 和 lv_home

  • 上图可以看到两个逻辑卷的名字:lv_*root 和 lv_*home*

如果你想要挂载一个特定的逻辑卷,使用如下的 “LV Path” 的设备名(如:/dev/vg_ezsetupsystem40a8f02fadd0/lv*_*home)。

$ sudo mount /dev/vg_ezsetupsystem40a8f02fadd0/lv_home/mnt

你可以用 mount 命令不带任何参数检查挂载状态,这会显示所有已挂载的文件系统。

$ mount

img

如果你想在每次启动时自动挂载逻辑卷,在 /etc/fstab 中添加下面的行,你可以指定卷的文件系统类型(如 ext4),它可以从 mount 命令的输出中找。

/dev/vg_ezsetupsystem40a8f02fadd0/lv_home/mnt ext4 defaults 0 0

现在逻辑卷会在每次启动时挂载到 /mnt。


via: http://ask.xmodulo.com/mount-lvm-partition-linux.html

作者:Dan Nanni 译者:geekpi 校对:wxy


Ubuntu 桌面上如何禁用默认的密钥环解锁提示

作者:Dan Nanni 译者: LCTT joeren

| 2015-06-07 10:13

:当我启动我的 Ubuntu 桌面时,出现了一个弹出对话框,要求我输入密码来解锁默认的密钥环。我怎样才能禁用这个 “解锁默认密钥环” 弹出窗口,并自动解锁我的密钥环?

密钥环是一个以加密方式存储你的登录信息的本地数据库。各种桌面应用(如浏览器、电子邮件客户端)使用密钥环来安全地存储并管理你的登录凭证、机密、密码、证书或密钥。对于那些需要检索存储在密钥环中的信息的应用程序,需要解锁该密钥环。

Ubuntu 桌面所使用的 GNOME 密钥环被整合到了桌面登录中,该密钥环会在你验证进入桌面后自动解锁。但是,如果你设置了自动登录桌面或者是从休眠中唤醒,你默认的密钥环仍然可能 “被锁定” 的。在这种情况下,你会碰到这一提示:

“输入密码来解锁密钥环‘默认密钥环’。某个应用想要访问密钥环‘默认密钥环’,但它被锁定了。”

img

如果你想要避免在每次弹出对话框出现时输入密码来解锁默认密钥环,那么你可以这样做。

在做之前,请先了解禁用密码提示后可能出现的结果。通过自动解锁默认密钥环,你可以让任何使用你桌面的人无需知道你的密码而能获取你的密钥环(以及存储在密钥环中的任何信息)。

禁用默认密钥环解锁密码

打开 Dash,然后输入 “password” 来启动 “密码和密钥” 应用。

img

或者,使用 seahorse 命令从命令行启动图形界面。

$ seahorse

在左侧面板中,右击 “默认密钥环”,并选择 “修改密码”。

img

输入你的当前登录密码。

img

在设置 “默认” 密钥环新密码的密码框中留空。

img

在询问是否不加密存储密码对话框中点击 “继续”。

img

搞定。从今往后,那个该死的解锁密钥环提示对话框再也不会来烦你了。


via: http://ask.xmodulo.com/disable-entering-password-unlock-default-keyring.html

作者:Dan Nanni 译者:GOLinux 校对:wxy


在红帽系 linux 中编译 Ixgbe 驱动

作者:Dan Nanni 译者: LCTT Vic___

| 2015-06-03 03:33

问:我想要安装最新版的 ixgbe 10G 网卡驱动。在 CentOS, Fedora 或 RHEL 中,我应该如何编译 ixgbe 驱动?

想要在 linux 使用 Intel 的 PCI Express 10G 网卡(例如,82598,82599,x540),需要安装 Ixgbe 驱动。如今的 Linux 发行版都会预安装 ixgbe 的可加载模块,但是预安装的 ixgbe 驱动不是完整功能版。如果想要开启和定制所有 10G 网卡的功能(如,RSS、多队列、虚拟化功能、硬件 offload 等),需要从源码编译安装。

本文基于红帽系平台(如,CentOS,RHEL 或 Fedora)。

img

第一步:安装依赖

首先,安装必要的开发环境和安装匹配的内核头文件

$ sudo yum install gcc make$ sudo yum install kernel-devel

第二步:编译 Ixgbe

从 [官方页面](http://sourceforge.net/projects/e1000/files/ixgbe stable/) 下载最新 Ixgbe 源码

$ wget http://downloads.sourceforge.net/project/e1000/ixgbe%20stable/3.23.2/ixgbe-3.23.2.tar.gz

请检查支持的内核版本。例如,Ixgbe3.23.2 版本支持 Linux 内核版本 2.6.18 到 3.18.1。

提取压缩包并编译:

$ tar -xvf ixgbe-3.23.2.tar.gz$ cd ixgbe-3.23.2/src$ make

如果成功,可以在当前目录找到编译完成的驱动(ixgbe.ko)。

可以运行这个命令来查看编译信息:

$ modinfo ./ixgbe.ko

将会输出一个 Ixgbe 驱动的可用参数列表

img

第三步:加载 Ixgbe 驱动

这步准备加载已经编译好的驱动。

如果系统已经加载了 Ixgbe 驱动,首先需要卸载掉老版本。否则,新版本不能加载。

$ sudo rmmod ixgbe.ko

然后插入编译完成的驱动到内核中:

$ sudo insmod ./ixgbe.ko

同时,你可以设置启动参数

$ sudo insmod ./ixgbe.ko FdirPballoc=3 RSS=16

验证驱动是否加载成功,使用 dmesg 命令,查看其输出

$ dmesg

Intel (R) 10 Gigabit PCI Express Network Driver - version 3.23.2Copyright (c) 1999-2014 Intel Corporation.
ixgbe 0000:21:00.0: PCI INT A -> GSI 64 (level, low) -> IRQ 64
ixgbe 0000:21:00.0: setting latency timer to 64
ixgbe: Receive-Side Scaling (RSS) set to 16
ixgbe: Flow Director packet buffer allocation set to 3
ixgbe: 0000:21:00.0: 
ixgbe_check_options: Flow Director will be allocated 256kB of packet buffer
ixgbe: 0000:21:00.0: 
ixgbe_check_options: FCoE Offload feature enabled
ixgbe 0000:21:00.0: irq 87 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 88 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 89 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 90 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 91 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 92 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 93 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 94 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 95 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 96 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 97 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 98 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 99 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 100 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 101 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 102 for MSI/MSI-X
ixgbe 0000:21:00.0: irq 103 for MSI/MSI-X
ixgbe 0000:21:00.0: eth3: DCA registration failed: -1
ixgbe 0000:21:00.0: PCI Express bandwidth of 32GT/s available
ixgbe 0000:21:00.0: (Speed:5.0GT/s, Width: x8, Encoding Loss:20%) 
ixgbe 0000:21:00.0: eth3: MAC: 2, PHY: 9, SFP+: 3, PBA No: E68793-006
ixgbe 0000:21:00.0: 90:e2:ba:5b:e9:1c
ixgbe 0000:21:00.0: eth3: Enabled Features: RxQ: 16 TxQ: 16 FdirHash RSC 
ixgbe 0000:21:00.0: eth3: Intel (R) 10 Gigabit Network Connection
ixgbe 0000:21:00.1: PCI INT B -> GSI 68 (level, low) -> IRQ 68
ixgbe 0000:21:00.1: setting latency timer to 64
ixgbe: 0000:21:00.1: 
ixgbe_check_options: FCoE Offload feature enabled
ixgbe 0000:21:00.0: registered PHC device on eth3
ixgbe 0000:21:00.1: irq 104 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 105 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 106 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 107 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 108 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 109 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 110 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 111 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 112 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 113 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 114 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 115 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 116 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 117 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 118 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 119 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 120 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 121 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 122 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 123 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 124 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 125 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 126 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 127 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 128 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 129 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 130 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 131 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 132 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 133 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 134 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 135 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 136 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 137 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 138 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 139 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 140 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 141 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 142 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 143 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 144 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 145 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 146 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 147 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 148 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 149 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 150 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 151 for MSI/MSI-X
ixgbe 0000:21:00.1: irq 152 for MSI/MSI-XADDRCONF (NETDEV_UP): eth3: link is not ready8021q: adding VLAN 0 to HW filter on device eth3
ixgbe 0000:21:00.1: eth4: DCA registration failed: -1
ixgbe 0000:21:00.1: PCI Express bandwidth of 32GT/s available
ixgbe 0000:21:00.1: (Speed:5.0GT/s, Width: x8, Encoding Loss:20%) 
ixgbe 0000:21:00.1: eth4: MAC: 2, PHY: 9, SFP+: 4, PBA No: E68793-006
ixgbe 0000:21:00.1: 90:e2:ba:5b:e9:1e
ixgbe 0000:21:00.1: eth4: Enabled Features: RxQ: 48 TxQ: 48 FdirHash RSC 
ixgbe 0000:21:00.1: eth4: Intel (R) 10 Gigabit Network Connection
ixgbe 0000:21:00.0: eth3: detected SFP+: 3
ixgbe 0000:21:00.1: registered PHC device on eth4ADDRCONF (NETDEV_UP): eth4: link is not ready8021q: adding VLAN 0 to HW filter on device eth4
ixgbe 0000:21:00.1: eth4: detected SFP+: 4
ixgbe 0000:21:00.0: eth3: NIC Link is Up 10 Gbps, Flow Control: RX/TXADDRCONF (NETDEV_CHANGE): eth3: link becomes ready
ixgbe 0000:21:00.1: eth4: NIC Link is Up 10 Gbps, Flow Control: RX/TXADDRCONF (NETDEV_CHANGE): eth4: link becomes readyeth3: no IPv6 routers presenteth4: no IPv6 routers present

第四步:安装 Ixgbe 驱动

当确认驱动已经加载后,就可以安装驱动到系统中了

$ sudo make install

ixgbe.ko 将会安装在下列目录

/lib/modules/<kernel-version>/kernel/drivers/net/ixgbe

此时,编译好的驱动将在启动时自动加载,也可以通过运行命令加载它:

$ sudo modprobe ixgbe

img


via: http://ask.xmodulo.com/compile-ixgbe-driver-centos-rhel-fedora.html

作者:Dan Nanni 译者:Vic020 校对:wxy


在 Ubuntu 或者 Debian 中编译安装 ixgbe 驱动

译者: LCTT geekpi

| 2015-03-30 13:39

问: 我想为我的 Intel 10G 网卡下载安装最新的 ixgbe 驱动。我该如何在 Ubuntu(或者 Debian)中安装 ixgbe 驱动?

Intel 的 10G 网卡(比如,82598、 82599、 x540)由 ixgbe 驱动支持。现代的 Linux 发行版已经带有了 ixgbe 驱动,通过可加载模块的方式使用。然而,有些情况你希望在你机器上的自己编译安装 ixgbe 驱动,比如,你想要体验 ixbge 驱动的最新特性时。同样,内核默认自带的 ixgbe 驱动中的一个问题是不允许你自定义驱动的参数。如果你想要一个完全定制的 ixgbe 驱动(比如 RSS、多队列、中断阈值等等),你需要手动从源码编译 ixgbe 驱动。

这里是如何在 Ubuntu、Debian 或者它们的衍生版中下载安装 ixgbe 驱动的教程。

第一步: 安装前提

安装之前,需要安装匹配的内核头文件和开发工具包。

$ sudo apt-get install linux-headers-$(uname -r)$ sudo apt-get install gcc make

第二步: 编译 Ixgbe 驱动

从 [最新的 ixgbe 驱动](http://sourceforge.net/projects/e1000/files/ixgbe stable/) 中下载源码。

$ wget http://sourceforge.net/projects/e1000/files/ixgbe%20stable/3.23.2/ixgbe-3.23.2.tar.gz

如下编译 ixgbe 驱动。

$ tar xvfvz ixgbe-3.23.2.tar.gz$ cd ixgbe-3.23.2/src$ make

第三步: 检查 Ixgbe 驱动

编译之后,你会看到在 ixgbe-3.23.2/src 目录下创建了ixgbe.ko。这就是会加载到内核之中的 ixgbe 驱动。

用 modinfo 命令检查内核模块的信息。注意你需要指定模块文件的绝对路径(比如 ./ixgbe.ko 或者 /home/xmodulo/ixgbe/ixgbe-3.23.2/src/ixgbe.ko)。输出中会显示 ixgbe 内核的版本。

$ modinfo ./ixgbe.ko
  "filename": "/home/xmodulo/ixgbe/ixgbe-3.23.2/src/ixgbe.ko",
  "version": "3.23.2",
  "license": "GPL",
  "description": "Intel (R) 10 Gigabit PCI Express Network Driver",
  "author": "Intel Corporation",
  "srcversion": "2ADA5E537923E983FA9DAE2",
  "alias": [
    "pci:v00008086d00001560sv*sd*bc*sc*i*",
    "pci:v00008086d00001558sv*sd*bc*sc*i*",
    "pci:v00008086d0000154Asv*sd*bc*sc*i*",
    "pci:v00008086d00001557sv*sd*bc*sc*i*",
    "pci:v00008086d0000154Fsv*sd*bc*sc*i*",
    "pci:v00008086d0000154Dsv*sd*bc*sc*i*",
    "pci:v00008086d00001528sv*sd*bc*sc*i*",
    "pci:v00008086d000010F8sv*sd*bc*sc*i*",
    "pci:v00008086d0000151Csv*sd*bc*sc*i*",
    "pci:v00008086d00001529sv*sd*bc*sc*i*",
    "pci:v00008086d0000152Asv*sd*bc*sc*i*",
    "pci:v00008086d000010F9sv*sd*bc*sc*i*",
    "pci:v00008086d00001514sv*sd*bc*sc*i*",
    "pci:v00008086d00001507sv*sd*bc*sc*i*",
    "pci:v00008086d000010FBsv*sd*bc*sc*i*",
    "pci:v00008086d00001517sv*sd*bc*sc*i*",
    "pci:v00008086d000010FCsv*sd*bc*sc*i*",
    "pci:v00008086d000010F7sv*sd*bc*sc*i*",
    "pci:v00008086d00001508sv*sd*bc*sc*i*",
    "pci:v00008086d000010DBsv*sd*bc*sc*i*",
    "pci:v00008086d000010F4sv*sd*bc*sc*i*",
    "pci:v00008086d000010E1sv*sd*bc*sc*i*",
    "pci:v00008086d000010F1sv*sd*bc*sc*i*",
    "pci:v00008086d000010ECsv*sd*bc*sc*i*",
    "pci:v00008086d000010DDsv*sd*bc*sc*i*",
    "pci:v00008086d0000150Bsv*sd*bc*sc*i*",
    "pci:v00008086d000010C8sv*sd*bc*sc*i*",
    "pci:v00008086d000010C7sv*sd*bc*sc*i*",
    "pci:v00008086d000010C6sv*sd*bc*sc*i*",
    "pci:v00008086d000010B6sv*sd*bc*sc*i*"
  ],
  "depends": "ptp,dcavermagic",
  "magic": "3.11.0-19-generic SMP mod_unload modversions",
  "parm": {
    "InterruptType": "Change Interrupt Mode (0=Legacy, 1=MSI, 2=MSI-X), default IntMode (deprecated) (array of int)",
    "IntMode": "Change Interrupt Mode (0=Legacy, 1=MSI, 2=MSI-X), default 2 (array of int)",
    "MQ": "Disable or enable Multiple Queues, default 1 (array of int)",
    "DCA": "Disable or enable Direct Cache Access, 0=disabled, 1=descriptor only, 2=descriptor and data (array of int)",
    "RSS": "Number of Receive-Side Scaling Descriptor Queues, default 0=number of cpus (array of int)",
    "VMDQ": "Number of Virtual Machine Device Queues: 0/1 = disable, 2-16 enable (default=8) (array of int)",
    "max_vfs": "Number of Virtual Functions: 0 = disable (default), 1-63 = enable this many VFs (array of int)",
    "VEPA": "VEPA Bridge Mode: 0 = VEB (default), 1 = VEPA (array of int)",
    "InterruptThrottleRate": "Maximum interrupts per second, per vector, (0,1,956-488281), default 1 (array of int)",
    "LLIPort": "Low Latency Interrupt TCP Port (0-65535) (array of int)",
    "LLIPush": "Low Latency Interrupt on TCP Push flag (0,1) (array of int)",
    "LLISize": "Low Latency Interrupt on Packet Size (0-1500) (array of int)",
    "LLIEType": "Low Latency Interrupt Ethernet Protocol Type (array of int)",
    "LLIVLANP": "Low Latency Interrupt on VLAN priority threshold (array of int)",
    "FdirPballoc": "Flow Director packet buffer allocation level: 1 = 8k hash filters or 2k perfect filters, 2 = 16k hash filters or 4k perfect filters, 3 = 32k hash filters or 8k perfect filters (array of int)",
    "AtrSampleRate": "Software ATR Tx packet sample rate (array of int)",
    "FCoE": "Disable or enable FCoE Offload, default 1 (array of int)",
    "LRO": "Large Receive Offload (0,1), default 1 = on (array of int)",
    "allow_unsupported_sfp": "Allow unsupported and untested SFP+ modules on 82599 based adapters, default 0 = Disable (array of int)"
      }
}

第四步: 测试 Ixgbe 驱动

在测试新的模块之前,如果你内核中已存在旧版本 ixgbe 模块的话你需要先移除它。

$ sudo rmmod ixgbe

接着使用 insmod 命令插入新编译的 ixgbe 模块。确保指定一个模块的绝对路径。

$ sudo insmod ./ixgbe.ko

如果上面的命令成功运行,就不会显示任何的信息。

如果你需要,你可以尝试加入额外的参数。比如,设置 RSS 的队列数量为 16:

$ sudo insmod ./ixgbe.ko RSS=16

检查**/var/log/kern.log**来查看 ixgbe 驱动是否成功激活。查看日志中的 “Intel ® 10 Gigabit PCI Express Network Driver”。ixgbe 的版本信息应该和之前的 modinfo 的显示应该相同。

Sep 18 14:48:52 spongebob kernel: [684717.906254] Intel (R) 10 Gigabit PCI Express Network Driver - version 3.22.3

img

第五步: 安装 Ixgbe 驱动

一旦你验证新的 ixgbe 驱动可以成功加载,最后一步是在你的系统中安装驱动。

$ sudo make install

ixgbe.ko会安装在 /lib/modules//kernel/drivers/net/ethernet/intel/ixgbe 下。

从这一步起,你可以用下面的 modprobe 命令加载 ixgbe 驱动了。注意你不必再指定绝对路径。

$ sudo modprobe ixgbe

如果你希望在启动时加载 ixgbe 驱动,你可以在 /etc/modules 的最后加入 “ixgbe”。


via: http://ask.xmodulo.com/download-install-ixgbe-driver-ubuntu-debian.html

译者:geekpi 校对:wxy


nginx 网络服务器上如何阻止特定用户代理(UA)

作者:Dan Nanni 译者: LCTT joeren

| 2015-05-22 08:30

: 我注意到有一些机器人经常访问我的 nginx 驱动的网站,并且进行一些攻击性的扫描,导致消耗掉了我的网络服务器的大量资源。我一直尝试着通过用户代理符串来阻挡这些机器人。我怎样才能在 nginx 网络服务器上阻挡掉特定的用户代理呢?

现代互联网滋生了大量各种各样的恶意机器人和网络爬虫,比如像恶意软件机器人、垃圾邮件程序或内容刮刀,这些恶意工具一直偷偷摸摸地扫描你的网站,干些诸如检测潜在网站漏洞、收获电子邮件地址,或者只是从你的网站偷取内容。大多数机器人能够通过它们的 “用户代理” 签名字符串来识别。

作为第一道防线,你可以尝试通过将这些机器人的用户代理字符串添加入 robots.txt 文件来阻止这些恶意软件机器人访问你的网站。但是,很不幸的是,该操作只针对那些 “行为良好” 的机器人,这些机器人被设计遵循 robots.txt 的规范。许多恶意软件机器人可以很容易地忽略掉 robots.txt,然后随意扫描你的网站。

另一个用以阻挡特定机器人的途径,就是配置你的网络服务器,通过特定的用户代理字符串拒绝要求提供内容的请求。本文就是说明如何在 nginx 网络服务器上阻挡特定的用户代理

img

在 Nginx 中将特定用户代理列入黑名单

要配置用户代理阻挡列表,请打开你的网站的 nginx 配置文件,找到 server 定义部分。该文件可能会放在不同的地方,这取决于你的 nginx 配置或 Linux 版本(如,/etc/nginx/nginx.conf,/etc/nginx/sites-enabled/<your-site>,/usr/local/nginx/conf/nginx.conf,/etc/nginx/conf.d/<your-site>)。

    server {
        listen       80 default_server;
        server_name  xmodulo.com;
        root         /usr/share/nginx/html;
        ....
    }

在打开该配置文件并找到 server 部分后,添加以下 if 声明到该部分内的某个地方。

    server {
        listen       80 default_server;
        server_name  xmodulo.com;
        root         /usr/share/nginx/html;
        # 大小写敏感的匹配
        if ($http_user_agent ~ (Antivirx|Arian) {
            return 403;
        }
        #大小写无关的匹配
        if ($http_user_agent ~* (netcrawl|npbot|malicious)) {
            return 403;
        }
        ....
    }

如你所想,这些 if 声明使用正则表达式匹配了任意不良用户字符串,并向匹配的对象返回 403 HTTP 状态码。 $http_user_agent 是 HTTP 请求中的一个包含有用户代理字符串的变量。‘’操作符针对用户代理字符串进行大小写敏感匹配,而‘*’操作符则进行大小写无关匹配。‘|’操作符是逻辑或,因此,你可以在 if 声明中放入众多的用户代理关键字,然后将它们全部阻挡掉。

在修改配置文件后,你必须重新加载 nginx 以激活阻挡:

$ sudo /path/to/nginx -s reload

你可以通过使用带有 “–user-agent” 选项的 wget 测试用户代理阻挡。

$ wget --user-agent "malicious bot" http://<nginx-ip-address>

img

管理 Nginx 中的用户代理黑名单

目前为止,我已经展示了在 nginx 中如何阻挡一些用户代理的 HTTP 请求。如果你有许多不同类型的网络爬虫机器人要阻挡,又该怎么办呢?

由于用户代理黑名单会增长得很大,所以将它们放在 nginx 的 server 部分不是个好点子。取而代之的是,你可以创建一个独立的文件,在该文件中列出所有被阻挡的用户代理。例如,让我们创建 /etc/nginx/useragent.rules,并定义以下面的格式定义所有被阻挡的用户代理的图谱。

$ sudo vi /etc/nginx/useragent.rules

    map $http_user_agent $badagent {
            default         0;
            ~*malicious     1;
            ~*backdoor      1;
            ~*netcrawler    1;
            ~Antivirx       1;
            ~Arian          1;
            ~webbandit      1;
    }

与先前的配置类似,‘*’将匹配以大小写不敏感的方式匹配关键字,而‘’将使用大小写敏感的正则表达式匹配关键字。“default 0” 行所表达的意思是,任何其它文件中未被列出的用户代理将被允许。

接下来,打开你的网站的 nginx 配置文件,找到里面包含 http 的部分,然后添加以下行到 http 部分某个位置。

    http {
        .....
        include /etc/nginx/useragent.rules
    }

注意,该 include 声明必须出现在 server 部分之前(这就是为什么我们将它添加到了 http 部分里)。

现在,打开 nginx 配置定义你的服务器的部分,添加以下 if 声明:

    server {
        ....
        if ($badagent) {
            return 403;
        }
        ....
    }

最后,重新加载 nginx。

$ sudo /path/to/nginx -s reload

现在,任何包含有 /etc/nginx/useragent.rules 中列出的关键字的用户代理将被 nginx 自动禁止。


via: http://ask.xmodulo.com/block-specific-user-agents-nginx-web-server.html

作者:Dan Nanni 译者:GOLinux 校对:wxy


在 curl 中设置自定义的 HTTP 头

译者: LCTT Ping Yang

| 2015-02-28 08:46

:我正尝试使用 curl 命令获取一个 URL,但除此之外我还想在传出的 HTTP 请求中设置一些自定义的头部字段。我如何能够在 curl 中使用自定义的 HTTP 头呢?

curl 是一个强大的命令行工具,它可以通过网络将信息传递给服务器或者从服务器获取数据。他支持很多的传输协议,尤其是 HTTP/HTTPS 以及其他诸如 FTP/FTPS, RTSP, POP3/POP3S, SCP, IMAP/IMAPS 协议等。当你使用 curl 向一个 URL 发送 HTTP 请求的时候,它会使用一个默认只包含必要的头部字段(如:User-Agent, Host, and Accept)的 HTTP 头。

img

在一些个例中,或许你想要在一个 HTTP 请求中覆盖掉默认的 HTTP 头或者添加一个新的自定义头部字段。例如,你或许想要重写 “HOST” 字段来测试一个 负载均衡,或者通过重写 “User-Agent” 字符串来假冒特定浏览器以解决一些访问限制的问题。

为了解决所有这些问题,curl 提供了一个简单的方法来完全控制传出 HTTP 请求的 HTTP 头。你需要的这个参数是 “-H” 或者 “–header”。

为了定义多个 HTTP 头部字段,“-H” 选项可以在 curl 命令中被多次指定。

例如:以下命令设置了 3 个 HTTP 头部字段。也就是说,重写了 “HOST” 字段,并且添加了两个字段(“Accept-Language” 和 “Cookie”)

$ curl -H 'Host: 157.166.226.25' -H 'Accept-Language: es' -H 'Cookie: ID=1234' http://cnn.com

img

对于 “User-Agent”, “Cookie”, “Host” 这类标准的 HTTP 头部字段,通常会有另外一种设置方法。curl 命令提供了特定的选项来对这些头部字段进行设置:

--A (or --user-agent): 设置 “User-Agent” 字段.
--b (or --cookie): 设置 “Cookie” 字段.
--e (or --referer): 设置 “Referer” 字段.

例如,以下两个命令是等效的。这两个命令同样都对 HTTP 头的 “User-Agent” 字符串进行了更改。

$ curl -H "User-Agent: my browser" http://cnn.com$ curl -A "my browser" http://cnn.com

wget 是另外一个类似于 curl,可以用来获取 URL 的命令行工具。并且 wget 也一样允许你使用一个自定义的 HTTP 头。点击 这里 查看 wget 命令的详细信息。


via: http://ask.xmodulo.com/custom-http-header-curl.html

译者:Ping 校对:wxy


在 Linux 中修复 “fatal error: lame/lame.h: No such file or dir

作者:Dan Nanni
译者: LCTT geekpi

| 2015-04-26 10:43

问: 我尝试着在 Linux 中编译视频编码器,但是编译提示出错:“fatal error: lame/lame.h: No such file or directory”, 我该如何修复这个错误?

下面的编译错误说明你的系统没有安装 LAME 库和它的开发文件。

fatal error: lame/lame.h: No such file or directory

LAME(“LAME Ain’t an MP3 Encoder”)是一个流行的 LPGL 授权的 MP3 编码器。许多视频编码工具使用或者支持 LAME,如 FFmpeg、 VLC、 Audacity、 K3b、 RipperX 等。

要修复这个编译错误,你需要安装 LAME 库和开发文件,按照下面的来。

在 Debian、Ubuntu 或者 Linux Mint 上安装 LAME 库和安装文件

Debian 和它的衍生版在基础库中已经提供了 LAME 库,因此可以用 apt-get 直接安装。

$ sudo apt-get install libmp3lame-dev

在 Fedora、CentOS/RHEL 上安装 LAME 库和安装文件

在基于 RED HAT 的版本中,LAME 在 RPM Fusion 的免费仓库中就有,那么你需要先设置 RPM Fusion (免费) 仓库。

RPM Fusion 设置完成后,如下安装 LAME 开发包。

$ sudo yum --enablerepo=rpmfusion-free-updates install lame-devel

在 2015 年 1 月,RPM Fusion 仓库已经不可以在 CentOS/RHEL 7 中可用了。因此,这个方法不能用在 CentOS/RHEL 7 中。这时你就要从源码安装 LAME 库了(下面会描述)。

在 Debian、Ubuntu 或者 Linux Mint 中从源码编译 LAME 库

如果你希望用不同的编译选项安装自定义的 LAME 库,你需要自己编译。下面是怎样在基于 Debian 的系统中编译和安装 LAME 库(和它的头文件)。

$ sudo apt-get install gcc git$ wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz$ tar -xzf lame-3.99.5.tar.gz$ cd lame-3.99.5$ ./configure --enable-static --enable-shared$ make$ sudo make install

注意当你运行上面的配置步骤时,你可以根据你的需求启用会禁止不同的选项。运行下面的命令查看不同的编译选项。

$ ./configure --help

共享 / 静态的 LAME 库默认安装在 /usr/local/lib。要让共享库可以被其他程序使用,完成最后一步:

用编辑器打开 /etc/ld.so.conf,加入下面这行。

/usr/local/lib

接着运行下面的命令,这会将 /usr/local/lib 中的共享库添加到动态加载缓存中,因此 LAME 库就可以被其他程序调用了。

$ sudo ldconfig

在 Fedora 或者 CentOS/RHEL 中从源码编译 LAME 库

如果你的发行版(比如 CentOS 7)没有提供预编译的 LAME 库,或者你想要自定义 LAME 库,你需要从源码自己编译。下面是在基于 Red Hat 的系统中编译安装 LAME 库的方法。

$ sudo yum install gcc git$ wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz$ tar -xzf lame-3.99.5.tar.gz$ cd lame-3.99.5$ ./configure --enable-static --enable-shared$ make$ sudo make install

运行 make 之前,你可以在 configure 中带上合适的选项自定义编译选项。你可以用下面的命令检查可用的选项:

$ ./configure --help

最后你需要完成最后一步,因为安装在 /usr/local/lib 的 LAME 共享库可能在其他程序中不可用。

在 /etc/ld.so.conf 中添加下面这行:

/usr/local/lib

接着运行下面的命令。这会添加 /usr/local/lib 中的共享库 (包括 LAME) 到动态加载缓存中,让其他程序可以访问到。

$ sudo ldconfig

img


via: http://ask.xmodulo.com/fatal-error-lame-no-such-file-or-directory.html

作者:Dan Nanni 译者:geekpi 校对:wxy


Perl 中本地时间和 UNIX 时间戳间相互转换

作者:Dan Nanni 译者: LCTT Vic___

| 2015-04-08 11:52

问: 在 Perl 语言中,我需要转换易读的日期和时间到对应的 UNIX 时间戳,反之亦然。你可以给我一些将日期及时间转换到 UNIX 时间戳的 Perl 代码例子吗?或者相反,转换 UNIX 时间戳到可读的日期和时间。

当你的 Perl 脚本需要解决时间信息,这里有两种方法来表示和处理日期和时间。一种方法是易读的时间表示(例,“Sat Mar 14 10:14:05 EDT 2015”),另外一种是使用 UNIX 时间戳(也叫 “新纪元时间”),这是从 1970 年 1 月 1 日到今所经过的时间秒数。每一种方法都有它自己的优劣势,取决于你的需要,也许也就需要转换一种格式到另一种。

Perl 中转换本地时间到 UNIX 时间戳

为了从日期字符串中获得 UNIX 时间,可以使用 Date::Parse 模块中 str2time () 函数。此函数可以处理多种格式,例如:

  • Sat Mar 14 10:14:05 EDT 2015
  • 3/14/2015 10:14:05 -0400
  • 14/Mar/15 10:14:05
  • 14 Mar 15 10:14:05
use Date::Parse;my $local_time = "Sat Mar 14 10:14:05 EDT 2015";# 1426342445 will be stored in $unix_timemy $unix_time = str2time ($local_time);

Date:Parse 模块支持多种语言(英语,法语,德语和意大利语)和时区。例如:

use Date::Parse;use Date::Language;my $lang = Date::Language->new ('French');my $unix_time = $lang->str2time ("12:14:05, Ago 16, 2014 (CEST)");

Perl 中 UNIX 时间戳到易读的日期和时间

如果你想要转换 UNIX 时间戳到易读的格式,可以使用 localtime () 函数,此函数可以转换 UNIX 时间戳为一个 9 元素列表。然后你可以使用返回的 list 构造任何你需要的可读格式。这里有一个代码片段:

# $sec, $min, $hour: 秒,分,时# $mday: 月中的某天 (0-31)# $mon: 月份,范围 0 (一月) 至 11 (十二月)# $year: 年份,与 1900 年的差值 (2015 年为 2015-1900=115)# $wday: 星期,范围 0 (星期天) 至 6 (星期六)# $yday: 年中的某天,范围 0 至 364 (或 365 闰年)# $isdst: 是否是夏令时 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime ($unix_timestamp);# necessary conversion of $mon and $year$mon += 1;$year += 1900;print "Current time: $year-$mon-$mday $hour:$min:$sec\n";

via: http://ask.xmodulo.com/convert-local-time-unix-timestamp-perl.html

作者:Dan Nanni 译者:VicYu/Vic020 校对:wxy


解决 “XXX is not in the sudoers file” 错误

译者:ZTinoZ

校对:wxy

| 2015-03-09 21:43

问: 我想在我的 Linux 系统上使用 sudo 来运行一些特权命令,然而当我试图这么做时,我却得到了 “[我的用户名] is not in the sudoers file. This incident will be reported.” 的错误信息。我该怎么处理这种 sudo 错误呢?

sudo 是一个允许特定的用户组用另一个用户 (典型的是 root) 的特权来运行一个命令。sudo 有详细的日志功能,并且提供了对用户可通过 sudo 来运行哪些命令的细粒度控制。

Sudo vs. Su

su 命令也提供了同样的特权提升功能,两者不同的是它们认证过程和特权变化的粒度。su 允许你从你的登录会话切换到另一个用户的会话,然后你可以随心所欲地用该用户的特权来运行任何程序,但是你需要知道目标用户的密码才能切换这个用户。而另一方面,sudo 能在单个命令的基础上工作,允许你用 root 的特权来运行单个命令。用 sudo 你不必一定要知道 root 的密码,但是在提示输入 sudo 密码的时候要输入你的密码。

img

在 Sudoers 列表里添加用户

作为一个新用户的你如果试图运行 sudo 命令,你会碰到以下错误。意思是你不在这个包含经过认证就可以使用 sudo 特权的这么一个用户组的 sudoers 列表里。

[my-user-id] is not in the sudoers file.  This incident will be reported.

有两个方法可以把你加入到 sudoers 列表中去。

方法一

第一个方法是把你添加到名为 sudo 的 Linux 用户组里。这个特殊的 Linux 用户组是预配置来使用 sudo 的。因此,一旦你在这个组里面,那你就可以运行 sudo 命令了。

以下命令会把你加入到 Linux 的 sudo 组里,你需要在 root 用户下运行该命令。

# adduser < 用户名 > sudo

现在来确认你的组员资格有没有更新,使用 groups 命令来看看你当前属于哪个组的列表里。这个列表必定是包含 sudo 组的。

$ groups

alice adm cdrom sudo dip plugdev fuse lpadmin netdev sambashare davfs2 libvirtd docker promiscuous

组员资格变动(和 sudo 访问)会在你登出后重新登录后生效。

方法二

第二个能让你使用 sudo 的方法是直接把你自己添加到 /etc/sudoers 这个配置文件中去。

要修改 /etc/sudoers 文件,你可以使用一个名为 visudo 的特殊 sudo 编辑器命令。用 root 身份简单调用以下命令。

# visudo

这条命令能打开并编辑 /etc/sudoers 文件,将以下这行文字添加至文件末尾,并按 Ctrl+X。提示出现时,保存修改退出。

<username> ALL=(ALL) ALL

这个修改会立即生效,你就能马上使用 sudo 了。

img

via: http://ask.xmodulo.com/fix-is-not-in-the-sudoers-file.html


在 Linux 中加入 cron 任务

译者:geekpi

校对:wxy

| 2015-02-23 08:18 评论: 11 收藏: 4 分享: 14

问: 我想在我的 Linux 中安排一个计划任务,该任务在固定时间周期性地运行。我该如何在 Linux 中添加一个 cron 任务?

cron 是 Linux 中默认的计划任务。使用 cron,你可以安排一个计划(比如:命令或者 shell 脚本)周期性地运行或者在指定的分钟、小时、天、周、月等特定时间运行。cron 在你安排不同的常规维护任务时是很有用的,比如周期性地备份、日志循环、检查文件系统、监测磁盘空间等等。

img

(题图来自 eagleapex.com)

从命令行中添加 cron 任务

要添加 cron 任务,你可以使用称为 crontab 的命令行工具。

输入下面的命令会创建一个以当前用户运行的新 cron 任务。

$ crontab -e

如果你想要以其他用户运行 cron 任务,输入下面的命令。

$ sudo crontab -u <username> -e

你将会看见一个文本编辑窗口,这里你可以添加或者编辑 cron 任务。默认使用 nono 编辑器。

img

每个 cron 任务的格式如下。

< 分钟 > < 小时 > < 日 > < 月 > < 星期 > < 命令 >

前 5 个元素定义了任务的计划,最后一个元素是命令或者脚本的完整路径。

img

下面是一些 cron 任务示例。

-* * * * /home/dan/bin/script.sh: 每分钟运行。
-0 * * * * /home/dan/bin/script.sh: 每小时运行。
-0 0 * * * /home/dan/bin/script.sh: 每天零点运行。
-0 9,18 * * * /home/dan/bin/script.sh: 在每天的 9AM 和 6PM 运行。
-0 9-18 * * * /home/dan/bin/script.sh: 在 9AM 到 6PM 的每个小时运行。
-0 9-18 * * 1-5 /home/dan/bin/script.sh: 周一到周五的 9AM 到 6PM 每小时运行。
-
/10 * * * * /home/dan/bin/script.sh: 每 10 分钟运行。

一旦完成上面的设置步骤后,按下 Ctrl+X 来保存并退出编辑器。此时,新增的计划任务应该已经激活了。

要查看存在的计划任务,使用下面的命令:

$ crontab -l

从 GUI 添加计划任务

如果你在 Linux 桌面环境中,你可以使用 crontab 的更加友好的 GUI 前端来添加或者添加一个 cron 任务。

在 Gnome 桌面中,有一个 Gnome Schedule(gnome-schedule 包)。

img

在 KDE 桌面中,有一个 Task Scheduler(kcron 包)。

img

\ —

via: http://ask.xmodulo.com/add-cron-job-linux.html


在 Linux 下重命名多个文件

译者:geekpi

校对:wxy

| 2015-02-18 15:24

问:我知道我可以用 mv 命令重命名文件。但是当我想重命名很多文件怎么办?如果为每个文件都这么做将会是很乏味的。有没有办法一次性重命名多个文件?

在 Linux 中,当你想要改变一个文件名,使用 mv 命令就好了。然而 mv 不能使用通配符重命名多个文件。可以用 sed、awk 或者与 xargs 结合使用来处理多个文件的情况。然而,这些命令行即繁琐又不友好,并且如果不小心的话还很容易出错。你不会想要撤销 1000 个文件的错误名吧!

当你想要重命名多个文件的时候,rename 工具或许是最简单、最安全和最强大的命令行工具。这个 rename 命令实际上是一个 Perl 脚本,它预安装在所有的现在 Linux 发行版上。

下面是重命名命令的基本语法。

rename [-v -n -f] <pcre> <files>

是 Perl 兼容正则表达式,它表示的是要重命名的文件和该怎么做。正则表达式的形式是‘s/old-name/new-name/’。

‘-v’选项会显示文件名改变的细节(比如:XXX 重命名成 YYY)。

‘-n’选项告诉 rename 命令在不实际改变名称的情况下显示文件将会重命名的情况。这个选项在你想要在不改变文件名的情况下模拟改变文件名的情况下很有用。

‘-f’选项强制覆盖存在的文件。

下面,就让我们看下 rename 命令的几个实际例子。

改变文件扩展名

假设你有许多.jpeg 的图片文件。你想要把它们的名字改成 *.jpg。下面的命令就会将 *.jpeg 文件改成 *.jpg。

$ rename's/\.jpeg$/\.jpg/' *.jpeg

大写改成小写,反之亦然

有时你想要改变文件名的大小写,你可以使用下面的命令。

把所有的文件改成小写:

# rename 'y/A-Z/a-z/' *

把所有的文件改成大写:

# rename 'y/a-z/A-Z/' *

img

更改文件名模式

现在让我们考虑更复杂的包含子模式的正则表达式。在 PCRE 中,子模式包含在圆括号中,$ 符后接上数字(比如 $1,$2)。

比如,下面的命令会将‘imgNNNN.jpeg’变成‘danNNNN.jpg’。

# rename -v's/img_(\d {4})\.jpeg$/dan_$1\.jpg/' *.jpeg

img_5417.jpeg renamed as dan_5417.jpgimg_5418.jpeg renamed as dan_5418.jpgimg_5419.jpeg renamed as dan_5419.jpgimg_5420.jpeg renamed as dan_5420.jpgimg_5421.jpeg renamed as dan_5421.jpg

比如,下面的命令会将‘img_000NNNN.jpeg’变成‘dan_NNNN.jpg’。

# rename -v's/img_\d {3}(\d {4})\.jpeg$/dan_$1\.jpg/' *jpeg

img_0005417.jpeg renamed as dan_5417.jpgimg_0005418.jpeg renamed as dan_5418.jpgimg_0005419.jpeg renamed as dan_5419.jpgimg_0005420.jpeg renamed as dan_5420.jpgimg_0005421.jpeg renamed as dan_5421.jpg

上面的例子中,子模式‘\d {4}’会捕捉 4 个连续的数字,捕捉的四个数字就是 $1, 将会用于新的文件名。


via: http://ask.xmodulo.com/rename-multiple-files-linux.html


检查 Linux 的内存使用状况

译者:Ping

校对:wxy

| 2015-02-06 09:24

:我想要监测 Linux 系统的内存使用状况。有哪些可用的图形界面或者命令行工具来检查当前内存使用情况?

当涉及到 Linux 系统性能优化的时候,物理内存是一个最重要的因素。自然的,Linux 提供了丰富的选择来监测珍贵的内存资源的使用情况。不同的工具,在监测粒度(例如:全系统范围,每个进程,每个用户),接口方式(例如:图形用户界面,命令行,ncurses)或者运行模式(交互模式,批量处理模式)上都不尽相同。

img

下面是一个可供选择的,但并不全面的图形或命令行工具列表,这些工具用来检查 Linux 平台中已用和可用的内存。

1. /proc/meminfo

一种最简单的方法是通过 “/proc/meminfo” 来检查内存使用状况。这个动态更新的虚拟文件事实上是诸如 free,top 和 ps 这些与内存相关的工具的信息来源。从可用 / 闲置物理内存数量到等待被写入缓存的数量或者已写回磁盘的数量,只要是你想要的关于内存使用的信息,“/proc/meminfo” 应有尽有。特定进程的内存信息也可以通过 “/proc//statm” 和 “/proc//status” 来获取。

$ cat /proc/meminfo

img

2. atop

atop 命令是用于终端环境的基于 ncurses 的交互式的系统和进程监测工具。它展示了动态更新的系统资源摘要(CPU, 内存,网络,输入 / 输出,内核),并且用醒目的颜色把系统高负载的部分以警告信息标注出来。它同样提供了类似于 top 的线程(或用户)资源使用视图,因此系统管理员可以找到哪个进程或者用户导致的系统负载。内存统计报告包括了总计 / 闲置内存,缓存的 / 缓冲的内存和已提交的虚拟内存。

$ sudo atop

img

3. free

free 命令是一个用来获得内存使用概况的快速简单的方法,这些信息从 “/proc/meminfo” 获取。它提供了一个快照,用于展示总计 / 闲置的物理内存和系统交换区,以及已使用 / 闲置的内核缓冲区。

$ free -h

img

4. GNOME System Monitor

GNOME System Monitor 是一个图形界面应用,它展示了包括 CPU,内存,交换区和网络在内的系统资源使用率的较近历史信息。它同时也可以提供一个带有 CPU 和内存使用情况的进程视图。

$ gnome-system-monitor

img

5. htop

htop 命令是一个基于 ncurses 的交互式的进程视图,它实时展示了每个进程的内存使用情况。它可以报告所有运行中进程的常驻内存大小(RSS)、内存中程序的总大小、库大小、共享页面大小和脏页面大小。你可以横向或者纵向滚动进程列表进行查看。

$ htop

img

6. KDE System Monitor

就像 GNOME 桌面拥有 GNOME System Monitor 一样,KDE 桌面也有它自己的对口应用:KDE System Monitor。这个工具的功能与 GNOME 版本极其相似,也就是说,它同样展示了一个关于系统资源使用情况,以及带有每个进程的 CPU / 内存消耗情况的实时历史记录。

$ ksysguard

img

7. memstat

memstat 工具对于识别正在消耗虚拟内存的可执行部分、进程和共享库非常有用。给出一个进程识别号,memstat 即可识别出与之相关联的可执行部分、数据和共享库究竟使用了多少虚拟内存。

$ memstat -p <PID>

img

8. nmon

nmon 工具是一个基于 ncurses 系统基准测试工具,它能够以交互方式监测 CPU、内存、磁盘 I/O、内核、文件系统以及网络资源。对于内存使用状况而言,它能够展示像总计 / 闲置内存、交换区、缓冲的 / 缓存的内存,虚拟内存页面换入换出的统计,所有这些都是实时的。

$ nmon

img

9. ps

ps 命令能够实时展示每个进程的内存使用状况。内存使用报告里包括了 % MEM (物理内存使用百分比), VSZ (虚拟内存使用总量), 和 RSS (物理内存使用总量)。你可以使用 “–sort” 选项来对进程列表排序。例如,按照 RSS 降序排序:

$ ps aux --sort -rss

img

10. smem

smem 命令允许你测定不同进程和用户的物理内存使用状况,这些信息来源于 “/proc” 目录。它利用 “按比例分配大小(PSS)” 指标来精确量化 Linux 进程的有效内存使用情况。内存使用分析结果能够输出为柱状图或者饼图类的图形化图表。

$ sudo smem --pie name -c "pss"

img

11. top

top 命令提供了一个运行中进程的实时视图,以及特定进程的各种资源使用统计信息。与内存相关的信息包括 % MEM (内存使用率), VIRT (虚拟内存使用总量), SWAP (换出的虚拟内存使用量), CODE (分配给代码执行的物理内存数量), DATA (分配给非执行的数据的物理内存数量), RES (物理内存使用总量;CODE+DATA), 和 SHR (有可能与其他进程共享的内存数量)。你能够基于内存使用情况或者大小对进程列表进行排序。

img

12. vmstat

vmstat 命令行工具显示涵盖了 CPU、内存、中断和磁盘 I/O 在内的各种系统活动的瞬时和平均统计数据。对于内存信息而言,命令不仅仅展示了物理内存使用情况(例如总计 / 已使用内存和缓冲的 / 缓存的内存),还同样展示了虚拟内存统计数据(例如,内存页的换入 / 换出,虚拟内存页的换入 / 换出)

$ vmstat -s

img


via: http://ask.xmodulo.com/check-memory-usage-linux.html


在 linux 上安装 WPS

译者:Vic020/VicYu

校对:wxy

| 2015-02-01 14:21

Kingsoft Office 是一套办公套件,支持多个平台,包括 Windows, Linux, iOS 和 Android。它包含三个组件:Writer(WPS 文字)用来文字处理,Presentation(WPS 演示)支持幻灯片,Spereadsheets(WPS 表格)是电子表格。其使用免费增值模式,其中基础版本是免费使用。比较其他的 linux 办公套件,如 LibreOffice、 OpenOffice,其最大优势在于,Kingsoft Office 能最好的兼容微软的 Office(译注:版权问题?了解下 wps 和 Office 的历史问题,可以得到一些结论)。因此如果你需要在 windows 和 linux 平台间交互,Kingsoft office 是一个很好的选择。

CentOS, Fedora 或 RHEL 中安装 Kingsoft Office

在官方页面下载 RPM 文件。官方 RPM 包只支持 32 位版本 linux,但是你可以在 64 位中安装。

需要使用 yum 命令并用 “localinstall” 选项来本地安装这个 RPM 包

$ sudo yum localinstall kingsoft-office-9.1.0.4244-0.1.a12p3.i686.rpm

注意不要使用 rpm 命令安装。否者,你会得到依赖错误,而且很难解决:

error: Failed dependencies:
        libICE.so.6 is needed by kingsoft-office-9.1.0.4244-0.1.a12p3.i686
        libSM.so.6 is needed by kingsoft-office-9.1.0.4244-0.1.a12p3.i686
        libX11.so.6 is needed by kingsoft-office-9.1.0.4244-0.1.a12p3.i686
        libXext.so.6 is needed by kingsoft-office-9.1.0.4244-0.1.a12p3.i686
        libXrender.so.1 is needed by kingsoft-office-9.1.0.4244-0.1.a12p3.i686
        libc.so.6 is needed by kingsoft-office-9.1.0.4244-0.1.a12p3.i686

基于 Red Hat 的发行版有多重库支持。如果你要想安装的 RPM 包是 32 位的并有 32 位库依赖(你的系统是 64 位的),一个很好的解决方法就是使用 yum 来安装。只要 RPM 在构建时候已经添加所有依赖关系,yum 就可以自动使用 yum 库解决依赖关系。

img

Debian, Ubuntu 和 Linux Mint 中安装 Kingsoft Office

在官方页面下载 DEB 包。官方 RPM 包同样只支持 32 位版本 linux,但是你可以在 64 位中安装。

DEB 包同样遇到一堆依赖。因此使用 gdebi 命令来代替 dpkg 来自动解决依赖。

$ sudo apt-get install gdebi-core
$ sudo gdebi kingsoft-office_9.1.0.4244~a12p3_i386.deb

启动 Kingsoft Office

安装完成后,你就可以在桌面管理器轻松启动 Witer(WPS 文字), Presentation(WPS 演示), and Spreadsheets(WPS 表格),如下图。

Ubuntu Unity 中:

img

GNOME 桌面中:

img

不但如此,你也可以在命令行中启动 Kingsoft Office。

启动 Wirter(WPS 文字),使用这个命令:

$ wps (译注:原文丢失此命令)

img

启动 Presentation(WPS 演示),使用这个命令:

$ wpp

img

启动 Spreadsheets(WPS 表格),使用这个命令:

$ et

img


via: http://ask.xmodulo.com/install-kingsoft-office-linux.html


禁止 Ubuntu 的 Apport 内部错误报告程序

译者:VicYu/Vic020

校对:wxy

| 2015-01-14 10:22

:在桌面版 Ubuntu 中,我经常遇到一些弹窗窗口,警告我 Ubuntu 发生了内部错误,问我要不要发送错误报告。每次软件崩溃都要烦扰我,我如何才能关掉这个错误报告功能呢?

Ubuntu 桌面版预装了 Apport,它是一个错误收集系统,会收集软件崩溃、未处理异常和其他,包括程序 bug,并为调试目的生成崩溃报告。当一个应用程序崩溃或者出现 Bug 时候,Apport 就会通过弹窗警告用户并且询问用户是否提交崩溃报告。你也许也看到过下面的消息。

  • “Sorry, the application XXXX has closed unexpectedly.”
  • “对不起,应用程序 XXXX 意外关闭了。”
  • “Sorry, Ubuntu XX.XX has experienced an internal error.”
  • “对不起,Ubuntu XX.XX 发生了一个内部错误。”
  • “System program problem detected.”
  • “检测到系统程序问题。”

img

也许因为应用一直崩溃,频繁的错误报告会使人心烦。也许你担心 Apport 会收集和上传你的 Ubuntu 系统的敏感信息。无论什么原因,你想关掉 Apport 的错误报告功能。

临时关闭 Apport 错误报告

如果你想要临时关闭 Apport,使用下列命令

$ sudo service apport stop

注意重启 Ubuntu 系统 Apport 会继续开启

永久关闭 Apport 错误报告

为了永久关闭 Apport,编辑 /etc/default/apport,修改下列参数

enabled=0

重启你的 Ubuntu 系统,Apport 将会自动关闭

如果你再也不会用 Apport,有一种简单的方法完全移除它

$ sudo apt-get purge apport

\ —

via: http://ask.xmodulo.com/disable-apport-internal-error-reporting-ubuntu.html


在 Linux 上安装内核头文件

译者:geekpi

校对:wxy

| 2015-01-09 12:24

问: 我在安装一个设备驱动前先要安装内核头文件。怎样安装合适的内核头文件?

当你在编译一个设备驱动模块时,你需要在系统中安装内核头文件。内核头文件同样在你编译与内核直接链接的用户空间程序时需要。当你在这些情况下安装内核头文件时,你必须确保内核头文件精确地与你当前内核版本匹配(比如:3.13.0-24-generic)。

img

如果你的内核是发行版自带的内核版本,或者使用默认的包管理器的基础仓库升级的(比如:apt-ger、aptitude 或者 yum),你也可以使用包管理器来安装内核头文件。另一方面,如果下载的是 kernel 源码 并且手动编译的,你可以使用 make 命令 来安装匹配的内核头文件。

现在我们假设你的内核是发行版自带的,让我们看下该如何安装匹配的头文件。

在 Debian、Ubuntu 或者 Linux Mint 上安装内核头文件

假设你没有手动编译内核,你可以使用 apt-get 命令来安装匹配的内核头文件。

首先,使用 dpkg-query 命令检查是否有可用的内核头文件。

$ dpkg-query -s linux-headers-$(uname -r)
dpkg-query: package 'linux-headers-3.11.0-26-generic' is not installed and no information is available

接着使用下面的命令安装匹配的内核头文件。

$ sudo apt-get install linux-headers-$(uname -r)

img

验证头文件是否成功安装。

$ dpkg-query -s linux-headers-$(uname -r)

Package: linux-headers-3.11.0-26-genericStatus: install ok installed

Debian、Ubuntu、Linux Mint 默认头文件在**/usr/src**下。

在 Fedora、CentOS 或者 RHEL 上安装内核头文件

假设你没有手动编译内核,你可以使用 yum 命令来安装匹配的内核头文件。

首先,用下面的命令检查系统是否已经安装了头文件。如果下面的命令没有任何输出,这就意味着还没有头文件。

$ rpm -qa | grep kernel-headers-$(uname -r)

接着用 yum 命令安装头文件。这个命令会自动找出合适的头文件并安装。

$ sudo yum install kernel-headers

img

验证包安装的状态。

$ rpm -qa | grep kernel-headers-$(uname -r)

kernel-headers-3.10.0-123.9.3.el7.x86_64

Fedora、CentOS 或者 RHEL 上默认内核头文件的位置是**/usr/include/linux**。

via: http://ask.xmodulo.com/install-kernel-headers-linux.html


当前正在使用的 shell

作者:Dan Nanni

译者:strugglingyouth

校对:wxy

| 2015-11-27 07:50

查看当前正在使用的 Shell 版本

有多种方式可以查看你目前在使用什么 shell,最简单的方法就是通过使用 shell 的特殊参数。

其一,一个名为 “$$” 的特殊参数 表示当前你正在运行的 shell 实例的 PID。此参数是只读的,不能被修改。所以,下面的命令也将显示你正在运行的 shell 的名字:

$ ps -p $$  PID TTY          TIME CMD21666 pts/4    00:00:00 bash

上述命令可在所有可用的 shell 中工作。

如果你不使用 csh,找到当前使用的 shell 的另外一个办法是使用特殊参数 “$0” ,它表示当前正在运行的 shell 或 shell 脚本的名称。这是 Bash 的一个特殊参数,但也可用在其他 shell 中,如 sh、zsh、tcsh 或 dash。使用 echo 命令可以查看你目前正在使用的 shell 的名称。

$ echo $0bash

不要被一个叫做 S H E L L 的单独的环境变量所迷惑,它被设置为你的默认 s h e l l 的完整路径。因此,这个变量并不一定指向你当前使用的 s h e l l 。例如,即使你在终端中调用不同的 s h e l l , SHELL 的单独的环境变量所迷惑,它被设置为你的默认 shell 的完整路径。因此,这个变量并不一定指向你当前使用的 shell。例如,即使你在终端中调用不同的 shell, SHELL的单独的环境变量所迷惑,它被设置为你的默认shell的完整路径。因此,这个变量并不一定指向你当前使用的shell。例如,即使你在终端中调用不同的shellSHELL 也保持不变。

$ echo $SHELL/bin/shell

img

因此,找出当前的 shell,你应该使用 $$ 或 $0,但不是 $SHELL。

找出当前 Shell 的版本

一旦你知道你使用的是哪个 shell,你可能想知道此 shell 的版本。为此,在命令行中输入 shell 并在后面加上 “–version” 参数可以查看版本信息。例如:

对于bashshell:

$ bash --version
GNU bash, version 4.3.30 (1)-release (x86_64-pc-linux-gnu) Copyright (C) 2013 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later This is free software; you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.

对于zshshell:

$ zsh --versionzsh 5.0.7 (x86_64-pc-linux-gnu)

对于tcshshell: $ tcsh --version

tcsh 6.18.01 (Astron) 2012-02-14 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,nd,color,filec

对于某些 shell,你还可以使用 shell 特定的变量(例如,$BASHVERSION 或 $ZSHVERSION)。

$ echo $BASH_VERSION4.3.8 (1)-release

\ —

via: http://ask.xmodulo.com/which-shell-am-i-using.html


强制在下次登录 Linux 时更换密码

作者:Dan Nanni

译者:geekpi

校对:wxy

| 2015-10-29 13:31

问:我管理着一台多人共享的 Linux 服务器。我刚使用默认密码创建了一个新用户,但是我想用户在第一次登录时更换密码。有没有什么方法可以让他 / 她在下次登录时修改密码呢?

在多用户 Linux 环境中,标准实践是使用一个默认的随机密码创建一个用户账户。成功登录后,新用户自己改变默认密码。出于安全考虑,经常建议 “强制” 用户在第一次登录时修改密码来确保这个一次性使用的密码不会再被使用。

下面是如何强制用户在下次登录时修改他 / 她的密码

每个 Linux 用户都关联这不同的密码相关配置和信息。比如,记录着上次密码更改的日期、最小 / 最大的修改密码的天数、密码何时过期等等。

一个叫 chage 的命令行工具可以访问并调整密码过期相关配置。你可以使用这个工具来强制用户在下次登录修改密码、

要查看特定用户的过期信息(比如:alice),运行下面的命令。注意的是除了你自己之外查看其他任何用户的密码信息都需要 root 权限。

$ sudo chage -l alice

img

强制用户修改密码

如果你想要强制用户去修改他 / 她的密码,使用下面的命令。

$ sudo chage -d0 <user-name>

原本 “-d ” 参数是用来设置密码的 “年龄”(也就是上次修改密码起到 1970/1/1 起的天数)。因此 “-d0” 的意思是上次密码修改的时间是 1970/1/1,这就让当前的密码过期了,也就强制让他在下次登录的时候修改密码了。

另外一个过期当前密码的方式是用 passwd 命令。

$ sudo passwd -e <user-name>

上面的命令和 “chage -d0” 作用一样,让当前用户的密码立即过期。

现在检查用户的信息,你会发现:

img

当你再次登录时候,你会被要求修改密码。你会在修改前被要求再验证一次当前密码。

img

要设置更全面的密码策略(如密码复杂性,防止重复使用),则可以使用 PAM。参见 这篇文章 了解更多详情。

\ —

via: http://ask.xmodulo.com/force-password-change-next-login-linux.html


找出 Linux 中内置模块的信息

作者:Dan Nanni

译者:geekpi

校对:wxy

| 2015-11-02 08:00

问:我想要知道 Linux 系统中内核内置的模块,以及每个模块有哪些参数。有什么方法可以得到内置模块和设备驱动的列表,以及它们的详细信息呢?

现代 Linux 内核正在随着时间变化而迅速增长,以支持大量的硬件、文件系统和网络功能。在此期间,“可加载模块(loadable kernel modules,[LKM])” 的引入防止内核变得越来越臃肿,以及在不同的环境中灵活地扩展功能及硬件支持,而不必重新构建内核。

最新的 Linux 发行版的内核只带了相对较小的 “内置模块(built-in modules)”,其余的特定硬件驱动或者自定义功能作为 “可加载模块” 来让你选择地加载或卸载。

内置模块被静态地编译进了内核。不像可加载内核模块可以动态地使用 modprobeinsmodrmmodmodinfo 或者 lsmod 等命令地加载、卸载、查询模块,内置的模块总是在启动时就加载进了内核,不会被这些命令管理。

找出内置模块列表

要得到内置模块列表,运行下面的命令。

$ cat /lib/modules/$(uname -r)/modules.builtin

img

你也可以用下面的命令来查看有哪些内置模块:

img

找出内置模块参数

每个内核模块无论是内置的还是可加载的都有一系列的参数。对于可加载模块,modinfo 命令可以显示它们的参数信息。然而这个命令对内置模块没有用。你会得到下面的错误。

modinfo: ERROR: Module XXXXXX not found.

如果你想要查看内置模块的参数,以及它们的值,你可以在**/sys/module**下检查它们的内容。

在 /sys/module 目录下,你可以找到内核模块(包含内置和可加载的)命名的子目录。进入每个模块目录,这里有个 “parameters” 目录,列出了这个模块所有的参数。

比如你要找出 tcp_cubic(内核默认的 TCP 实现)模块的参数。你可以这么做:

$ ls /sys/module/tcp_cubic/parameters

接着阅读这个文件查看每个参数的值。

$ cat /sys/module/tcp_cubic/parameters/tcp_friendliness

img

\ —

via: http://ask.xmodulo.com/find-information-builtin-kernel-modules-linux.html


在 Linux 中永久修改 USB 设备权限

作者:Dan Nanni 译者: LCTT geekpi

| 2015-10-22 09:14

问:当我尝试在 Linux 中运行 USB GPS 接收器时我遇到了下面来自 gpsd 的错误。

gpsd [377]: gpsd:ERROR: read-only device open failed: Permission deniedgpsd [377]: gpsd:ERROR: /dev/ttyUSB0: device activation failed.gpsd [377]: gpsd:ERROR: device open failed: Permission denied - retrying read-only

看上去 gpsd 没有权限访问 USB 设备(/dev/ttyUSB0)。我该如何永久修改它在 Linux 上的权限?

当你在运行一个会读取或者写入 USB 设备的进程时,进程的用户 / 组必须有权限这么做才行。当然你可以手动用 chmod 命令改变 USB 设备的权限,但是手动的权限改变只是暂时的。USB 设备会在下次重启时恢复它的默认权限。

img

作为一个永久的方式,你可以创建一个基于 udev 的 USB 权限规则,它可以根据你的选择分配任何权限模式。下面是该如何做。

首先,你需要找出 USB 设备的 vendorID 和 productID。使用 lsusb 命令。

$ lsusb -vvv

img

上面 lsusb 的输出中,找出 USB 设备,并找出 “idVendor” 和 “idProduct” 字段。本例中,结果是 idVendor (0x067b)idProduct (0x2303)

下面创建一个新的 udev 规则。

$ sudo vi /etc/udev/rules.d/50-myusb.rules

SUBSYSTEMS=="usb", ATTRS {idVendor}=="067b", ATTRS {idProduct}=="2303", GROUP="users", MODE="0666"

用自己的 “idVendor” 和 “idProduct” 来替换。**MODE=“0666”**表示 USB 设备的权限。

现在重启电脑并重新加载 udev 规则:

$ sudo udevadm control --reload

接着验证下 USB 设备的权限。

img

via: http://ask.xmodulo.com/change-usb-device-permission-linux.html

作者:Dan Nanni 译者:geekpi 校对:wxy

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/941000.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP阶段一

PHP 一门编程语言 运行在服务器端 专门用户开发网站的 脚本后缀名.php 与HTML语言进行混编&#xff0c;脚本后缀依然是.php 解释型语言&#xff0c;不要编译直接运行 PHP运行需要环境&#xff1a; Windows phpstudy Linux 单独安装 Web 原理简述 1、打开浏览器 2、输入u…

REMOTE_LISTENER引发的血案

作者&#xff1a;Digital Observer&#xff08;施嘉伟&#xff09; Oracle ACE Pro: Database PostgreSQL ACE Partner 11年数据库行业经验&#xff0c;现主要从事数据库服务工作 拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、P…

Redis篇--常见问题篇6--缓存一致性1(Mysql和Redis缓存一致,更新数据库删除缓存策略)

1、概述 在使用Redis作为MySQL的缓存层时&#xff0c;缓存一致性问题是指Redis中的缓存数据与MySQL数据库中的实际数据不一致的情况。这可能会导致读取到过期或错误的数据&#xff0c;从而影响系统的正确性和用户体验。 为了减轻数据库的压力&#xff0c;通常读操作都是先读缓…

Phono3py hdf5文件数据读取与处理

Phono3py是一个主要用python写的声子-声子相互作用相关性质的模拟包&#xff0c;可以基于有限位移算法实现三阶力常数和晶格热导率的计算过程&#xff0c;同时输出包括声速&#xff0c;格林奈森常数&#xff0c;声子寿命和累积晶格热导率等参量。 相关介绍和安装请参考往期推荐…

机器学习(四)-回归模型评估指标

文章目录 1. 哪个模型更好&#xff1f;2. 线性回归评估指标3. python 实现线性模型评估指标 1. 哪个模型更好&#xff1f; 我们之前已经对房价预测的问题构建了线性模型&#xff0c;并对测试集进行了预测。 如图所示&#xff0c;横坐标是地区人口&#xff0c;纵坐标是房价&am…

Oracle 适配 OpenGauss 数据库差异语法汇总

背景 国产化进程中&#xff0c;需要将某项目的数据库从 Oracle 转为 OpenGauss &#xff0c;项目初期也是规划了适配不同数据库的&#xff0c;MyBatis 配置加载路径设计的是根据数据库类型加载指定文件夹的 xml 文件。 后面由于固定了数据库类型为 Oracle 后&#xff0c;只写…

Unity引擎学习总结------动画控件

左侧窗格可以在参数视图和图层视图之间切换。参数视图允许您创建、查看和编辑动画控制器参数。这些是您定义的变量&#xff0c;用作状态机的输入。要添加参数&#xff0c;请单击加号图标并从弹出菜单中选择参数类型。要删除参数&#xff0c;请在列表中选择该参数并按删除键&…

记录:virt-manager配置Ubuntu arm虚拟机

virt-manager&#xff08;Virtual Machine Manager&#xff09;是一个图形用户界面应用程序&#xff0c;通过libvirt管理虚拟机&#xff08;即作为libvirt的图形前端&#xff09; 因为要在Linux arm环境做测试&#xff0c;记录下virt-manager配置arm虚拟机的过程 先在VMWare中…

VSCode 搭建Python编程环境 2024新版图文安装教程(Python环境搭建+VSCode安装+运行测试+背景图设置)

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。—— 苏轼《水调歌头》 创作者&#xff1a;Code_流苏(CSDN) 目录 一、Python环境安装二、VScode下载及安装三、VSCode配置Python环境四、运行测试五、背景图设置 很高兴你打开了这篇博客&#xff0c;更多详细的安装教程&…

VBA编程:自定义函数 - 字符串转Hex数据

目录 一、自定义函数二、语法将字符串转换为hex数据MID函数:返回一个字符串中指定位置和长度的子串LEN函数:返回一个字符串的长度(字符数)Asc函数三、定义变量和数据类型变量声明的基本语法常见的数据类型四、For循环基本语法五、&运算符一、自定义函数 定义:用户定义…

jvm字节码中方法的结构

“-Xss”这一名称并没有一个特定的“为什么”来解释其命名&#xff0c;它更多是JVM&#xff08;Java虚拟机&#xff09;配置参数中的一个约定俗成的标识。在JVM中&#xff0c;有多个配置参数用于调整和优化Java应用程序的性能&#xff0c;这些参数通常以一个短横线“-”开头&am…

网络架构与IP技术:4K/IP演播室制作的关键支撑

随着科技的不断发展&#xff0c;广播电视行业也在不断迭代更新&#xff0c;其中4K/IP演播室技术的应用成了一个引人注目的焦点。4K超高清技术和IP网络技术的结合&#xff0c;不仅提升了节目制作的画质和效果&#xff0c;还为节目制作带来了更高的效率和灵活性。那么4K超高清技术…

Mac上Stable Diffusion的环境搭建(还算比较简单)

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Installation-on-Apple-Silicon AI兴起的速度是真的快&#xff0c;感觉不了解点相关的东西都要与时代脱节了&#xff0c;吓得我赶紧找个AIGC看看能不能实现我艺术家的人梦想&#xff08;绷不住了&#xff09; 我…

什么是虚拟机?常用虚拟机软件有哪些?

目录 VMware Workstation Oracle VM VirtualBox Microsoft Hyper-V 虚拟机&#xff08;Virtual Machine&#xff0c;简称VM&#xff09;是一种通过软件模拟的具有完整硬件系统功能的、运行在计算机上的软件。它允许用户在单一物理机器上同时运行多个操作系统&#xff0c;每个…

git branch -r(--remotes )显示你本地仓库知道的所有 远程分支 的列表

好的&#xff0c;git branch -r 这个命令用于列出远程分支。让我详细解释一下&#xff1a; 命令&#xff1a; git branch -rdgqdgqdeMac-mini ProductAuthentication % git branch -rorigin/main作用&#xff1a; 这个命令会显示你本地仓库知道的所有 远程分支 的列表。它不…

Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)

01.生命周期 Vue生命周期&#xff1a;就是一个Vue实例从创建 到 销毁 的整个过程 生命周期四个阶段&#xff1a;① 创建 ② 挂载 ③ 更新 ④ 销毁 1.创建阶段&#xff1a;创建响应式数据 2.挂载阶段&#xff1a;渲染模板 3.更新阶段&#xff1a;修改数据&#xff0c;更新视图 4…

安装SQL Server2019 Developer版本时出现“服务没有及时响应启动或控制请求”的问题

1. 异常描述 2. 异常分析 应该是数据库服务所属账户的权限不够&#xff0c;可以设置为Administrator&#xff1b; 3. 异常解决 参考资料&#xff1a;https://blog.csdn.net/zi_longh/article/details/130293081 注意&#xff1a;SQL Server代理和SQL Server数据库引擎的账户…

【系统移植】制作SD卡启动——将uboot烧写到SD卡

在开发板上启动Linux内核&#xff0c;一般有两种方法&#xff0c;一种是从EMMC启动&#xff0c;还有一种就是从SD卡启动&#xff0c;不断哪种启动方法&#xff0c;当开发板上电之后&#xff0c;首先运行的是uboot。 制作SD卡启动&#xff0c;首先要将uboot烧写到SD卡&#xff…

2. FPGA基础了解--全局网络

前言 引入扇出的概念介绍FPGA中的全局网络为后续时序优化埋下伏笔 扇出 在FPGA设计中扇出是一个重要的概念&#xff0c;所谓的扇出就是一个控制信号所能控制的数据信号的总个数&#xff0c;比如ctrl信号的扇出就是16 reg ctrl 0; reg [15:0] out 0; always (posedge c…

RAGFlow(3):VScode端口转发在在本机浏览(比内网穿透好用)

docker会在内网服务器上的80端口部署&#xff0c;然而内网Ip是无法访问到的&#xff0c;所以无法看到页面。所以之前想到的解决方法是利用zerotier工具做内网穿透&#xff0c;将内网服务器的公网ip和本机ip组成一个局域网&#xff0c;把内网Ip变成了192.168xxx&#xff0c;这样…