2025-03-16    2025-03-16    3876 字  8 分钟

Linux小技巧汇总

1.超时不操作自动退出登录TMOUT

1
2
3
4
5
6
vi /etc/profile 
最后一行加上
TMOUT=90
退出当前用户使配置生效
exit
重新登录

查看是否生效

1
2
set | grep -i tmout
TMOUT=90

生效了!!!不操作等待90s会自动退出当前用户!!

如何取消呢?

只要将/etc/profile文件中TMOUT=90删除,然后退出使之生效。再次测试即可。

2.MNAP端口扫描

扫描系统版本:

nmap -O 目标主机

nmap -sV –script=banner 目标主机

快速扫描端口是否开放

nmap -p 端口号 -T4 目标主机

扫描默认1000个常见端口

nmap 目标主机

3.网络瓶颈测试工具

客户端

1
2

iperf -c ip地址 -p 服务端端口 -u(udp协议) 

服务端

1
iperf -s -p 监听端口

电子书集合:

1
https://github.com/Kensuke-Hinata/statistic/tree/master

4.Linux下不能连接ppa.launchpad.net的问题(中科大软件源)

每个ppa都会在/etc/apt/sources.list.d/目录下创建一个list文件,修改:

1
vi /etc/apt/sources.list.d/ubuntu-toolchain-r-ubuntu-test-xenial.list

将文件中http://ppa.launchpad.net替换为https://launchpad.proxy.ustclug.org,如下所示:

1
deb https://launchpad.proxy.ustclug.org/ubuntu-toolchain-r/test/ubuntu xenial main

更新源

1
sudo apt-get update

5.查找指定文件中指定内容

1
find /etc/ -exec grep -Hr 内容 {} \;

使用这条命令查询,结果返回时间很短。

6.避免执行类似于 curl | sh 的命令

1
$ curl -fsSL https://101.lug.ustc.edu.cn/Ch02/wordpress.sh | sudo bash

它的功能是从对应的 URL 获取脚本内容后,直接用 sudo bash 去执行。但是从安全性的角度这是不恰当的,因为网络上的脚本有可能包含恶意内容,直接执行可能会对系统带来安全风险。因此相关命令修改为了首先下载脚本到文件中(wordpress.sh 文件),然后再执行。如果对脚本内容有疑虑,则可以阅读脚本内容,检查其是否和你的预期相一致。

所以可以将以下命令更改为:

1
$ curl -fsSL https://101.lug.ustc.edu.cn/Ch02/wordpress.sh > wordpress.sh

然后执行

1
bash  wordpress.sh

7.流行的 Linux 发行版包管理器命令以及命令操作内容的对应关系

1
https://wiki.archlinuxcn.org/wiki/Pacman/Rosetta

8.tldr 软件

通常,软件手册中的内容十分繁多,如果只是希望能够快速了解软件的常用用法,可以使用 tldr 软件。

tldr 软件中包含有一个由社区维护的精简版文档,通过几个简单的例子让用户可以快速地一窥软件的使用方法。

安装

1
2
3
$ sudo apt install tldr
$ # 更新 tldr pages
$ tldr --update

使用

输入 tldr tar 的样例:

root@peng-VirtualBox:~# tldr tar 
tar

归档实用程序。
通常与压缩方法结合使用,例如 gzip 或 bzip2.
更多信息:https://www.gnu.org/software/tar.

 - 创建存档并将其写入文件:
   tar cf 目标文件.tar 路径/到/文件1 路径/到/文件2 ...

 - 创建一个 gzip 压缩文件并将其写入文件:
   tar czf 目标文件.tar.gz 路径/到/文件1 路径/到/文件2 ...

 - 使用相对路径从目录创建一个 gzip 压缩文件:
   tar czf 目标文件.tar.gz --directory=路径/到/目录 .

 - 详细地将(压缩的)存档文件提取到当前目录中:
   tar xvf 源文件.tar[.gz|.bz2|.xz]

 - 将(压缩的)存档文件解压缩到目标目录中:
   tar xf 源文件.tar[.gz|.bz2|.xz] --directory=目标目录

 - 创建压缩存档并将其写入文件,使用文件扩展名自动确定压缩程序:
   tar caf 目标文件.tar.xz 路径/到/文件1 路径/到/文件2 ...

 - 详细列出 tar 文件的内容:
   tar tvf 源文件.tar

 - 从存档文件中提取与模式匹配的文件:
   tar xf 源文件.tar --wildcards "*.html"

9.非对称加密

GPG 签名是非对称密码体系的一个例子。这里,软件包发布者有两把密钥:公钥(供用户公开下载)和私钥(必须妥善保存,不能让别人知道)。发布者使用私钥对软件包签名后,用户可以用公钥验证软件包确实为该发布者发布,且未被篡改。

10.进程

优先级:

nice(NI)

范围:[-20,19]

默认值:0

数值越大,优先级越低。

priority(PRI)

计算公式:PRI = NI + 20

nice值调整:

1
2
$ nice -n 10 vim # 以 10 为 nice 值运行 vim
$ renice -n 10 -p 12345 # 设置 PID 为 12345 的进程的 nice 值为 10

在正常运行的 Linux 系统中,我们可能会发现有些进程的 PRI 值是 RT,或者是负数。这表明对应的进程有更高的实时性要求(例如内核进程、音频相关进程等),采用了与普通进程不同的调度策略,优先级也相应更高。

1
     11 root      rt   0       0      0      0 S   0.0   0.0   2:07.06 migration/0                                                           

进程状态表:

状态

缩写表示

说明

Running

R

正在运行/可以立刻运行

Sleeping

S

可以被中断的睡眠

Disk Sleep

D

不可被中断的睡眠

Traced / Stopped

T

被跟踪/被挂起的进程

Zombie

Z

僵尸进程

后台运行进程不受signup影响

nohup

1
2
3
$ nohup ping 101.lug.ustc.edu.cn &
[1] 19258
nohup: ignoring input and appending output to '/home/ustc/nohup.out'

在需要屏蔽 SIGHUP 的程序前添加 nohup,则运行时的输出将被重定向到 nohup.out,也可以通过重定向手段自定义输出的文件。

孤儿进程:父进程先于子进程退出,此时子进程为孤儿进程(orphan)。

僵尸进程:子进程先退出,父进程未作出回应(wait),此时子进程为僵尸进程(zombie)。

孤儿进程(即留下的子进程)由操作系统回收,交给 init「领养」。

僵尸进程的进程资源大部分已释放,但占用一个 PID,并保存返回值。系统中大量僵尸进程的存在将导致无法创建进程。

11.定时任务

crontab配置教程:

1
https://crontab.guru/

12.日志

使用 journalctl 查看日志。

  1. 某个服务的日志

    journalctl-u 参数可以指定 unit,例子如下:

    $ sudo journalctl -u ssh  # 查看 ssh 服务的日志
    
  2. 某个正在运行的服务正在输出的日志

    在第一条的基础上,可以指定 -f 参数,以获取正在输出的日志:

    $ sudo journalctl -u ssh -f
    

    按下 Ctrl + C 退出输出即可。

  3. 系统正在输出的日志

    $ sudo journalctl -f
    

    系统日志对于调试系统状态来说是非常有用的信息。

  4. 上一次启动到关机的所有日志

    $ sudo journalctl -b -1
    

    -b 参数表示 boot(启动),-1 表示上一次启动。如果不添加 -1 参数,则默认为当前启动的日志。

13.下载工具

wget

批量下载 filelist.txt 中给出的链接:

$ wget -i filelist.txt

安装 oh-my-zsh:

1
$ sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"

curl

输出必应主页的代码:

$ curl "http://cn.bing.com"

使用重定向把必应页面保存至 bing.html 本地:

$ curl "http://cn.bing.com" > bing.html

也可以使用 -o 选项指定输出文件:

$ curl -o bing.html "http://cn.bing.com"

下载 USTCLUG 的 logo:

$ curl -O "https://ftp.lug.ustc.edu.cn/misc/logo-whiteback-circle.png"

只展示 HTTP 响应头内容:

$ curl -I "http://cn.bing.com"

14.文本处理

sed

对于大多数用户来说,最常用 sed 的场合是替换软件源的时候。在阅读了上面的示例之后,以下例子就很简单了。

1
2
3
$ sudo sed -i 's/cn.archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
$ sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
$ sudo sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

15.在linux下编译windows程序

hello.c

1
2
3
4
5
6
#include <stdio.h>

int main() {
    puts("Hello, world!");
    return 0;
}

这里使用 mingw 来进行交叉编译。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ sudo apt install gcc-mingw-w64  # 安装 mingw 交叉编译器
$ sudo apt install wine  # 安装 wine Windows 兼容层(默认仅安装 64 位架构支持)
$ x86_64-w64-mingw32-gcc -o hello.exe hello.c  # 编译为 64 位的 Windows 程序
$ file hello.exe  # 确认为 Windows 程序
hello.exe: PE32+ executable (console) x86-64, for MS Windows
$ wine hello.exe  # 使用 wine 运行
it looks like wine32 is missing, you should install it.
as root, please execute "apt-get install wine32"
wine: created the configuration directory '/home/ubuntu/.wine'
(忽略首次配置的输出)
wine: configuration in L"/home/ubuntu/.wine" has been updated.
Hello, world!

16.history中不记录用户操作

需求:

使用下面命令更改test用户密码时,history中默认会存储明文密码,这样不安全。

1
echo "qwepoi.." | sudo passwd test --stdin

解决方式:

在修改密码时,先设置:

1
set +o history

然后再修改密码,这样就不会再看到密码了。

修改密码后想恢复记录操作输入以下命令就可以了。

1
set -o history 

注意:set 设置的效果只对当前窗口有效,对于别人打开的窗口是无效的。

完整操作如下:

1
2
3
4
5
6
7
peng@peng-VirtualBox:~$ echo "qpwoasd.." | sudo passwd --stdin test 
peng@peng-VirtualBox:~$ history | grep test 
   66  echo "qpwoasd.." | sudo passwd --stdin test 
   67  history | grep test 
peng@peng-VirtualBox:~$ set +o history 
peng@peng-VirtualBox:~$ echo "qpwoasd.." | sudo passwd --stdin test 
peng@peng-VirtualBox:~$ history | grep echo 

17.vim下快速删除列

删除特定列的快捷方法(逐行删除)

如果你知道你需要删除哪一列的内容,并且该列的内容每行都是相同长度的,可以通过以下方法快速删除:

  • 移动到第一行,按 Ctrl + v 进入可视块模式。

  • 使用方向键选中你想删除的列。

  • d 删除。

vim模式下快速选中数据,替换文字。

ctrl + v 进入VISUAL 模式,方向键选中文字。按英文冒号“:” s/原文字/替换后的文字。然后按enter。替换完成。

vim 显示下一个搜索结果

1
2
3
4
5
在 Vim 中,使用 /80 进行搜索后,想要跳转到下一个匹配的结果,可以使用以下快捷键:

按 n:跳转到下一个匹配项。
按 N:跳转到上一个匹配项(与 n 相反)。
所以,在搜索 /80 后,按 n 就可以找到下一个 80 的匹配结果。

18.ssh免密登录(交换密钥方式)

服务端:

私钥 id_rsa

公钥: id_rsa.pub

生成公私钥

ssh-keygen

将公钥拷贝给客户端。

ssh-copy-id [email protected]

客户端:

公钥: id_rsa.pub

客户端收到公钥默认在用户目录的.ssh中

19.iptables保存规则并导入定义好的规则

使用如下命令保存当前规则:

1
iptables-save > /etc/iptables/rule.v4

下次开机可以导入规则:

1
iptables-restore < /etc/iptables/rule.v4

20.递归当前文件夹内文件从大到小排序

1
2
3
4
5
[root@jx-gateway-254 opt]# du -h --max-depth=1 | sort -hr
236M	.
14M	./kylin-sm-package
80K	./scirpt
0	./kyanos

21.yum安装软件包时,保存rpm包到本地。

我们使用yum install 命令安装软件包后,默认不会保留安装的rpm包。如果需要保留我们需要开启`keepcache=1`参数

1
2
vim /etc/yum.conf
keepcache=1

然后保存的rpm文件路径

1
2
cd /var/cache/yum/x86_64/7
find . -name *.rpm 

将找到的rpm包拷贝到/tmp目录下

1
f

22.同一台机器启动多个tomcat

tomcat启动后会监听5个端口,分别是8000、80、8005、8999、8009。

端口分析过程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[root@jx-ops-81 bin]# netstat -anop | grep java 
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      5303/java            off (0.00/0/0)
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      5303/java            off (0.00/0/0)
tcp6       0      0 :::41253                :::*                    LISTEN      5303/java            off (0.00/0/0)
tcp6       0      0 :::8999                 :::*                    LISTEN      5303/java            off (0.00/0/0)
tcp6       0      0 :::8009                 :::*                    LISTEN      5303/java            off (0.00/0/0)
tcp6       0      0 :::80                   :::*                    LISTEN      5303/java            off (0.00/0/0)
tcp6       0      0 :::39635                :::*                    LISTEN      5303/java            off (0.00/0/0)
unix  2      [ ]         STREAM     CONNECTED     74179    5303/java            
unix  2      [ ]         STREAM     CONNECTED     74182    5303/java            

使用命令筛选端口分别在哪个配置文件中,改掉就可以启动了。如果有端口冲突会抱以下错误:

1
2
3
4
[root@jx-ops-81 tomcat8]# cd /mnt/tomcat8
[root@jx-ops-81 tomcat8]# grep 8999  -rwn

ERROR: transport error 202: bind failed: Address already in use

可以发现80、8005、8009在同一个文件。在conf/server.xml内。

8000和8999在bin/catalina.sh。都改成和上一个tomcat不同端口后就可以启动成功了。

23.mongodb启动报错

mongo5.0以上需要cpu支持avx、avx2指令集。 使用cat /proc/cpuinfo| grep avx2 查看有没有,如果没有则会启动失败。 我使用virtualbox安装的rocky9.5系统的cpu不支持avx指令集,物理机是支持的。 参考:https://blog.csdn.net/NuOne_plus/article/details/120330419 暂时没找到原因。