一、环境变量的查看与配置
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行
head
用于输出文本文件头部到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 | alias ll='ls -alF' |
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 | screen -S <视窗名称> 创建新的视窗,并自动进入(即Attach状态) |
top
top命令用于查看进程资源占用情况的top排名。PID为进程号,USER为用户,VIRT为虚拟内存,RES为物理内存,SHR为共享内存, %CPU为进程的CPU核时间相对一个CPU核运行总时间的比例(故占用多个CPU核心的进程,其值超过100%)。
1 | Tasks: 587 total, 1 running, 584 sleeping, 2 stopped, 0 zombie |
四、网络与服务管理
ifconfig
列举当前服务器网卡配置
lsof
列举当前服务器网络端口绑定情况,常用搭配
lsof -i:<port>
用于列举指定端口,注意冒号中间无空格。
service
用于对指定服务进行操作,如
1 | service network start #启动网络服务 |
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 | ssh -f -N -L 3301:localhost:3302 localhost && lsof -i:3301 |
下例就让本机监听了自己的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_config
中GatewayPorts
为yes
,方可远程访问源端口。而-g
参数只有在开启后,才能实现控制。
SSH远程执行命令
ssh <IP|HOST> <COMMAND>
该操作实现不必登录就直接执行命令。<COMMAND>
参数是命令字符串,短小命令可以直接写在字符串中,较多命令执行时,建议写成shell脚本保存在远端服务器,并改为远程执行shell脚本。
sshpass
ssh -p <PASSWORD> ssh命令完整字符串
该命令的作用在于传递密码给ssh,方便自动登录。对于首次登录,-o StrictHostKeyChecking=no
的ssh选项可以避免ssh交互。
该操作更加适合免密登录,因为便于无交互的批量操作。其本质是ssh登录后自动执行命令并自动退出登录。
route
用于配置路由。路由一般认为是网关的实现。路由表中会有一个默认网关和其他指定网关。
查看路由表
route
或 route -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 add
和route 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 | 4 => r #read |
1 | chmod +x file #追加写权限 |
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 | $ useradd -d /public/home/zju 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 | chsh -s /usr/bin/bash |
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 | $ sudo fdisk /dev/sdb |
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 | [root@node210 ~]# lscpu |
此外在linux下,cpu信息保存在
/proc/cpuinfo
中,故可以通过文件方法查看。1 | cat /proc/cpuinfo|grep "physical id"|sort|uniq|wc -l ## 物理CPU数 |
七、时间与时区管理
ntpdate
该命令用于与指定的ntp时间服务器同步时间
1 | ntpdate ntp.ntsc.ac.cn ## 国家授时中心 |
date
该命令用于查看和修改系统时间。
hwclock
该命令用于查看和修改BIOS硬件时间。同时用于与系统时间相互同步。
clusconf
该命令中—sync-time或-yt指令,能够同步集群内服务器时间。
1 | clusconf -yt |
ntpd
时间同步服务,其配置是/etc/ntp.conf,与ntpdate手动同步不同,它是自动同步。