Linux Shell Commands 常用Linux命令行
用户和权限相关
增加用户, 修改密码, 增加sudo权限
useradd [username] passwd [username /usr/sbin/visudo -f /etc/sudoers #增加 yourusername ALL=(ALL) ALL
对于Ubuntu18.04及更高版本, 需要增加 -m
, -s
参数, 否则创建的用户没有home, 且没有shell环境
useradd -m -s /bin/bash someone
将某目录下的所有文件及目录修改为默认的权限
# 设置目录为755 sudo find . -type d -exec chmod 755 {} + # 设置文件为644 sudo find . -type f -exec chmod 644 {} +
命令删除当前目录下名称为dir1的所有目录
find ./ -name "dir1" -type d -print -exec rm -rf {} +
创建用户组, 将用户加入新用户组
# 新建用户组 groupadd [groupname] # 修改用户的主组 usermod -g [main-groupname] [username] # 修改用户的附加组 usermod -G [addon-groupname] [username]
删除用户
# 仅删除用户 sudo userdel someone # 同时删除其home目录 sudo userdel -r someone # 强制删除, 即使用户当前在登录状态 sudo userdel -f someone
文件, 查找相关
目录大小和排序
列出目录大小占用统计, 仅列出目录下的第一层.
- du 的 -s 参数会告诉 du 只打印summary(每个文件或目录的总大小), 而不要递归的把目录下所有文件的大小打印出来
- sort,-n 为按照数字排序,-r 为逆序显示
du -h --max-depth=1 [folder name] (打印出所有的使用量) # 或者 du -h ./ -d1 # 或者 du -hs *
列出并排序, 可以用sort -n
命令, -n
参数表示按数字而不是按字母
du ./ -d1|sort -n # 如果要倒序则加上 -r du ./ -d1|sort -nr # 如果前面带-h则sort也要带-h du -h ./ -d1 |sort -h # 倒序 du -h ./ -d1 |sort -hr
文件大小排序
# 将当前目录下的文件按照大小排序显示出来,最大的放在前面 ls -sSh
- S - 按照大小排序
- s - 为顺带打印出文件大小
- h - 把大小显示为 xx K xx M 这样的易读格式
如果只需要排序结果,那么 ls -S 就可以,仅适合文件夹下没有子文件夹的情况
find相关
查找包含字符串的文件
find .|xargs grep -ri "the string to find"
grep过滤空行,注释行
cat squid.conf | grep -v '^$'|grep -v '#'
在使用-exec参数时,必须以“;”结尾,否则命令将无法执行
#删除10天以前文件结尾为.log的文件 find /tmp/mydir -mtime +10 -name "*.log" -exec rm -rf {} \; #删除/tmp/目录下(含子目录)下所有扩展名为.svn的文件 find /tmp/ -name *.svn -exec rm -rvf {} \; #清除垃圾: find / -name core -print -exec rm -rf {} \;
打印出指定目录下的一级目录所有隐藏目录的大小并且按M进行排序
find /root -maxdepth 1 -name ".*" -type d -print | xargs du -sm | sort -n | awk '{print $1"M",$2}'
- 查找隐藏目录 使用find /path -name “.*” -type d -print
- 查找一级的隐藏目录添加上 -maxdepth 1
- 对目录进行以M兆的统计 du -sm
- 对大小进行排序 默认以第一列 sort -nr (r是反向排序)
- awk 在这里进行修饰了下因为du -sm 是没有显示单位的 用du -sh 有单位但增加了排序的麻烦
- 脚本和命令的书写区别 因为脚本用的for 语句是分条读入的所以如果把sort -n | awk ‘{print $1″M”,” “,$2}’ 放到 du -sm $i 之后不会对顺序产生变化
将目录下的文件批量转码, 从gbk到utf-8
find ./ -type f -exec iconv --verbose -f gbk -t utf-8 {} -o {}.txt \;
删除指定时间以前的旧文件, +n表示n天之前, n表示n天前那天, -n表示n天前到现在, 在使用 -exec 参数时,必须以“;”结尾, 否则命令不会执行
# 当前时间往前推10天(10*24*3600秒)之前的文件, 将其删除 find /appdata/dazhihui -mtime +10 -name "*.*" -exec rm -rf {} \; # 当前时间往前推10天开始, 至11天结束, 那24小时内的文件, 将其删除 find /appdata/tl_info -mtime 10 -name "*.*" -exec rm -rf {} \; # 当前时间往前推10天之前, 大于3000KB的文件(目录不算), 将其清空 find /appdata/cnlist -mtime +10 -type f -size +3000k -exec cp /dev/null {} \;
删除/tmp/目录下(含子目录)下所有扩展名为.svn的文件
find /tmp/ -name *.svn -exec rm -rvf {} \;
查看文件的安全信息:
ls -Z /opt/php/lib/php/extensions/no-debug-non-zts-20121212/ -rwxr-xr-x root root user_u:object_r:usr_t memcached.so # 重置 sudo /sbin/restorecon /opt/php/lib/php/extensions/no-debug-non-zts-20121212/memcached.so
tail
tail日志当日志生成速度太快时, 使用grep过滤, 需要加上 --line-buffered 选项开启grep的行缓冲
# 只显示带XXX的行, 但是滤掉带YYY的行 tail -f /path/to/log | grep --line-buffered 'XXX' | grep -v 'YYY'
如果grep不带 --line-buffered 选项, 可以用 stdbuf 代替
tail -f /path/to/log | stdbuf -oL grep 'XXX' | grep -v 'YYY'
写文件
使用 cat
cat >> workroot/etc/resolv.conf << EOF > nameserver 127.0.0.53 > EOF
使用 tee
A good solution in general is to use | sudo tee
instead of >
and | sudo tee -a
instead of >>
.
这种方式适用于需要sudo的场景
# 在 /etc/pacman.conf 后面添加内容 echo '[archlinuxfr]' | sudo tee -a /etc/pacman.conf >/dev/null echo 'Server = http://repo.archlinux.fr/$arch' | sudo tee -a /etc/pacman.conf >/dev/null echo ' ' | sudo tee -a /etc/pacman.conf >/dev/null
后面加上 > /dev/null
是因为 tee sends its output to both the named file and its own standard output, and I don't need to see it on my terminal
系统相关
查看最后登录
# 列出全部 last # 列出最近15个 last -15
另一个(内容差不多)
utmpdump /var/log/wtmp
不保留history
除了编辑 ~/.bash_history 外, 在编辑之前, 需要将HISTFILE变量赋值到/dev/null
export HISTFILE=/dev/null
这样再编辑.bash_history后就不会留下编辑的命令记录了.
查看系统信息
#查看产品信息: dmidecode | grep "Product" #查看内存槽位,已经安装的内存情况: dmidecode |grep -A16 "Memory Device$" #查看机器的序列号: dmidecode | grep "Serial Number" #查看网卡信息 dmesg | grep -i eth #显示CPU的详细信息: #注:-A42表示显示一下的行数,你可以根据自己的情况修改。 dmidecode |grep -A42 "Processor"|more #查看系统硬盘信息和使用情况 fdisk -l & df #查看主板信息等 lspci #查看发行版名称及版本号 cat /etc/issue 或 lsb_release -a #查看linux内核版本详细信息 cat /proc/version #CPU信息 cat /proc/cpuinfo #内存信息 cat /proc/meminfo
查看现有的 yum repositories, 命令:
yum repolist
yum update时出现这样的错误
pre-existing rpmdb problem(s), 'yum check' output follows: glibc-2.12-1.209.el6_9.2.x86_64 is a duplicate with glibc-
可以通过这两个命令解决
package-cleanup --dupes package-cleanup --cleandupes
格式化硬盘 mkfs.ext4
$ mkfs.ext4 --help mkfs.ext4: invalid option -- '-' Usage: mkfs.ext4 [-c|-l filename] [-b block-size] [-C cluster-size] [-i bytes-per-inode] [-I inode-size] [-J journal-options] [-G flex-group-size] [-N number-of-inodes] [-d root-directory] [-m reserved-blocks-percentage] [-o creator-os] [-g blocks-per-group] [-L volume-label] [-M last-mounted-directory] [-O feature[,...]] [-r fs-revision] [-E extended-option[,...]] [-t fs-type] [-T usage-type ] [-U UUID] [-e errors_behavior][-z undo_file] [-jnqvDFSV] device [blocks-count] # 预显示格式化信息, 但是不执行格式化 $ sudo mkfs.ext4 -n /dev/sdc1 mke2fs 1.44.1 (24-Mar-2018) Creating filesystem with 244190390 4k blocks and 61054976 inodes Filesystem UUID: 2870d84e-9428-4613-a278-9dcd87260676 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848 # 修改inode大小, 减小空间浪费 $ sudo mkfs.ext4 -i 1048576 -n /dev/sdc1 mke2fs 1.44.1 (24-Mar-2018) Creating filesystem with 244190390 4k blocks and 953984 inodes Filesystem UUID: a06135e9-a3ac-4ab4-bf30-02c3016b0e34 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848 # 执行格式化 $ sudo mkfs.ext4 -i 1048576 -L 2018A_1T /dev/sdc1 mke2fs 1.44.1 (24-Mar-2018) Creating filesystem with 244190390 4k blocks and 953984 inodes Filesystem UUID: b04b21c4-9a00-4279-acef-53a47ae6e9b4 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848 Allocating group tables: done Writing inode tables: done Creating journal (262144 blocks): done Writing superblocks and filesystem accounting information: done
查看日期和时间戳
$ date --date='@1567356026' Mon Sep 2 00:40:26 CST 2019 $ date -d @1567356026 Mon Sep 2 00:40:26 CST 2019 $ date +%s 1567357854 $ date +%Y:%m:%d 2019:09:02
网络相关
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
会得到类似下面的结果,具体数字会有所不同:
LAST_ACK 1
SYN_RECV 14
ESTABLISHED 79
FIN_WAIT1 28
FIN_WAIT2 3
CLOSING 5
TIME_WAIT 1669
也就是说,这条命令可以把当前系统的网络连接状态分类汇总。
下面解释一下为啥要这样写:
一个简单的管道符连接了netstat和awk命令。
先来看看netstat:
netstat -n
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 123.123.123.123:80 234.234.234.234:12345 TIME_WAIT
你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。
再来看看awk:
/^tcp/
滤出tcp开头的记录,屏蔽udp, socket等无关记录。
state[]
相当于定义了一个名叫state的数组
NF
表示记录的字段数,如上所示的记录,NF等于6
\(NF
表示某个字段的值,如上所示的记录,\)NF也就是\(6,表示第6个字段的值,也就是TIME_WAIT
state[\)NF]
表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数
++state[$NF]
表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一
END
表示在最后阶段要执行的命令
for(key in state)
遍历数组
print key,"\t",state[key]
打印数组的键和值,中间用\t制表符分割,美化一下
统计进程数
netstat -nat|grep -i "192.168.110.11:80" |wc -l
按HTTP连接数量对IP进行排序(显示前十)
netstat -nt | grep localIP:80 | awk '{print $5}' | awk -F: '{print ($1>$4?$1:$4)}' | sort | uniq -c | sort -nr | head
运行前需要将localIP替换为ifconfig中查到的服务器的本机IP地址。
查看自己IP
wget -qO- http://ipecho.net/plain; echo curl ipinfo.io curl ip.cn curl cip.cc curl myip.ipip.net
使用socks5代理进行ssh连接
这里要区分Centos6和Centos7, 在Centos6中, nc为netcat, 使用下面的命令进行连接
ssh -o ProxyCommand='nc -x 192.168.104.20:1080 %h %p' git@192.168.6.10
在Centos7中, netcat被替换为nmap-ncat, 命令也需要更新为
ssh -o ProxyCommand="ncat --proxy-type socks5 --proxy 192.168.104.20:1080 %h %p" git@192.168.6.10
可以使用配置 ~/.ssh/config
Host 192.168.6.10 RSAAuthentication yes IdentityFile ~/.ssh/id_rsa_tho User git ProxyCommand nc -v -x 192.168.104.20:1080 %h %p
vi相关操作
- 跳到首行:gg
- 跳到末行:G
- /[something] 向下查找, 查找下一个按n
- ?[something] 向上查找
- 替换当前行中的内容, 带确认
:s/text1/abc2/gc
- 替换全文中的内容, 带确认
:%s/text1/abc2/gc
, 如果text1和abc2中带了/
, 需要用\/
- dgg 删除光标前的所有内容
- dG 删除光标后的所有内容
替换
替换 /etc/apt/sources.list
%s/http:\/\/cn.archive.ubuntu.com\/ubuntu\//http:\/\/mirrors.ustc.edu.cn\/ubuntu\//gc
行号
- :set nu 左侧显示行号
- 右下角显示行号:这个必须用vim, vi没有右下角行号
- :goxxxx 跳到xxxx行
vi的方向键和Backspace键工作不正常的问题
默认的安装是vim.tiny, vi也是调用的vim.tiny, 但是运行vim.tiny时是正常的, 运行vi时不正常. 解决办法是修改通过vi打开时生效的配置文件
sudo vim.tiny /etc/vim/vimrc.tiny # 修改compatible为nocompatible set nocompatible # 增加这行修复backspace键 set backspace=2
驱动相关
驱动所在目录 /lib/modules/5.15.0-46-generic/kernel/drivers/
- 中间的 5.15.0-46 是内核版本号, 要用uname -a看一下当前是哪个内核
- 驱动按目录存储, 例如 CH341 驱动在 usb/serial 目录下
# 查看内核中已经启用的模块(驱动) lsmod # 可以用 grep 过滤 lsmod|grep ch341 # 临时禁用驱动(不卸载) sudo modprobe -r ch341 # 或者 sudo rmmod ch341 # 启用驱动 sudo modprobe ch341
如果要卸载驱动, 除了 modprobe -r 之外, 还需要将对应的 ko 文件移除, 例如对应 CH341 就是 ch341.ko
APT SOCKS5 Proxy
sudo apt -o Acquire::http::Proxy="socks5h://127.0.0.1:1090" install sublime-text
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库