一、环境变量的查看与配置

1.1 环境变量的查看

$PATH

通过“$+名称”的形式查看环境变量。这里以添加路径/usr/local/gcc-8.3.0/bin到环境变量为例,该路径是gcc、g++等C/C++编译器命令的目录。

1.2 临时环境变量的设置

(1)bash脚本中变量

v=$1

通过如上形式同其他编程语言一样产生变量,并用“$”查看。

效用范围:当前bash脚本

(2)export命令配置环境变量

export PATH=$PATH:/usr/local/gcc-8.3.0/bin

效用范围:当前终端连接,所有用户。不同路径间分隔符用“:”,$PATH放在其中用于拼接原有的路径。下同。

(3)/etc/profile

export PATH=$PATH:/usr/local/gcc-8.3.0/bin

这个文件中添加同样的命令,并

source /etc/profile

效用范围:重启系统前,属于临时环境变量,只有效于当前终端连接和所有用户。重启系统后,属于全局环境变量,长期有效。

1.3 永久环境变量的设置

(1)~/.bashrc

export PATH=$PATH:/usr/local/gcc-8.3.0/bin

在上述文件中添加同样的命令,在下次用户登录时生效或者通过source ~/.bashrc立即生效。

效用范围:永久,当前用户

(2)/etc/bashrc

export PATH=$PATH:/usr/local/gcc-8.3.0/bin

在上述文件中添加同样的命令,在下次用户登录时生效或者通过source /etc/bashrc立即生效。

原理:每次所有用户终端连接时会执行这个脚本

效用范围:永久,所有用户。

(3)/etc/profile

同前所述,不同的是,需要重启系统才能永久生效。

效用范围:永久,所有用户

二、IO管理

cp

用于文件拷贝

scp

用于文件的跨服务器传输拷贝

1
scp -p 22 <USER>@<HOST>:<SOURCE_ABSOLUATE_PATH> <TARGET_PATH>

从远端拷贝到当前。

mv

用于文件的移动或重命名

rm

用于文件或文件夹的删除

1
rm -rf / # 删库跑路坐牢一条龙

mkdir

创建文件夹,注意不能递归创建,必须先有父目录

pwd

abbreviation of “print working directory”, get the absolute path of current working dir.

dirname

dirname <PATH>

获取指定路径的父路径名,实际上它只是利用路径分隔符对路径输入进行分隔,不能保证输入路径的有效性。

basename

basename <PATH>

获取指定路径的基础文件名(文件/文件夹),原理与dirname一样。

cat

用于输出整个文本文件到std

tail

用于输出文本文件末尾到std

1
tail -f log.txt

实时输出文件末尾新增情况。

tail -n 100 log.txt
输出末尾100行

用于输出文本文件头部到std,用法同tail。

cd

打开指定目录

ls

罗列指定目录下条目,常用为ls -hl

echo

输出指定变量值到std

ln

创建文件链接,常用于软连接创建

1
ln -s /usr/local/gcc-8.3.0/bin/g++ /usr/bin/g++

ll

查看指定文件的链接,指向,常用于寻找链接文件的真实路径。是一个命令别名而非独立命令。

1
2
3
alias ll='ls -alF'
ll /usr/bin/g++
# /usr/bin/g++ -> /usr/local/gcc-8.3.0/bin/g++

tar

常用于解压或压缩tar.gz等文件。

tar.gz

  • 解压:tar zxvfv mpc-1.2.1.tar.gz
  • 压缩:tar –czf jpg.tar.gz *.jpg

tar.bz2

  • 解压:tar jxf gmp-6.2.1.tar.bz2

zip

压缩产生zip文件

unzip

解压zip文件

jq

json解析命令。用.[i]来索引数组,用.key或."key"来取对应的key值。非系统自带,需要第三方安装下载。这个命令的一个有点在于简便,没有任何其他依赖,只需要一个可执行文件。

三、进程管理

ps

查看运行进程。常用搭配

1
ps -aux|grep <information>

用于查找指定信息的进程。
1
ps -eo pid,ppid,vsz,command

用于输出指定信息列,示例中包含了进程号“PID”,父进程号“PPID”,虚拟内存占用“VSZ”和执行命令“COMMAND”。参见文档

kill

终止指定PID(process id)的进程

jobs

列举当前链接用户终端进程

nohup

用于进程忽略终端退出信号而持续运行。常用于那些长时间运行的任务,常于“&”和输出重定向搭配

1
nohup jupyter notebook >> jupyter41.log 2 > 1& &

screen

screen是一个多视窗管理工具,也是一个后台管理工具。通过screen可以创建多个独立视窗,并忽视终端退出信号。

1
2
3
4
5
6
7
screen -S <视窗名称>      创建新的视窗,并自动进入(即Attach状态)
screen -r <视窗ID或名称> 恢复进入Detach的视窗
screen -ls 查看当前所有的视窗
screen <命令> 创建匿名视窗并执行shell命令
screen -d <视窗ID或名称> detach指定视窗(不会终止视窗内进程)
Ctrl + A +D 切换回主视窗(即Detach当前视窗)
Ctrl + D 或 exit 删除当前视窗

top

top命令用于查看进程资源占用情况的top排名。PID为进程号,USER为用户,VIRT为虚拟内存,RES为物理内存,SHR为共享内存, %CPU为进程的CPU核时间相对一个CPU核运行总时间的比例(故占用多个CPU核心的进程,其值超过100%)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Tasks: 587 total,   1 running, 584 sleeping,   2 stopped,   0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 26360129+total, 9660912 free, 5966312 used, 24797406+buff/cache
KiB Swap: 16777212 total, 16777212 free, 0 used. 25584766+avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20149 root 20 0 1745724 265144 3836 S 0.0 0.1 17:34.62 sm
158293 root 20 0 6609532 261320 22520 S 0.0 0.1 0:16.98 java
158045 root 20 0 1370436 109704 19792 S 0.0 0.0 0:28.06 node
10167 root 20 0 219244 107056 106696 S 0.0 0.0 4:23.27 systemd-journal
62065 root 20 0 3991400 106604 30936 S 0.0 0.0 5:39.75 dockerd
144536 root 20 0 1089432 78836 18328 S 0.0 0.0 0:55.32 node
144506 root 20 0 7413524 69824 11628 S 0.0 0.0 0:07.45 jupyter-lab
144525 root 20 0 915576 66192 17376 S 0.0 0.0 0:07.23 node

四、网络与服务管理

ifconfig

列举当前服务器网卡配置

lsof

列举当前服务器网络端口绑定情况,常用搭配

lsof -i:<port>

用于列举指定端口,注意冒号中间无空格。

service

用于对指定服务进行操作,如

1
2
3
service network start #启动网络服务
service network shutup #关闭网络服务,远程连接时慎入
service network restart #重启网络服务,远程连接时慎入

history

用于列举输入的全部历史命令,比用方向键高效。常和grep配合使用,如

1
history|grep "docker run"

ssh

ssh服务是Linux服务器远程登录的基础服务。在正确配置ssh服务并启动systemctl start sshd,可以通过ssh命令进行远程登录、ssh隧道转发等。

ssh登录

ssh [-p <PORT> -i <KEY_FILE> <USER>@]<IP|HOST>

  • 登录方式一般分为密码登录和公钥免密登录。
  • []内为可选参数。
  • -p指定登录端口号<PORT>,默认端口号为22。
  • 可以指定登录用户名<USER>,与IP用@分隔。不指定时,默认使用当前登录远程终端的用户名(相当于先调用了whoami获取了用户名)。
  • -i指定公钥文件<KEY_FILE>,使用公钥登录时需要指定。

SSH端口转发

SSH端口转发,也称基于SSH隧道的内网穿透,主要用于解决主机无法访问的问题。在SSH端口转发中,有三个主机概念:

  • 源主机:发出数据的主机
  • 目标主机:接收数据的主机
  • 代理主机/中介主机:负责源主机和目标主机的桥接

有两个端口概念:

  • 源端口:源主机的监听端口,源主机的SSH服务会主动监听该端口,将所有发送到该端口的数据通过SSH隧道转发到目标主机的目标端口
  • 目标端口:目标主机接收数据的端口

可以直观理解为建立了源主机:源端口--->目标主机:目标端口的一对端口映射。根据源主机的不同,可以分为本地端口转发远程端口转发

SSH本地端口转发

本地端口转发,源主机即当前操作SSH命令的主机,可以是你本地的PC,也可以是你SSH远程登录的服务器等。其基本使用命令如下:

1
ssh -f -N -g -L [允许的访问主机:]源端口:目标主机:目标端口 代理主机

  • -f 类似于nohup,表示background运行
  • -L 代表本地端口转发(login),也就是名称的本地。因为它是利用本机的端口进行转发。
  • -g 代表允许发送给源端口的信息不必是源主机,可以是任何可以连接源主机的主机(global),例如我们建立了node12服务器节点的端口转发,那么PC就可以直接通过这个端口访问目标主机。否则只能是来自源主机自身的数据。
  • -N 代表不执行远程命令时不登录(nologin),否则会登录代理主机

-g参数是否使用,可以看到如下差别,即使用-g,监听的是来自任意主机(*号表示通配任何主机)的TCP连接请求;而不使用则只监听来自localhost的TCP连接请求。

1
2
3
4
5
6
7
ssh -f -N -L 3301:localhost:3302 localhost && lsof -i:3301
ssh 42420 root 4u IPv6 2545727 0t0 TCP localhost:3301 (LISTEN)
ssh 42420 root 5u IPv4 2545728 0t0 TCP localhost:3301 (LISTEN)

ssh -f -N -g -L 3303:localhost:3302 localhost && lsof -i:3303
ssh 42462 root 4u IPv4 2546004 0t0 TCP *:3303 (LISTEN)
ssh 42462 root 5u IPv6 2546005 0t0 TCP *:3303 (LISTEN)

下例就让本机监听了自己的TCP/2241端口,并转发到node41的22端口。这个转发可以用来远程ssh登录内网服务器41节点。本机自身充当中间主机。
1
ssh -f -N -g -L "2241:node41:22" localhost

下例用于连接node200节点。通过node12作为中间主机,因为当前主机无法直连node200。此时请求会从本地2233端口,通过中间机node12,转发给目标机node200的22端口。
1
ssh -f -N -g -L "2233:node200:22" user@node12

在不使用-g开放访问时,可以通过允许访问的主机限制远程访问,例如下例允许与本地主机相同局域网的其他机子访问本地端口2233,通过中间机node12,转发给目标机node200的22端口。
1
ssh -f -N -L "*:2233:node200:22 user@node12"

在不使用-N选项禁止登录时,执行上述命令会登录代理主机node12。
1
ssh -f -L "2233:node200:22 user@node12"

SSH远程端口转发

远程端口转发,源主机为远程主机,中介主机为当前主机。本地转发是将本地端口映射到指定端口,适用于将个人PC转发至服务器。但相应反过来将服务器转发至个人PC却不行,因为一般情况下个人PC没有ssh服务,服务器无法直接发起ssh连接到PC,需要PC主动连接服务器。远程转发是将远程端口映射到指定端口,刚好解决这个问题,个人PC发出SSH连接服务器后,让服务器监听自己的指定端口,并转发到个人PC指定端口。其命令格式与本地转发相似

1
ssh -f -N -g -R 源端口:目标主机:目标端口 源主机

即将-L(local)改为-R(remote)。例如下例将node2:3390转发至localhost:22。

1
ssh -f -N -g -R "3390:localhost:22" node2

当然目标主机不一定是执行命令的主机,可以是任意能够被当前执行命令主机(中介主机)连接到的服务器。例如下例建立了node200:3301到node12:22的连接,而两主机本身无法直连。
1
ssh -f -N -g -R "3301:node12:22" user@node200

值得注意的是,此时监听端口的sshd服务是在node200上,而发起端口转发的发起者是本地机子sshd服务。而sshd服务默认只允许远程端口转发的监听端口只接受来自localhost的请求(即node200发的TCP数据),即会让-g参数强制无效,毕竟这个参数也是远程转发指定的,有安全风险。例如在个人电脑上,ssh node200 -p 3301会报错Connection Refused。因为本地电脑不是node200。为此,需要配置node200的/etc/ssh/sshd_configGatewayPortsyes,方可远程访问源端口。而-g参数只有在开启后,才能实现控制。

参考资源

SSH远程执行命令

ssh <IP|HOST> <COMMAND>

该操作实现不必登录就直接执行命令。<COMMAND>参数是命令字符串,短小命令可以直接写在字符串中,较多命令执行时,建议写成shell脚本保存在远端服务器,并改为远程执行shell脚本。

sshpass

ssh -p <PASSWORD> ssh命令完整字符串

该命令的作用在于传递密码给ssh,方便自动登录。对于首次登录,-o StrictHostKeyChecking=no的ssh选项可以避免ssh交互。

该操作更加适合免密登录,因为便于无交互的批量操作。其本质是ssh登录后自动执行命令并自动退出登录。

route

用于配置路由。路由一般认为是网关的实现。路由表中会有一个默认网关和其他指定网关。

查看路由表

routeroute -n

Destination 代表走这条路由的本机IP。默认其Destination是0.0.0.0,即物理本机,相当于本机IP的通配,代表了不在路由表中明确指定的所有本地IP。

Gateway 是网关地址

Genmask 是子网掩码,默认路由没有子网掩码,0.0.0.0和IP一样代表通配。因为IP+子网掩码才能表示一个IP网络地址。

Metric 代表优先级,值越高优先级越低。

添加或删除默认路由(网关)

route add default gw <GATEWAY>

route del default gw <GATEWAY>

添加或删除固定路由

也是基于route addroute del

reboot

重启系统,远程操作慎入。

shutdown

关闭系统。远程操作慎入。

tc6000节点校园网连接

相关基础文档参见浙江大学信息技术中心的linux端

/etc目录下有集成命令的sh脚本/etc/outside-net.sh

五、账户与权限管理

whoami

means “who am I”, get current user’s name.

id

id [<USERNAME>]

用于查看指定账户的UID、GID信息。没有参数代表当前账户。

chmod

修改文件IO权限, 记忆”change mode”

1
2
3
4 => r #read
2 => w #write
1 => x #execute

1
2
3
chmod +x file  #追加写权限
chmod 777 file #自己、同组内用户、其他组用户的权限,7=rwx,即可读可写可执行
chmod -R 777 DIR #递归修改

chown

修改文件所有者及组群,-R代表递归修改子文件夹。记忆”change owner”

chown -R 用户名 文件/文件夹
chown -R 用户名:组群 文件/文件夹

chgrp

修改文件所属用户组,可以用chown实现相同操作。记忆”change group”。用户组信息在/etc/group中存在。

useradd

useradd [-u <UID> -g <GID|NAME> -d <HOME_DIR>] <USERNAME>

用于创建指定名称的用户,可以用-u指定UID,用-g指定对应的用户组,-d指定用户目录(没有会创建)。当没有指定UID和GID时,会自动分配UID,并创建一个同用户名一样的Group名,GID等于UID(在不冲突的前提下)。用户信息基本保存在/etc/passwd(不过不如文件名那样,出于安全,现行Linux系统,密码现在不在里面保存)。对于服务器集群来说,只要两个服务器节点的用户UID/GID一致,那么就不会有权限冲突。因此服务器集群应当统一UID/GID,这也是clusconf帮我们做的事。clusconf默认指定用户组users。

1
2
3
$ useradd -d /public/home/zju zju
$ id zju
uid=1022(zju) gid=1022(zju) groups=1022(zju)

userdel

userdel <NAME>

类似地,用于删除空闲用户。所谓空闲,指的是用户没有任何进程占据,包括没有登录(登录会有shell进程)。userdel会同时删除作为primary group的默认同名空闲group。

usermod

usermod [<OPTION>...] <USER>

用于修改用户的一些属性,如UID、所属用户组(GID或名字都行)和用户目录等。

-d 新用户目录
-u 新UID
-g 新GID/groups(group必须事先存在,这里的新指的是更换)

groupadd

groupadd [-g <GID>] <NAME>

用于创建指定名称的group,可以选择指定的GID,也可以让其自动分配。信息保存在/etc/group中。

groupdel

groupdel <NAME>

用于删除没有任何用户的group。有用户存在必须先删除用户或者修改用户的GID信息。

groupmod

groupmod [<OPTION>...] <GROUP>

与usermod类似,但用于修改group的GID等信息。

clusconf

曙光公司提供的服务器集群管理命令

clusconf -au <USER> 在服务器集群体内创建统一用户。

chsh

更改默认的shell终端。

1
2
chsh -s /usr/bin/bash
chsh -s /usr/bin/sh

exit

结束当前终端(ssh)连接

logout

结束当前终端(ssh)连接

六、设备管理

cfdisk

cfdisk /dev/sdb
对指定硬盘进行分区管理。分区后需要对freespace重新挂载。

此外,还有fdisk进行格式化硬盘分区。

df

df -hT
显示挂载的分区

lsblk

显示当前所有分区,包括未挂载分区

mount

mount [-t filesystem] device folder

将本机硬盘分区或整个硬盘挂载到指定文件夹。一般需要先格式化分区或硬盘。

mount host|ip:remote_folder local_folder

将远程文件夹挂载到本地文件夹,如如mount node210:/public /public。需要远程机器配置允许才能使用,参见文档

umount

umount device

卸载挂载的分区或硬盘,umount /dev/sdb1

mkfs

mkfs -t filesystem device

相似命令有mkfs.ext4 device等。用于格式化硬盘或分区。格式化前要求先卸载分区或硬盘。
配合fdisk可以进行分区创建与文件系统生成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ sudo fdisk /dev/sdb
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p):

Using default response p.
Partition number (1-4, default 1):
First sector (2048-976773167, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-976773167, default 976773167):

Created a new partition 1 of type 'Linux' and of size 465.8 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

$ sudo mkfs.ext4 /dev/sdb1
$ sudo mkdir /public
$ sudo mount /dev/sdb1 /public
$ sudo blkid /dev/sdb1 # 查看UUID
dev/sdb1: UUID="1e7e5ca8-f25f-42c5-b648-81904f46a07c" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="c3f1fc72-01"
$ vim /etc/fstab # 修改实现开机自动挂载
/dev/disk/by-uuid/1e7e5ca8-f25f-42c5-b648-81904f46a07c /public ext4 defaults 0 1

mkfs.ext4

mkfs.ext4 /dev/sdb1

EXT4格式化指定分区。

卸载分区。

lspci

用于列举当前服务器pci设备情况,常配合grep来查看显卡信息。

nvidia-smi

用于列举英伟达GPU情况,需要安装英伟达GPU驱动和CUDA套件。

lscpu

一个CPU架构可以有多个CPU(C),一个CPU具有多个核(K),一个核有可以具有多个超线程(T),C即物理CPU数,K即CPU核数,T即每个核的超线程数,最终逻辑CPU数位C*K*T参考文档。通过lscpu命令可以查看cpu信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@node210 ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 56 ## 逻辑CPU数
On-line CPU(s) list: 0-55
Thread(s) per core: 2 ## 超线程数
Core(s) per socket: 14 ## CPU核数
Socket(s): 2 ## 物理CPU数
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 85
Model name: Intel(R) Xeon(R) Gold 6132 CPU @ 2.60GHz
Stepping: 4
CPU MHz: 1000.000
CPU max MHz: 2601.0000
CPU min MHz: 1000.0000
BogoMIPS: 5200.00
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 1024K
L3 cache: 19712K
NUMA node0 CPU(s): 0-13,28-41
NUMA node1 CPU(s): 14-27,42-55
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt ssbd mba ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts pku ospke spec_ctrl intel_stibp flush_l1d

此外在linux下,cpu信息保存在/proc/cpuinfo中,故可以通过文件方法查看。
1
2
3
cat /proc/cpuinfo|grep "physical id"|sort|uniq|wc -l            ## 物理CPU数
cat /proc/cpuinfo|grep "cpu cores"|uniq|awk -F': ' '{print $2}' ## CPU核数
cat /proc/cpuinfo|grep "processor"|sort|wc -l ## 逻辑CPU数

七、时间与时区管理

ntpdate

该命令用于与指定的ntp时间服务器同步时间

1
2
ntpdate ntp.ntsc.ac.cn  ## 国家授时中心
ntpdate ntp.aliyun.com ## 阿里云

date

该命令用于查看和修改系统时间。

hwclock

该命令用于查看和修改BIOS硬件时间。同时用于与系统时间相互同步。

clusconf

该命令中—sync-time或-yt指令,能够同步集群内服务器时间。

1
clusconf -yt

ntpd

时间同步服务,其配置是/etc/ntp.conf,与ntpdate手动同步不同,它是自动同步。