时子延的Linux手册

手册,而非教程。

Log

学习计划

 Debian、Ubuntu、Fedora、CentOS、Arch Linux

scp -r yolo b19220422@223.2.27.225:/home/b19220422/projects
bhosts -gpu
bsub <lsf.sh
bkill
kill 
htop
#联网
curl -d "username=你的校园网账号&password=你的密码" "http://192.168.16.20:80/portal_io/login"
su poweroff
ping mirrors.tuna.tsinghua.edu.cn -c 4 // To test that you can obtain an IPv6 address. 
ping www.baidu.com -c 4
bash -c 'echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse" > /etc/apt/sources.list'

su -   # we still need to switch to the root account first
adduser username sudo  # change `username` to your user name
exit

whoami
sudo whoami
sudo !! #以root用户执行上一条命令


发行版

Ubuntu Debian、Arch Linux、Fedora、Kaili Linux、openSUSE、Red Hat、Rocky

Note

tools

ls

  • alias ll = ls -l
  • ls -a
  • ls -l -a

man

man -k printf
man 3 printf
man 3 freopen

mkdir

  • mkdir -p , --parents

``

vim `which ls`

find

find . grep '\.c$\|\.h$' | xargs wc -l //统计一个目录中(包含子目录)中的代码行数

ps

  • ps(process status)
  • ps 仅显示本终端中运行的相关进程
  • ps aux 显示所有进程

htop

  • K 显示内核进程
  • 进程标识符(PID,Process Identifier)
  • Priority(PRI)
    • PRI = nice + 20
    • <0
    • RT
  • nice(NI)
    • renice -n 10 vim
    • renice -n 10 -p 12345

tmux

设置启用鼠标滚轮

<^B>
:set -g mouse on

此时如何复制文本?
按下shift后再选中

快捷键(需先按下 Ctrl + B) 功能
% 左右分屏
" 上下分屏
↑ ↓ ← → 焦点切换为上、下、左、右侧 pane,正在交互的 pane 被绿色框选中。
d (detach) 从 tmux 中脱离,回到命令行界面
z (zoom) 将 pane 暂时全屏,再按一次恢复原状
c 新建窗口
, 为窗口命名
s 列出所有 session
  • 配置文件所在目录~/.tmux.conf 编辑后tmux source ~/.tmux.conf 重载配置
set -g prefix C-a                                 # 设置前缀按键 Ctrl + A。
unbind C-b                                        # 取消 Ctrl + B 快捷键。
bind C-a send-prefix                              # 第二次按下 Ctrl + A 为向 shell 发送 Ctrl + A。
                                                 # (Shell 中 Ctrl + A 表示光标移动到最前端)。
set -g mouse on                                   # 启动鼠标操作模式,随后可以鼠标拖动边界进行面板大小调整。
unbind -n MouseDrag1Pane
unbind -Tcopy-mode MouseDrag1Pane

unbind '"'                                        # 使用 - 代表横向分割。
bind - splitw -v -c '#{pane_current_path}'        # -v 代表新建的面板使用全部的宽度,效果即为横向分割(或者说,切割得到的新的面板在竖直方向 (vertical) 排列)。

unbind %                                          # 使用 \ 代表纵向分割(因为我不想按 Shift)。
bind \\ splitw -h -c '#{pane_current_path}'       # -h 则代表新建的面板使用全部的高度,效果即为纵向分割(切割得到的新的面板在水平方向 (horizontal) 排列)。
setw -g mode-keys vi                              # 设置 copy-mode 快捷键模式为 vi。

gdb

systemctl

$ systemctl start jupyter
$ systemctl stop jupyter
$ systemctl enable jupyter  # enable 表示标记服务的开机自动启动
$ systemctl disable jupyter # 取消自启

at

crontab

yum

功能

服务器名称重命名

/etc/hostname

修改密码

sudo passwd

文件上传

  • scp /Users/mac_pc/Desktop/test.png root@192.168.1.1:/root

玩:自动化?

  • 监听,若则

代理?

云服务器能不能帮我过滤广告?

可以用服务器实现的需求?

长时间未操作不断连(2)

vim /etc/ssh/sshd_config

+ TCPKeepAlive yes
- ClientAliveInterval 0
+ ClientAliveInterval 300 秒 
+ ClientAliveCountMax 3

//重启sshd服务:
service sshd restart

查看系统内存状况

新建有root权限的非root用户(1)

# add user
sudo useradd -m szy
sudo passwd szy
visudo
Attention

sudo 的配置存储在 /etc/sudoers 文件中,仅 root 用户有权查看和修改。不要直接修改此文件。对这个文件的任何修改,都应该使用 visudo 这个命令去做。

  • sudo vi /etc/sudoers
    • %sudo ALL=(ALL:ALL) NOPASSWD:ALL
  • sudo vi /etc/passwd
# delete user
sudo userdel -r aaa
# 以另一个用户的身份登录
su -l [other_user_name]
# 以其他用户身份执行特定命令
su -c [command] [other_user_name]
# 以相同的环境中不同的用户
su -p [other_user_name] 

ssh免密登录

  • 配置密钥

brew

  • Install
bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

usrmerge

权限

chmod

  • chmod +x a.out

chown

sudo chown newowner:newgroup ustc101

  • /etc/shadow

统计代码行数

find . |grep '\.c$\|\.h$' | xargs wc -l

统计磁盘使用情况

du -sc /usr/share/* | sort -nr |more
	

比较两个文件

  • 文本文件的比较: vimdiff file1 file2
  • 非文本文件的比较: diff file1 file2
  • 很大的文件: md5sum file1 file2

列出一个C语言项目中所有被包含过的头文件

find . -name "*.[ch]" | xargs cat | grep "^#include" | sort | uniq

  • 时钟 watch -t -n 1 "echo -n '现在是:';date"
  • seq 1 10 | shuf
  • seq 1 10 | shuf | head -n 1
while [[ `seq 1 10 | shuf | head -n 1` != "1" ]];do echo "retry";done
  • CPU主频监视器
watch -n 1 "cat /proc/cpuinfo | grep MHz | awk '{print \$1 NR \$3 \$4 \$2}'"
  • 打包特定文件并上传到远端
find . -name "*.pdf" | xargs tar cj | ssh yzh@192.168.1.1 'cd ysyx; > pdf.tar.bz2'
  • 统计工具的类型分布
echo $PATH | tr -t : '\n' | xargs -I{} find {} -maxdepth 1 -type f -executable | \ [](https://ysyx.oscc.cc/slides/2306/02.html#cb18-2)xargs file -b -e elf | sort | uniq -c | sort -nr

开启/关闭桌面

sudo systemctl set-default multi-user.target //关
sudo reboot
sudo systemctl set-default graphical.target。//开
sudo reboot

ssh客户端显示 GUI 图形化窗口

tgpt "我通过ssh远程到了我的服务器中,当我在客户端中运行xedit时,系统提醒我szy@240124 ~/O/minimal> xedit Error: Can't open display:,我应该如何配置使得我可以在windows客户端打开图形化窗口?"

要在Windows客户端通过SSH远程连接到Linux服务器并打开图形化窗口,你需要 使用X1转发。X1转发允许你在远程服务器上运行的图形应用
程序在本地Windows客户端上显示。以下是配置步骤:

  1. 安装X Server for Windows:首先,你需要在Windows客户端上安装一个X Server,例如Xming或V
    cXsrv。这些X Server可以在Windows上运行X1应用程序。
  2. 启动X Server:安装完成后,启动X Server。通常,你可以在开始菜单 中找到它并启动。
  3. 配置SSH客户端:在你的SSH客户端中,需要配置X1转发。这通常涉及到 在SSH命令行中添加-X选项,或者在SSH客户端的配
    置文件中设置ForwardX1 yes。
    例如,如果你使用的是OpenSSH客户端,你可以在命令行中这样做:
ssh -X user@your_server_ip

或者,如果你使用的是PuTY,你需要在PuTY的配置中启用X1转发。
4. 运行图形应用程序:现在,你应该能够在远程服务器上运行图形应用程 序,并在Windows客户端上看到它们的窗口。
如果你在执行这些步骤时遇到问题,可能需要检查以下几点:

  • 确保X Server正在Windows客户端上运行。
  • 确保SSH客户端已经配置为启用X1转发。
  • 检查服务器上的/etc/ssh/sshd_config文件中是否启用了X1转发。你可能需要找到X1Forwarding yes这
    一行并确保它没有被注释掉(即没有前面的#)。
    如果你需要进一步的帮助,例如何在特定的SSH客户端上配置X1转发,或者如何 解决特定的错误,请告诉我。

Images

进程、前后台、服务

进程

进程间通信机制。由于进程之间不共享内存空间,也就无法直接发送信息,必须要操作系统帮忙,于是信号机制就产生了。

信号 man 7 signal
“Pasted image 20240201233227.png” could not be found.

  • ping localhost
  • ps

kill

  • pgrep / pkill
  • killall killall5
  • xkill
  • nohup 不被SIGHUP影响
  • kill -l 显示所有信号名称
  • man builtins type 命令名

会话session

$ tmux new -s session-a  # 启动名为 session-a 的 tmux 会话
$ tmux a -t session-a 再进入这个会话
进程属性 意义/目的
PID Process ID,标识进程的唯一性。
PPID Parent PID,标识进程父子关系。
PGID Process Group ID,标识共同完成一个任务的整体。
TPGID 标识一组会话中处于前台(与用户交流)的进程(组)。
SID Session ID,标识一组会话,传统意义上标识一次登录所做的任务的集合,如果是与具体登录无关的进程,其 SID 被重置。

fork()

setsid()

线程

SysRq

  • cat /proc/sys/kernel/sysrq
状态 缩写表示 说明
Running R 正在运行/可以立刻运行
Sleeping S 可以被中断的睡眠
Disk Sleep D 不可被中断的睡眠
Traced / Stopped T 被跟踪/被挂起的进程
Zombie Z 僵尸进程

journalctl 查看日志。

  • 某个服务的日志 journalctl 的 -u 参数可以指定 unit,
$ sudo journalctl -u ssh  # 查看 ssh 服务的日志
  • 某个正在运行的服务正在输出的日志 $ sudo journalctl -u ssh -f
  • 系统正在输出的日志 $ sudo journalctl -f

用户、用户组、文件权限、文件系统层析架构

  • 对于 Linux 来说,密码哈希信息存储在 /etc/shadow 里面,只有下文提到的根用户可以访问与修改。
Danger

我们知道,root 用户可以对系统做极其危险的操作。当使用 root 权限执行命令时(如使用 sudo),一定要小心、谨慎,理解命令的含义之后再按下回车请不要复制网络上所谓的「Linux 优化命令」等,以 root 权限执行,否则可能会带来灾难性的后果

以下是一些会对系统带来毁灭性破坏的例子。 再重复一遍,不要执行下面的命令!

  • rm -rf /(删除系统中的所有可以删除的文件,包括被挂载的其他分区即使不以 root 权限执行,也可以删掉自己的所有文件。
  • mkfs.ext4 /dev/sda(将系统的第一块硬盘直接格式化为 ext4 文件系统。这会破坏其上所有的文件。)
  • dd if=/dev/urandom of=/dev/sda(对系统的第一块硬盘直接写入伪随机数。这会破坏其上所有的文件,并且找回文件的可能性降低。)
  • :(){ :|: & };:(被称为「Fork 炸弹」,会消耗系统所有的资源。在未对进程资源作限制的情况下,只能通过重启系统解决,所有未保存的数据会丢失。)
  • sudo !!sudo执行上一条命令

  • setui setgid sticky

  • ELF 二进制文件,开头的十六进制是 7F 45 4C 46「文件标识 (Signature)」

网络、文本处理工具与 Shell 脚本

重定向

  • 重定向输出:>覆盖 >>追加
  • 重定向输入:<
  • 标准错误stderr 2>
  • stderr合并到stdout:2>&1

管道

  • |

下载

wget

特点
  • 支持以非交互方式工作,能够在用户注销后在后台进行工作。
  • 在不稳定的连接中依旧可以正常工作,支持断点续传功能。
  • 支持 HTML 页面以及 FTP 站点的递归检索,您可以使用它来获取网站的镜像,或者像爬虫一样遍历网络。
  • 在文件获取时可以增加时间标记,因此可以自动识别远程文件自上次检索后是否发生更改,并自动检索新版本。
  • 支持代理服务器,以减轻网络负载,加快检索速度。
选项 含义
-i--input-file=文件 下载本地或外部文件中的 URL
-O--output-document=文件 将输出写入文件
-b--background 在后台运行 wget
-d--debug 调试模式,打印出 wget 运行时的调试信息
$ wget -i filelist.txt

curl cURL

  • cURL 由于可自定义各种请求参数,所以在模拟 web 请求方面更擅长;wget 由于支持 FTP 协议和递归遍历,所以在下载文件方面更擅长。
选项 含义
-o 把远程下载的数据保存到文件中,需要指定文件名
-O 把远程下载的数据保存到文件中,直接使用 URL 中默认的文件名
-I 只展示响应头内容

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

文本

wc diff head tail grep sed

Shell

bash alias fish

  • 某个 foo.sh 首行为 #!/bin/bash,则执行 ./foo.sh 就等于执行 /bin/bash ./foo.sh

设置fish为默认终端

chsh -s /usr/bin/fish

组命令
  • 使用 { 命令1; 命令2; … },组命令在 shell 内执行,不会产生新的进程,注意花括号和命令之间的空格。
  • 使用 (命令1; 命令2; …),组命令会建立独立的 shell 子进程来执行组命令,这里的圆括号周围并不需要空格。

变量

  • #! /bin/bash
  • set unset
  • 在脚本开头加上 set -u:如果变量未定义,就直接报错退出。
  • 环境变量 export
特殊变量 说明
$# 命令行上的参数个数,不包括 $0
$? 最后命令的退出代码,0 表示成功,其它值表示失败
$$ 当前进程的 PID
$! 最近一个后台运行进程的进程号
$* 命令行所有参数构成的一个字符串
$@ 用双引号括起的命令行各参数拼接构成的一个字符串
  • ` ` =$()

防火墙

ufw

sudo ufw status
sudo ufw allow 8080
sudo ufw delete allow 8080
sudo ufw reload

firewalld

systemctl stop firewalld  
systemctl disable firewalld  
systemctl status firewalld

read

Linux Filesystem Hierarchy Standard (FHS)

“Pasted image 20240201154019.png” could not be found.

“Pasted image 20240201183446.png” could not be found.

ISA

“Pasted image 20240202164749.png” could not be found.

附录一:Linux相关单词


待整理

fdisk -l

磁盘分区 引导 MBR GPT

  • 网络
    • 桥接
    • NAT