一、避免执行类似于 curl | sh 的命令
$ curl -fsSL https://101.lug.ustc.edu.cn/Ch02/wordpress.sh | sudo bash
它的功能是从对应的 URL 获取脚本内容后,直接用 sudo bash
去执行。但是从安全性的角度这是不恰当的,因为网络上的脚本有可能包含恶意内容,直接执行可能会对系统带来安全风险。因此相关命令修改为了首先下载脚本到文件中(wordpress.sh
文件),然后再执行。如果对脚本内容有疑虑,则可以阅读脚本内容,检查其是否和你的预期相一致。
所以可以将以下命令更改为:
$ curl -fsSL https://101.lug.ustc.edu.cn/Ch02/wordpress.sh > wordpress.sh
然后执行
bash wordpress.sh
二、流行的 Linux 发行版包管理器命令以及命令操作内容的对应关系
https://wiki.archlinuxcn.org/wiki/Pacman/Rosetta
三、tldr 软件
通常,软件手册中的内容十分繁多,如果只是希望能够快速了解软件的常用用法,可以使用 tldr
软件。
tldr
软件中包含有一个由社区维护的精简版文档,通过几个简单的例子让用户可以快速地一窥软件的使用方法。
安装
$ 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"
四、非对称加密
GPG 签名是非对称密码体系的一个例子。这里,软件包发布者有两把密钥:公钥(供用户公开下载)和私钥(必须妥善保存,不能让别人知道)。发布者使用私钥对软件包签名后,用户可以用公钥验证软件包确实为该发布者发布,且未被篡改。
五、进程
优先级:
nice(NI)
范围:[-20,19]
默认值:0
数值越大,优先级越低。
priority(PRI)
计算公式:PRI = NI + 20
nice值调整:
$ nice -n 10 vim # 以 10 为 nice 值运行 vim
$ renice -n 10 -p 12345 # 设置 PID 为 12345 的进程的 nice 值为 10
在正常运行的 Linux 系统中,我们可能会发现有些进程的 PRI 值是 RT,或者是负数。这表明对应的进程有更高的实时性要求(例如内核进程、音频相关进程等),采用了与普通进程不同的调度策略,优先级也相应更高。
11 root rt 0 0 0 0 S 0.0 0.0 2:07.06 migration/0
进程状态表:
后台运行进程不受signup影响
nohup
$ 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,并保存返回值。系统中大量僵尸进程的存在将导致无法创建进程。
六、定时任务
crontab配置教程:
https://crontab.guru/
七、日志
使用 journalctl
查看日志。
某个服务的日志
journalctl
的-u
参数可以指定 unit,例子如下:$ sudo journalctl -u ssh # 查看 ssh 服务的日志
某个正在运行的服务正在输出的日志
在第一条的基础上,可以指定
-f
参数,以获取正在输出的日志:$ sudo journalctl -u ssh -f
按下 Ctrl + C 退出输出即可。
系统正在输出的日志
$ sudo journalctl -f
系统日志对于调试系统状态来说是非常有用的信息。
上一次启动到关机的所有日志
$ sudo journalctl -b -1
-b
参数表示 boot(启动),-1
表示上一次启动。如果不添加-1
参数,则默认为当前启动的日志。
八、下载工具
wget
批量下载 filelist.txt 中给出的链接:
$ wget -i filelist.txt
安装 oh-my-zsh:
$ 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"
九、文本处理
sed
对于大多数用户来说,最常用 sed
的场合是替换软件源的时候。在阅读了上面的示例之后,以下例子就很简单了。
$ 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
十、在linux下编译windows程序
hello.c
#include <stdio.h>
int main() {
puts("Hello, world!");
return 0;
}
这里使用 mingw 来进行交叉编译。
$ 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!
十一、history中不记录用户操作
需求:
使用下面命令更改test用户密码时,history中默认会存储明文密码,这样不安全。
echo "qwepoi.." | sudo passwd test --stdin
解决方式:
在修改密码时,先设置:
set +o history
然后再修改密码,这样就不会再看到密码了。
修改密码后想恢复记录操作输入以下命令就可以了。
set -o history
注意:set 设置的效果只对当前窗口有效,对于别人打开的窗口是无效的。
完整操作如下:
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
十一、vim下快速删除列
删除特定列的快捷方法(逐行删除)
如果你知道你需要删除哪一列的内容,并且该列的内容每行都是相同长度的,可以通过以下方法快速删除:
移动到第一行,按
Ctrl + v
进入可视块模式。使用方向键选中你想删除的列。
按
d
删除。
vim模式下快速选中数据,替换文字。
ctrl + v 进入VISUAL 模式,方向键选中文字。按英文冒号“:” s/原文字/替换后的文字。然后按enter。替换完成。
vim 显示下一个搜索结果
在 Vim 中,使用 /80 进行搜索后,想要跳转到下一个匹配的结果,可以使用以下快捷键:
按 n:跳转到下一个匹配项。
按 N:跳转到上一个匹配项(与 n 相反)。
所以,在搜索 /80 后,按 n 就可以找到下一个 80 的匹配结果。
十二、ssh免密登录(交换密钥方式)
服务端:
私钥 id_rsa
公钥: id_rsa.pub
生成公私钥
ssh-keygen
将公钥拷贝给客户端。
ssh-copy-id root@10.10.10.36
客户端:
公钥: id_rsa.pub
客户端收到公钥默认在用户目录的.ssh中
十三、iptables保存规则并导入定义好的规则
使用如下命令保存当前规则:
iptables-save > /etc/iptables/rule.v4
下次开机可以导入规则:
iptables-restore < /etc/iptables/rule.v4
十四、递归当前文件夹内文件从大到小排序
[root@jx-gateway-254 opt]# du -h --max-depth=1 | sort -hr
236M .
14M ./kylin-sm-package
80K ./scirpt
0 ./kyanos
十五、yum安装软件包时,保存rpm包到本地。
我们使用yum install 命令安装软件包后,默认不会保留安装的rpm包。如果需要保留我们需要开启`keepcache=1`参数
vim /etc/yum.conf
keepcache=1
然后保存的rpm文件路径
cd /var/cache/yum/x86_64/7
find . -name *.rpm
将找到的rpm包拷贝到/tmp目录下
f
十六、同一台机器启动多个tomcat
tomcat启动后会监听5个端口,分别是8000、80、8005、8999、8009。
端口分析过程
[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
使用命令筛选端口分别在哪个配置文件中,改掉就可以启动了。如果有端口冲突会抱以下错误:
[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不同端口后就可以启动成功了。
评论区