记录使用debian过程中收获的一些linux知识点
#!
符号在脚本的第一行用于指定解释器运行环境
比如,lua脚本的第一行
#! /usr/local/bin/lua
print("hello world!");
此时我们就可以直接运行该文件,而不需要加lua
指令前缀来运行。因为she-bang已经指定了脚本的运行环境。
ctl+L
清屏但不删除命令。内容向上滚动 ( 比clear要好得多 )
ctl+U
清空当前命令(太有用了!)
shift+pageDown/up
翻页
shift+home/end
光标移至头/尾
kill <-信号> <pid>
-
TERM
正常退出程序 -
INT
相当于ctrl+c 来中断一个程序 -
KILL
杀死进程,强制剥离cpu释放资源 -
STOP
暂停进程 -
CONT
恢复进程 -
HUP
重载,更新进程配置 -
USER1
,USER2
用户自定义信号
- TERM (15 - SIGTERM): 发送TERM信号通知进程正常退出。这是一种优雅的终止方式,允许进程完成正在进行的任务并清理资源。大多数进程在接收到TERM信号时会尽力进行清理操作,然后自行退出。
- INT (2 - SIGINT): 发送INT信号通常是通过按下键盘上的Ctrl+C组合键来触发。这是一种中断信号,通常用于终止正在终端中运行的前台进程。类似于TERM,它也允许进程进行清理工作,但有时候它可能会被忽略。
- QUIT (3 - SIGQUIT): 发送QUIT信号会引起进程的核心转储(core dump)。与TERM相似,QUIT也是一种终止信号,但它会导致进程在退出时生成核心转储文件,用于调试。
- KILL (9 - SIGKILL): 发送KILL信号是强制终止进程的一种方式,进程无法捕获或阻止该信号。它会立即终止进程,不给进程任何清理或关闭的机会。KILL信号是一种"最后手段",因为它不允许进程完成清理工作。
-
rm -rf /
删库跑路 -
dd if=/dev/zero of=/dev/sda
擦除系统盘数据- 从
/dev/zero
读取数据,然后写入到/dev/sda
,相当于清空系统盘数据。/dev/zero
提供了一个无限连续的零字节流。当你从/dev/zero
读取数据时,你会得到一个无限的流,所有的数据都是零字节。
- 从
-
df [-T] [-h]
查看系统磁盘空间 -
du <目录>
查看指定目录磁盘大小 -
free
显示内存资源情况 -
top
显示系统资源占用排行榜shift + e
切换数据显示单位 ( KB,MB,GB )
-
last
查看服务器登陆情况(显示ip和登录时间) -
man
查看命令的帮助文档 -
uname
输出特定的系统信息,可以查看系统内核,系统版本等内容 -
tail
将文件内容写到标准输出(shell) 可以持续用来打印日志文件内容tail -f <目录>
-
more
分页查看指定目录的完全内容 -
scp
用于linux之间复制文件和目录scp abc.txt root@ipaddress:/home
将abc.txt上传到指定ip地址的home目录下scp root@ipaddress:/home/abc.txt ./
将指定ip地址的home目录下的abc.txt下载到当前shell目录下
-
chsh
更改使用者shell设定(切换shell类型:bash, zsh等) -
tree <目录>
显示指定目录的树形结构 -
whereis
定位一个“命令”的二进制文件、源文件、手册文件 -
pwd
显示当前所在完整路径 -
source
刷新当前shell环境 -
clear
清除控制台 ( 这个应该刻进基因里了吧... ) -
ssh
ssh协议相关ssh root@ipaddress
连接指定ip地址的主机ssh-keygen -t rsa -C "email@email.com"
生成包含邮箱签名的rsa密钥对
-
wget [url]
下载url内容 -
curl -i [url]
向指定url发送http请求并显示response头 -
lsof -i:80
查看占用80端口的进程 -
ps [-ef] [-aux]
-
grep
正则匹配
/etc/hosts
sudo code --no-sandbox --disable-gpu-sandbox --user-data-dir=/root/.vscode/
为了方便可以给code再配个别名,加上这些参数就好了。我使用的debian12系统在root模式下使用vscode不能输入中文,不知道什么原因...🫠
debian系统服务目录:
/lib/systemd/system/xxx.service
centos系统服务目录:
/usr/lib/systemd/system/xxx.service
以nginx.service内容为例:
[Unit]
Description=nginx web service
Documentation=http://nginx.org/en/docs/
After=network.target #服务在network.target启动之后启动
[Service]
Type=forking #服务类型 在启动时会创建子进程
PIDFile=/usr/local/nginx/logs/nginx.pid #pid文件位置
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf #执行前预处理指令(nginx -t测试)
ExecStart=/usr/local/nginx/sbin/nginx #执行指令
ExecReload=/usr/local/nginx/sbin/nginx -s reload #重载指令
ExecStop=/usr/local/nginx/sbin/nginx -s stop #停止指令
PrivateTmp=true #启用一个私有的临时文件系统,服务将在其中操作,这有助于增加服务的安全性
[Install]
WantedBy=default.target #服务应该被添加到 default.target,即系统的默认目标,以确定服务在系统启动时是否启用。
全局配置是/etc/profile
同样是在~/.bashrc文件下(或者~/.zshrc 取决于你的shell) 添加:
export PATH=$PATH:/usr/local/nginx/sbin
将指定目录添加到环境变量中
在 ~/.bashrc 下
注意:root用户和普通用户的 .bashrc 是隔离的
alias ll='ls $LS_OPTIONS -l'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}\t"'
alias dis='docker images'
-
apt源位置:
/etc/apt/sources.list
参考: url
-
yum源位置:
/etc/yum.repos.d/ #这里的.d 是一种命名风格,表示directory 目录的意思
我的终端一直显示的完整的路径前缀,这样如果我操作的文件非常深入,那么就很难受。因此我就把他改成了只显示最后一级目录,这样清爽一些
配置方式:在/etc/profile
中配置就可以应用到全局。当然也可在普通用户或者root用户的.bashrc中配置
# 完全显示完整的工作目录名称
export PS1='[\u@\h $PWD]\$ '
# 只列出最后一个目录
export PS1='[\u@\h \W]\$' # 我用的就是这个
# 显示完整工作目录,当前用户目录会以 ~代替
export PS1='[\u@\h \w]\$'
修改完成后重新加载该配置文件即可 source /etc/profile
这里我记录一个我自己稍微改装了一下的比较满意的配置:
export PS1='[\[\e[1;35m\]\u@\h:\[\e[0m\]\[\e[1;33m\]\W\[\e[1;35m\]\[\e[0m\]]\[\e[1;34m\]\$ \[\e[0m\]'
zsh支持插件扩展和主题功能。
oh-my-zsh是zsh的一个实现。是管理zsh配置的框架。
在oh-my-zsh官方的github wiki中列出了很多内置的主题。我们不仅可以应用这些内置主题,还可以在这些内置主题上进行二次定制,非常银杏化!
-
插件位于:
~/.oh-my-zsh/pulgins/
-
主题位于:
~/.oh-my-zsh/themes/
-
修改插件/主题: 在
~/.zshrc
中配置。
-
检查当前可用shell
cat /etc/shells
-
查看当前使用的shell
echo $SHELL
-
安装zsh shell
apt install zsh
-
切换shell
chsh -s /bin/zsh
-
安装oh my zsh
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
-
下载语法高亮插件
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh}/plugins/zsh-syntax-highlighting
-
下载自动提示插件
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh}/plugins/zsh-autosuggestions
-
安装插件
nano ~/.zshrc
plugins=(git zsh-syntax-highlighting zsh-autosuggestions)
-
更新
.zshrc
source ~/.zshrc
/etc/passwd
文件中保存了机器上所有的用户信息
添加用户
adduser www
更改密码
passwd www
删除用户
userdel -r www
修改所属用户以及用户组
chown [-R] ownname:groupname filename
修改所属用户组
chgrp [-R] groupname filename
我使用的是debian gnome桌面
记录一些提升体验的扩展程序:
-
Plank
桌面底部dock栏
sudo apt update && sudo apt install plank
-
系统默认输入法Fcitx5
我喜欢极简风格,摒弃那些花里胡哨还占用资源的第三方输入法程序
-
gnome-shell-extension-appindicator
因为gnome桌面无法显示后台运行的程序,有的应用程序已关闭就进入后台运行,无法再次唤起。这种情况太让人头疼。这个扩展程序可以让桌面系统显示托盘程序。实现类似win的右下角托盘效果。
有时候在 /etc/profile
中配置了别名或者环境变量,但是每次重启shell或者重启系统,这些配置都会失效,都必须再执行一遍source /etc/profile
才行。
解决: 在~/.bashrc
中添加 source /etc/profile
netstat
显示系统网络信息 常用参数:
-tunlp
显示使用tcp协议的进程名,端口,ip等信息
netstat -tunlp | grep 781
查看781进程监听的端口号.
ifconfig
用于配置网络接口
iwconfig
用于配置无线网络接口
使用ifconfig
查看网络配置,关注一下几个项:
lo
: 表示本地 local
wlp3s0
: 表示WLAN PCI接口位置:bus=3(总线), slot=0(插槽)
enp2s0
: 表示Etnernet PCI接口位置:bus=2(总线), slot=0(插槽)
debian使用ufw防火墙:
apt install ufw
ufw status
centos直接使用systemctl :
systemctl status firewalld
执行命令后面加个 &
就好了
sh jmeter.sh &
${}, [], $ (), $(()), [[]], (())的作用
-
${}
与$
都是用来引用变量的。${}可以指定引用的边界,也可以对字符串变量进行截取等
-
[]
与test
[ ]是test命令的另一种形式,用于判断某个表达式的返回值是0或者非0,常用于if命令的判断条件
test $a == "linux"
等于[ $a == "linux" ]
if test $a == "linux" then echo "i am linux" elif [ $a == "java" ] then echo "i am java" fi
注意"[“后和”]“前都需要有空格,并且”=="两边也都要有空格
-
$()
和 ``$()和``的作用一致,都是用来做命令替换用,一般用于将命令返回的结果传递给变量
a=$(ls /home/hadoop101/) a=`ls /home/hadoop101/\` # a保存的是上述命令的返回值,即一个目录列表
-
$[ ]
和$(( ))
$[]和$ (())的作用一样,都是进行数学运算的,支持±*/%,并且在$[ ]和$(( ))中使用变量不需要$引用,可以直接使用变量名echo $[2+7] # 9 a=3;b=4;echo $[$a+$b] # 7 echo $((2+7)) # 9 a=3;b=4;echo $(($a+$b)) # 7 a=3;b=4;echo $((a+b)) # 7
-
[[]]
[[ ]]是[ ]的增强版,其返回值也是0或者非0
-
在
[[]]
中使用> < 不需要转义字符if [[ $1 > 5 ]] then echo "$1的值大于5" else echo "$1的值小于5" fi
-
支持&&和||,但是仅支持==和!=的连接
# 正确示例 if [[ $a != 3 && $a != 10 ]] then echo "hello i am linux" fi # 错误示例: if [[ $a > 3 && $a != 10 ]] then echo "hello i am linux" fi
-
[[]]
比较字符串支持正则匹配和通配符匹配# 通配符匹配 if [[ linux == l?nu? ]] then echo "i am linux" else echo "i am not linux" fi
# 正则匹配 if [[ linux =~ ^li[abn]ux ]] then echo "i am linux" else echo "i am not linux" fi
-
-
(())
- 与$结合使用进行数学运算$(( ))
- 在for循环命令中控制循环,类似于c语言
- 改变变量的值,且不需要$引用
for((i=1;i<10;i++)) do echo "this is $i" done
i=0 while [ $i -le 10 ] do echo "this is $i" ((i++)) done # 或者 i=0 while [ $i -le 10 ] do echo "this is $i" ((i=i+1)) done
windows subsystem of linux ( windows下的linux子系统 )
WSL允许你在windows操作系统上运行linux子系统. 比虚拟机方便很多.
WSL安装: 参考MS官方文档
如何安装, 官方给文档很详细了. 我这里主要记录一些wsl的常见操作
-
wsl --help
- 帮助文档 -
wsl
- 启动子系统 -
wsl --shutdown
- 关闭子系统 -
wsl --list -v
- 列出所有的子系统及其对应的wsl版本号 -
wsl --list --online
- 列出全部可用的子系统 -
wsl -s <子系统>
- 设置默认的子系统
这个有点类似于挂载和卸载. 使用wsl安装的子系统在win上都会有一个磁盘映像来存储数据, 这个磁盘默认是装在C盘的, 但是我们可以手动更改他的位置.
对于linux系统来说, 在安装的时候不要让他自动安装. 选择手动安装. 自己去官网下载发行版的安装包. 然后将下载下来的.AppBundle后缀的文件改为.zip进行解压. 会得到系统映像文件 .appx后缀的文件, 再次将其后缀改为.zip进行解压, 最后会得到 .exe的可执行文件. 在想要安装的位置运行该exe可执行文件即可安装linux子系统. 然后会发现 有一个ext4.vhdx的磁盘映像文件, 这个就是子系统的数据盘.
重点是在win上安装docker desktop. docker desktop的使用需要基于wsl . 如果默认安装的话, 他会生成两个磁盘映像文件, 一个是docker-desktop, 一个是docker-desktop-data. 他们都默认在 C:\\user\\xx\\AppData\\Local\\Docker\\wsl
位置下, 这样一旦docker镜像多了后, 非常占用c盘空间. 我们需要将这两个盘挂载到D盘下以节省C盘空间
这就会用到wsl的导入和导出命令
-
退出docker desktop , 关闭wsl
wsl --shutdown
-
查看wsl的状态, 确认关闭
wsl --list -v
-
导出docker-desktop-data磁盘文件
wsl --export docker-desktop-data "D:\\docker-desktop-data.tar"
-
卸载docker-desktop-data磁盘文件 ( 此命令会删除 docker-desktop-data 的磁盘映像文件)
wsl --unregister docker-desktop-data
-
将导出的磁盘文件重新导入wsl, 并指定导入的位置
wsl --import docker-desktop-data "D:\\.WSL\\Docker\\wsl" "D:\\docker-desktop-data.tar" --version 2
完成!
但实际上, docker desktop设置中提供了更改disk image location功能, 可以让我们很方便的更改这两个磁盘映像文件的位置.
这里只是以docker desktop作为一个例子, 能学会举一反三, 应用到其他情况下. 同时也有助于我对wsl的理解.
有了wsl这么方便的东西, 还要什么虚拟机, 什么vmware, 什么virtualbox 都靠边站 ! 😝.
我当前的nginx服务部署在本机的wsl中。现在有一个需求是,局域网内的某台机器希望能够访问到我的nginx服务。直接访问我的ip地址是不行的。直接访问我wsl的ip地址也不行,这里必须要做端口转发,将访问我本机的请求转发到wsl中去. -- 来源:微软官方文档
以上问题出现在 当wsl的网络模式为默认模式:NAT模式 下。当wsl网络模式切换为镜像网络模式,以上问题便不存在(可以直接访问wsl中的服务)。
需要在windows上设置端口转发: 使用netsh命令
# 监听任何ip访问80端口的请求,并将其转发到wsl的80端口中
netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=172.18.132.125
listenport
监听的本机端口listenaddress
监听的ip地址 (不指定的话默认是0.0.0.0)connectport
希望wsl连接的端口connectaddress
通过wsl安装的linux发行版的ip地址
关于wsl的网络问题,参考 微软官方文档 。该文档介绍了如何镜像网络模式,DNS隧道, 自动代理,防火墙等知识。
-
powershell执行
wsl --update
-
编辑 /etc/wsl.conf
[boot]
systemd=true
- 重启wsl
通过一些第三方服务可以实现.
curl ip.sb
iftop
命令用于监控系统流量。
iftop -i eth0
进入交互界面后 按 h
显示帮助菜单。
修改注册表来实现程序右键在此打开的功能
-
对文件本身
HKEY_CLASSES_ROOT\*\shell
-
对文件夹
HKEY_CLASSES_ROOT\Directory\shell
-
对空白背景
HKEY_CLASSES_ROOT\Directory\Background\shell
在对应的shell目录下:
-
新建项,名称唯一即可。
-
配置默认值为 “用xxx打开” (即右键菜单显示的文字)
-
在该项下新建
Command
项 -
Command
项的默认值要是该程序的可执行文件的路径加上一些参数# 示例: idea打开当前目录 "D:\Program Files\JetBrains\IntelliJ IDEA 2024.1.1\bin\idea64.exe" "%V" # 示例: Terminal打开当前目录 "D:\Program Files\terminal-1.21.2701.0\WindowsTerminal.exe" -d "%V" # 示例:Code打开选定文件或文件夹 "D:\Program Files\Microsoft VS Code\Code.exe" "%1"
-
回到第一步的项目录,新建 “可扩充字符串值”,命名为Icon,指定数据为第四步的路径即可
注册表常用参数:
%V
:代表当前选定的路径。%1
:代表当前选定的项目的完整路径。