【Linux】Linux基础命令
用户
切换用户
完全模拟{username}登录,运行其个性化配置的程序
1 | sudo -i -u {username} |
临时使用以{username}身份,在当前目录执行一个命令,环境变量无所谓
1 | sudo -u {username} -s |
创建用户
1 | sudo useradd -m -s /bin/bash {username} |
-m:创建用户的同时,创建用户的/home/{usrname}目录-s /bin/bash:指定用户的默认登入shell为Bash
如果不用
-s /bin/bash会出现无法使用上下左右方向键的问题
使用cat /etc/passwd可以看到{username}的登入shell是/bin/sh
使用ls -l /bin/sh,发现/bin/sh -> dash
修改连接目录sudo ln -sf /bin/bash /bin/sh,重新登入账户就可以了
1 | sudo passwd {username} |
为新用户设置密码,需要输入两次
删除用户
1 | sudo userdel -r {username} |
删除用户及其相关的文件,包括/home/{username}文件
给新用户root权限
通过将新用户添加到sudo组来给予root权限
1 | sudo usermod -aG sudo {username} |
验证:执行sudo ls /root,需要输入用户密码确认权限
注意:
如果使用的是VSCode连接的服务器,可能会出现每次连接后该用户的分组(输入
Gropos查看)不是最新的问题。原因:
VSCode Remote SSH 会:
保持长连接
复用 ssh control master
后台常驻 vscode-server
你以为重新连接了,其实还是原来的ssh session
解决方法:
原因清楚之后,就很好解决了,只需要将VSCode Remote SSH完全断开就好了
- 在VSCode中使用快捷键
Ctrl+Shift+p- 输入
Remote-SSH: Kill VS Code Server on Host- 选择你的服务器,并输入密码
- 重新启动VSCode
另外,如果你使用VSCode,你可能会随时出现
__vsc_prompt_cmd_original: command not found报错,所以在使用VSCode之前,建议将VSCode设置中的terminal.integrated.shellIntegration.enabled关闭。但是如果你此时已经使用VSCode登录过的话,那只能在.bashrc文件中添加unset PROMPT_COMMAND再使用source ~/.bashrc使应用更改
即使给了sudo权限之后,该用户在第一次使用sudo的时候后需要输入密码,比较不方便,解决方法:
- 使用
sudo visudo -f /etc/sudoers.d/wordswar进入nano编辑器界面
- visudo 是专门用来编写sudoers的,防止语法错误导致不能再使用sudo命令了
- 然后输入
{username} ALL=(ALL) NOPASSWD:ALL
- All任意主机
- (ALL)以任意用户身份执行
- NOPASSWD:不需要密码
- ALL所有命令
- 按
Ctrl+O,底部会出现File Name to Write: /etc/sudoers.d/wordswar.tmp- 直接回车
Enter即可保存- 按
Ctrl+X退出nano- 如果没有问题会直接返回shell,如果有问题会提示syntax error
此时{username}就可以不用再输入密码直接使用sudo命令了
查看用户和组
| 命令 | 解释 |
|---|---|
cat /etc/passwd |
列出所有用户信息,每一行对应一个用户 |
who或者w |
查看当前登入的用户 |
id {username} |
查看指定用户 |
/etc/passwd文件内容:
1
2 root:x:0:0:root:/root:/bin/bash
steam:x:1000:1000::/home/steam:/bin/sh使用
:分割
- steam:用户名
- x:加密的密码字段(为了安全不再存在该文件下,而是存在
/etc/shadow下)- 1000:用户ID(UID)
- 1000:组ID(GID)
- **:用户描述信息,一般为空
/home/steam:用户的主目录/bin/sh:用户登入的shell
| 命令 | 解释 |
|---|---|
cat /etc/group |
查看所有组,每一行对应一个组 |
groups {username} |
查看{username}所在组 |
防火墙
基础命令
| 基础命令 | 效果 |
|---|---|
systemctl start firewalld.service |
开启防火墙 |
systemctl status firewalld.service |
查看防火墙状态 |
systemctl stop firewalld.service |
关闭防火墙 |
systemctl enable firewalld.service |
开启时自启 |
systemctl disable firewall.service |
关闭开机自启 |
systemctl is-enable firewall.service |
查看服务是否开机自启 |
systemctl --failed |
查看启动失败的服务列表 |
配置防火墙
| 命令 | 效果 |
|---|---|
firewall-cmd --zone=public --list-ports |
查看开放的端口 |
firewall-cmd --reload |
重新载入防火墙 |
firewall-cmd --zone=public --add-port=80/tcp --permanent |
开放80端口,--premanent表示永久开放,重启后也依然开放 |
每次在配置完防火墙之后需使用firewall-cmd --reload更新配置
文件操作
快捷方式
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
实时查看log文件
1 | tail -f /path/to/your/logfile.log |
1 | less +F /path/to/your/logfile.log |
常用命令
| cat |
查看文件 |
|---|---|
| touch |
创建文件 |
| mkdir -p |
创建文件夹(-p 创建缺失的父目录) |
| cp fileName |
复制文件(后面的地址,不用加文件名) |
| mv |
移动文件 |
| mv |
修改文件名称 |
| rm |
删除文件 |
| rm -r |
删除空文件夹 -f 强制删除,不用确认 |
| find / -name “Log.Develop.20260514??.Debug.log” | 查找文件 |
| cd | |
|---|---|
| pwd | 显示当前所在路径 |
| cd - | 返回上一次所在路径 |
文件详情
1 | -rwxrw-r-- 1 ubuntu root 1249 May 22 01:09 init.vim |
第一个字符:表示类型
- -:普通文件
- d:目录
- l:软链接
后续9个字符:表示权限
- rwx:所有者可读可写可执行
- rw-:所属组可读可写
- r–:其他用户仅可读
文件权限
r:4 w:2 x:1
owner = rwx = 4+2+1 =7
chmod [-R] xyz
将owner/group/others及其子文件都设置为可读可写可执行
chmod -R 777 fileName
- -R:递归所有子目录和文件
修改文件所有者:注意两个不一样,一个是
chmod一个是chownchown -R ubuntu:ubuntu /data/wordswar-fantasy
- 设置为ubuntu用户,和ubuntu用户组
硬链接数
- 表示该文件的硬链接数量为1(即无其他硬链接指向此文件)
- 如果是目录,此数字表示子目录数(至少为2,含
.和..)
硬链接是同一个文件的多个名称(类似于一个人的多个别名)。
删除原始文件或任一硬链接,只要还存在至少一个硬链接,文件数据就不会被真正删除。
用途:
- 备份与冗余:通过硬链接保护重要文件(删除一个不影响其他)。
- 节省空间:多个硬链接共享同一份数据,不占用额外磁盘空间。
- 版本控制:某些工具(如 Git)内部使用硬链接优化存储。
1
2
3
4
5
6
7
8
9
10
11# 创建硬链接
echo "Hello" > original.txt
ln original.txt hardlink.txt # 创建硬链接
# 查看 inode(确认是否相同)
ls -i original.txt hardlink.txt
# 输出示例:12345 original.txt 12345 hardlink.txt
# 删除原始文件后,硬链接仍可访问
rm original.txt
cat hardlink.txt # 正常输出 "Hello"所属者和所属组
- 所有者为ubuntu(所有者(Owner):当前拥有文件控制权的用户(不一定是创建者)。)
- 所属组为root
文件大小
- 1240字节(默认单位是字节,使用ls -lh可显示易读单位)
最后修改时间
端口
| netstat -lntp | 查看网络连接状态和端口情况 |
|---|---|
| netstat -tlnp | grep :20000 | 查看20000端口网络状态 |
| lsof -i :5000 | 查看5000端口的进程PID,然后可以使用sudo kill |
进程
| top | 查看系统实时状态,可以使用top -b -d 10 -n 10 > top_log.txt 来将内容保存下来(每十秒保存一次,共保存10次) |
|---|---|
| ps -ef | 查看所有进程可以通过 ps -ef | grep |
| ps aux | grep nginx | 查看nginx的进程 |
解压/压缩
| .tar | tar xvf FileName.tar | 解压 |
|---|---|---|
| tar cvf FileName.tar DirName | 压缩 tar cvf {newname.tar} {path/to/name} | |
| .tar.xz | tar xvf FileName.tar.xz | |
| tar cvf FileName.tar DirName | ||
| .tar.gz | tar zxvf FileName.tar.gz | |
| tar zcvf FileName.tar.gz DirName | ||
| zip | unzip FileName.zip | |
| zip FileName.zip DirName |
在重装linux系统后,vscode无法连接,可能是ssh秘钥变了
报错内容,提示C:\\Users\\coffeeofnosugar/.ssh/known_hosts:10第10行,那就删掉这一行。如果还是不行,那就删除掉有相同ip的行
1 | > Please contact your system administrator. |
swap
什么是 swap
当机器所需内存突然膨胀到超出最大内存,linux 会启动 Out Of Memort Killer 直接干掉一个服进程,服务器就会挂掉。如果有 swap, linux 就会把一些不常用的内存页写到磁盘,这样服务器就还能继续运行。但 swap 的速度可能会比内存的速度慢1000~10000倍。
大小选择
- 4G服务器 –> Swap 1~2GB
- 8G服务器 –> Swap 2~4GB
- 16G+服务器 –> Swap 2GB
创建步骤
1 | // 创建 |
开机自动挂载
1 | sudo nano /etc/fstab |
末尾加入
1 | /swapfile none swap sw 0 0 |
保存即可
或者使用echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
ncdu
安装
1 | sudo apt install ncdu |
基本使用
1 | # 分析当前目录 |
快捷键
| 按键 | 功能 |
|---|---|
| 上下箭头 | 选择文件/目录 |
| Enter | 进入选中的目录 |
左箭头 ← |
返回上级目录 |
| d | 删除选中的文件/目录(会确认) |
| n | 按文件名排序 |
| s | 按文件大小排序(默认) |
| g | 按文件大小排序(显示百分比条) |
| t | 切换是否显示目录总大小 |
| c | 显示/隐藏子项目数量 |
| r | 刷新/重新扫描当前目录 |
| q | 退出 ncdu |
| ? | 显示帮助菜单 |
| i | 显示选中文件/目录的详细信息 |
truncate命令
truncate 是 Linux 中用于调整文件大小的命令。
它最大的特点是:
- 可以快速清空文件内容
- 可以把文件截断到指定大小
- 可以扩展文件到指定大小
- 不会删除文件本身及其权限
例如日志文件太大:
1 | truncate -s 0 access.log |
执行后:
1 | ls -lh app.log |
显示:
1 | -rw-r--r-- 1 ubuntu ubuntu 0 Jun 19 11:00 app.log |
文件还在,但内容被清空了。
这相当于:
1 | > app.log |
或者:
1 | echo "" > app.log |
但 truncate 更直观。
定时任务
1 | // sudo的定时任务 |
第一次使用时可能会出现
1 | ubuntu@VM-1-7-ubuntu:~$ crontab -e |
是让你选择编辑文件的方式,选1或2都可以
进入后,可以在文件的最后添加
1 | // 每天的凌晨3点执行 /usr/bin/truncate -s 0 /home/ubuntu/nginx/logs/access.log |
1 | ┌──────── 分钟 (0 - 59) |
1 | 0 0 * * * // 每天0点执行 |