Linux 命令行操作遵循的是 命令 + 文件
的模式,这不同于windows 界面 + 菜单
的模式。
软件安装
CentOS, Ubuntu 两个发行版体系命令有所不同。
rpm -i xxx.rpm
# query the installed list
rpm -qa
# remove the sofeware, erase
rmp -e xxx
dpkg -i xxx.deb
dpkg -l
dpkg -r xxx
实际上更常用的是上面命令的集成工具,它们分别是 yum
和 apt
。
yum search xxx
apt search xxx
yum install xxx
apt install xxx
yum erase xxx
apt purge xxx
那这些软件是从哪里下载的呢,这些信息是在系统配置文件中指定的。
/etc/yum.repos.d/CentOS-Base.repo
/etc/apt/sources.list
如何修改 apt-get 镜像源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo vim /etc/apt/sources.list
Add new source address
sudo apt-get update
基于总所周知的原因,有时候需要给 apt 配置代理才能访问某些资源,/etc/apt/apt.conf
。
Acquire::http::proxy "http://127.0.0.1:3132/";
Acquire::https::proxy "https://127.0.0.1:3132/";
程序运行
- 交互式运行
通过 shell 交互式运行,这样执行的程序允许用户输入,输出结果也打印到交互命令行上。比较适合运行一些简单的命令,例如通过 date 获取当前时间。这种模式的缺点是一旦当前的交互命令行退出,程序就停止运行了。 - 后台运行
我们往往使用nohup命令。这个命令的意思是 no hang up(不挂起),也就是说,当前交互命令行退出的时候,程序不退出。当然这个时候,程序不能霸占交互命令行,而是应该在后台运行。命令最后加一个&
,就表示后台运行。另外一个要处理的就是输出,原来什么都打印在交互命令行里,现在在后台运行了,输出到哪里呢?输出到文件是最好的。最终命令的一般形式为nohup command >out.file 2>&1 &
。这里面,“1” 表示文件描述符 1,表示标准输出,“2” 表示文件描述符 2,意思是标准错误输出,2>&1
表示标准输出和错误输出合并了。合并到哪里去呢?到 out.file 里。 - 以服务的方式运行
例如在 Ubuntu 中,我们可以通过apt-get install mysql-server
的方式安装 MySQL,然后通过命令systemctl start mysql
启动 MySQL,通过systemctl enable mysql
设置开机启动。之所以成为服务并且能够开机启动,是因为在/lib/systemd/system
目录下会创建一个XXX.service
的配置文件,里面定义了如何启动、如何关闭。
磁盘操作
磁盘挂载
mount: wrong fs type, bad option, bad superblock on /dev/xxx,挂载时未格式化,使用的文件系统格式不对
-
格式化磁盘
sudo mkfs -t ext4 /dev/xxx
sudo mkfs.ext4 /dev/xxx -
挂载磁盘 mount -t type device dir:挂载device到dir
sudo mount -t ext4 /dev/xxx /path/for/mount
启动时自动挂载
- 查询设备上所采用文件系统类型以及UUID, block device attribute
sudo blkid /dev/xxx - 在/etc/fstab中添加一行
设备名,挂载点,文件系统类型,选项,是否dump,启动是否检查磁盘,根目录选1,不检查选0,其他的可以选2。
/dev/vdb /mnt ext4 defaults 0 0
UUID=XXX /mnt ext4 defaults 0 0
磁盘常用命令
df -h: 查看磁盘分区情况
df -T: 查看所有磁盘的文件系统类型(type)
fdisk -l: 查看所有被系统识别的磁盘,磁盘分区
du -sh: 查看磁盘占用情况
内存常用命令
# 查看系统内存使用情况
free -m
cache / buffer 清理
sync
echo 1 | sudo tee /proc/sys/vm/drop_caches
echo 2 | sudo tee /proc/sys/vm/drop_caches
echo 3 | sudo tee /proc/sys/vm/drop_caches
// As this is a non-destructive operation,
// and dirty objects are notfreeable,
// the user should run "sync" first in order to make sure allcached objects are freed.
To free pagecache:
* echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
* echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
* echo 3 > /proc/sys/vm/drop_caches
可以写个脚本定时运行,这里设置了 4G 的阈值,小于这个数就清理。
#! /bin/sh
used=`free -m | awk 'NR==2' | awk '{print $3}'`
free=`free -m | awk 'NR==2' | awk '{print $4}'`
echo "===========================" >> /app/memory/logs/mem.log
date >> /app/memory/logs/mem.log
echo "Memory usage before | [Use:${used}MB][Free:${free}MB]" >> /app/memory/logs/mem.log
if [ $free -le 4000 ] ; then
sync && echo 1 > /proc/sys/vm/drop_caches
sync && echo 2 > /proc/sys/vm/drop_caches
sync && echo 3 > /proc/sys/vm/drop_caches
used_ok=`free -m | awk 'NR==2' | awk '{print $3}'`
free_ok=`free -m | awk 'NR==2' | awk '{print $4}'`
echo "Memory usage after | [Use:${used_ok}MB][Free:${free_ok}MB]" >> /app/memory/logs/mem.log
echo "OK" >> /app/memory/logs/mem.log
else
echo "Not required" >> /app/memory/logs/mem.log
fi
exit 1
每天早上六点运行一次,清理周期可以定制。
crontab -e
0 6 * * * /path/to/freemem.sh
CPU 信息 & 系统信息
cat /proc/cpuinfo
lsb_release
LSB是Linux Standard Base的缩写,lsb_release命令用来显示LSB和特定版本的相关信息。
如果使用该命令时不带参数,则默认加上-v参数。
-v 显示版本信息。
-i 显示发行版的id。
-d 显示该发行版的描述信息。
-r 显示当前系统是发行版的具体版本号。
-c 发行版代号。
-a 显示上面的所有信息。
-h 显示帮助信息。
uname
-a或--all:显示全部的信息;
-m或--machine:显示电脑类型;
-n或-nodename:显示在网络上的主机名称;
-r或--release:显示操作系统的发行编号;
-s或--sysname:显示操作系统名称;
-v:显示操作系统的版本;
-p或--processor:输出处理器类型或"unknown";
-i或--hardware-platform:输出硬件平台或"unknown";
-o或--operating-system:输出操作系统名称;
--help:显示帮助;
--version:显示版本信息。
中文 man 手册
系统自带了英文的 man 命令,如果需要中文版可以 sudo apt-get install manpages-zh
安装。
dpkg -L manpages-zh | less
可查看安装位置通常为 /usr/share/man/zh_CN
。
可在环境变量中设置一个新的命令用于查看中文手册,alias cman='man -M /usr/share/man/zh_CN'
。
用户管理
用户增删
- 创建用户,创建用户的家目录以及用户组
useradd -m username - 设置用户登录密码
passwd username - 删除一个用户及其在系统上的目录
userdel -r username - 用户组的增删
groupadd groupname
groupdel groupname
adduser & useradd
adduser: 会自动为创建的用户指定主目录、系统shell版本,会在创建时提示输入用户密码。
useradd:需要使用参数选项指定上述基本设置,如果不使用任何参数,则创建的用户无密码、无主目录、没有指定shell版本。
adduser
在创建用户时会
- 主动调用
/etc/adduser.conf
; - 在创建用户主目录时默认在
/home
下,而且创建为/home/用户名
- 如果主目录已经存在,就不再创建。但是此主目录虽然作为新用户的主目录,而且默认登录时会进入这个目录下,但是这个目录并不是属于新用户。当使用
userdel
删除新用户时,并不会删除这个主目录,因为这个主目录在创建前已经存在且并不属于这个用户。 - 为用户指定shell版本为:
/bin/bash
- 会在创建时提示输入用户密码
adduser username --home dir 指定用户家目录
useradd usrname -d home_dir -m -s /bin/bash
之后通过 `sudo passwd username` 指定密码
-d 只是指定了家目录,如果不存在也不会创建。
-m 表示如果不存在指定的家目录,则创建它,并从 /etc/sket 拷贝初始的配置文件到用户家目录。
登录信息
- who 查看当前登录用户,缺省输出包括用户名、终端类型、登陆日期以及远程主机。
- who /var/log/wtmp
- last 查看用户登录历史
w # 查看活动用户
id <用户名> # 查看指定用户信息
cut -d: -f1 /etc/passwd # 查看系统所有用户
cut -d: -f1 /etc/group # 查看系统所有组
crontab -l # 查看当前用户的计划任务
文件属性和权限
# ls -l
drwxr-xr-x 6 root root 4096 Oct 20 2017 apt
-rw-r--r-- 1 root root 211 Oct 20 2017 hosts
第一个字段
'-' 普通文件,d 文件夹
第二个字段
硬链接数目,hard link
第三第四个字段
用户及用户组
第五个字段
文件或文件夹大小,文件夹会显示为 4096?
剩下的是文件修改时间和文件名
rwx 分别是读写执行权限位,- 表示没有该权限
三组分别为文件所属用户权限,文件所属组权限以及其他用户权限。
chmod 修改权限
chown 修改所属用户
chgrp 修改所属组
程序编译
库文件路径
默认包含 /lib
以及 /usr/lib
。
- 法1:
export LD_LIBRARY_PATH=/your/lib/path:$LD_LIBRARY_PATH
重启或者重新打开一个shell
就失效了。 - 法2:如果只是自己使用的话可以加到自己home目录的
.bashrc
/.bash_profile
中。
~/.bashrc
在每次登陆和每次打开 shell 都读取一次,而~/.bash_profile
只在登陆时读取一次。 - 法3:将自己可能存放库文件的路径都加入到
/etc/ld.so.conf
中,这种添加库路径的效果是永久的。
需要注意的是:这种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以系统是直接读取库列表文件 /etc/ld.so.cache
并从中进行搜索的。
/etc/ld.so.cache
不能直接编辑,它根据 /etc/ld.so.conf
中设置的搜索路径由 /sbin/ldconfig
命令将这些搜索路径下的共享库文件集中在一起而生成。ldconfig
的作用就是将 /etc/ld.so.conf
列出的路径下的库文件缓存到 /etc/ld.so.cache
以供使用。
打开 /etc/ld.so.conf
,可以看到它首先包含了 /etc/ld.so.conf.d
目录下的 *.conf
文件,所以也可以在 /etc/ld.so.conf.d
目录下添加新的 .conf
文件,同样需要运行 sudo ldconfig
使修改生效。
include /etc/ld.so.conf.d/*.conf
absolute/path/of/the/lib
头文件路径
搜索优先级:命令行设置 > 环境变量设置 > 系统默认
-
#include “file.h”
先搜索当前目录
然后搜索-I指定的目录
再搜索gcc的环境变量CPLUS_INCLUDE_PATH(C程序使用的是C_INCLUDE_PATH)
最后搜索gcc的默认的目录
/usr/include
/usr/local/include
/usr/lib/gcc/–host/–version/include -
#include <file.h>
先搜索-I指定的目录
再搜索gcc的环境变量CPLUS_INCLUDE_PATH(C程序使用的是C_INCLUDE_PATH)
最后搜索gcc的默认的目录
/usr/include
/usr/local/include
/usr/lib/gcc/–host/–version/include
设置环境变量,多个路径用 :
隔开
C_INCLUDE_PATH
CPLUS_INCLUDE_PATH
LD_LIBRARY_PATH
LIBRARY_PATH
gcc 还有一个参数:-nostdinc
,它使编译器不在系统缺省的头文件目录里面找头文件,一般和 -I
联合使用,明确限定头文件的位置。
编译选项
略去了一些不太常用的选项。
Usage: gcc [options] file...
Options:
...
(Use '-v --help' to display command line options of sub-processes).
--version Display compiler version information.
-save-temps Do not delete intermediate files.
-save-temps=<arg> Do not delete intermediate files.
-std=<standard> Assume that the input sources are for <standard>.
--sysroot=<directory> Use <directory> as the root directory for headers
and libraries.
-B <directory> Add <directory> to the compiler's search paths.
-v Display the programs invoked by the compiler.
-### Like -v but options quoted and commands not executed.
-E Preprocess only; do not compile, assemble or link.
-S Compile only; do not assemble or link.
-c Compile and assemble, but do not link.
-o <file> Place the output into <file>.
-pie Create a position independent executable.
-shared Create a shared library.
除了直接在源代码中用 #define
来定义宏外,gcc可在命令行中定义宏:-D NAME
(其中NAME为宏名), 也可对宏赋值: -D NAME=value
注意等号两边不能有空格,D与NAME之间有无空格无所谓。由于宏扩展只是一个替换过程,也可以将 value 换成表达式,但要在两边加上双括号: -DNAME="statement"
。特别的,如果 statement 里的 "
要使用 \"
。
编译器也会定义一些宏,可以通过 cpp -dM /dev/null
查看。
文件打包
- tar -cxvf xx.tar.gz xxx
- 查看 shadow 文件 / 目录在不在
tar -ztvf xx.tar.gz | grep ‘shadow’ - 解压指定目录,路径不包含 /
tar -zxvf /root/etc.tar.gz etc/shadow - 解压到目标目录
tar -zxvf /root/etc.tar.gz -C your/path - 建立归档 -c
- 解开归档 -x
- 更新归档文件 -u
- 归档文件追加 -r
- 保留源文件属性 -p
- 例外文件或目录 --exclude
屏幕操作
screen 命令1
有时候我们会遇到远程登录主机执行一个长时间的任务,比如下载一个大文件,如果遇到断连的话就悲剧了,SSH 连接会话消失,重新登录的话也找不到之前的任务了。这个时候 screen
这个工具就能派上用场啦。
screen
是一个终端管理工具,我们可以通过它开启一个新的会话并在其中运行程序,程序不会因为该会话被隐藏或者我们断连而消失,只要我们重新加载对应的 screen
即可找到之前运行的程序。
通常是系统预装好的,如果没有的话安装即可。sudo apt install screen
screen -S session_name
// 默认是打开一个窗口并在其中运行shell,可以在一个会话中打开多个窗口
进入 screen 后一些常用的命令如下
- Ctrl+a c 新建一个窗口
- Ctrl+a " 列出所有的窗口
- Ctrl+a 0 切换到0号窗口
- Ctrl+a A 重命名当前窗口
- Ctrl+a S 将当前区域水平划分为两个
- Ctrl+a | 将当前区域竖直划分为两个
- Ctrl+a tab 切换当前的输入到下一个区域
- Ctrl+a Ctrl+a 在当前区域和上一区域之间切换
- Ctrl+a Q 关闭除了当前区域外的所有区域
- Ctrl+a X 关闭当前区域
从 screen 会话脱离,Ctrl+a
d
。脱离后在 screen 会话中运行的程序还会继续运行。
查看当前有哪些 screen 会话,screen -ls
。
重新连接到 screen 会话, screen -r session_name / screen_num
,使用会话的名字和编号都能重新连接到相应的会话中。
网络
更改主机名
sudo vi /etc/hostname
# change hostname to hm
sudo vi /etc/hosts
# add this line
127.0.1.1 hm
# or use the hostnamectl
# start a new shell, and you will see the difference
ubuntu 16.04
配置 DNS
- 临时方案
sudo vi /etc/resolv.conf
,会在重启后失效。
nameserver xx.xx.xx.xx
nameserver xx.xx.xx.xx
...
search xxx
- 永久方案
/etc/resolvconf/
这个配置目录下主要有三个配置。
- /etc/resolvconf/resolv.conf.d/base:在自动生成的resolv.conf为空时,替换它。
- /etc/resolvconf/resolv.conf.d/head:在自动生成的resolv.conf前添加。
- /etc/resolvconf/resolv.conf.d/tail:在自动生成的resolv.conf后添加。
一般使用的 head 即可。
nameserver 114.114.114.114
nameserver 8.8.8.8
# 更新域名解析
sudo resolvconf -u
# 重启网络
sudo systemctl restart network
# 重启域名解析
sudo /etc/init.d/resolvconf restart
# 查看当前域名解析使用的服务器
systemd-resolve --status
配置网络接口信息 sudo vi /etc/network/interfaces
source /etc/network/interfaces.d/*
auto enp2s0f0
iface enp2s0f0 inet static
address 9.84.99.15
netmask 255.255.0.0
gateway 9.84.0.1
# The loopback network interface
auto lo
iface lo inet loopback
ubuntu 18.04
18.04
采用了新的网络管理工具 Netplan
,实际上这个工具在 17.10
时就被引入了,以前的重启网络服务命令 /etc/init.d/networking restart
或者 services network restrart
会提示为无效命令。新的配置文件为 /etc/netplan/50-cloud-init.yaml
,修改配置以后不用重启网络服务,执行 sudo netplan apply
命令可以让配置直接生效。其配置描述文件采用的是 YAML
语法。
大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
# 表示注释,从这个字符一直到行尾,都会被解析器忽略。
Netplan 官方网址:Netplan,最好的教程就是官方的帮助文档了。
network:
version: 2
renderer: networkd
ethernets:
device name:
dhcp4: yes/no
addresses: [ip/netmask]
gateway4: gateway ip
nameservers:
addresses: [nameserver0, nameserver1]
renderer 是配置文件的渲染器,也就是网络守护进程。服务器通常选 networkd 即可,桌面系统可以选择 NetworkManager。
device name 是待配置设备名
dhcp4 yes / no 代表 ipv4 是否启用 dhcp
addresses 是设备的 ip 地址和子网掩码
gateway4 是网关的 ip 地址
nameserver 是DNS 服务器列表
sudo netplan generate
生成的配置文件在 /run/systemd/network/xxx
sudo netplan try
sudo netplan apply
举几个例子
# if you just want dhcp
network:
version: 2
renderer: networkd
ethernets:
enp0s5:
addresses: []
dhcp4: true
optional: true
在不知道配什么 ip 的一个方法是先配置成 dhcp 模式,然后用 ip a
命令获取分配到的地址,拿这个地址作为静态 ip。
# if you want static ip address
network:
version: 2
renderer: networkd
ethernets:
enp0s5:
dhcp4: false
addresses:
- 192.168.100.10/24
gateway4: 192.168.100.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
search: []
optional: true
# you can add another network devices if have
更复杂的一个例子,gateway
和 routes
是可以替换的,routes
能进行更细粒度的控制,比如发往哪些 ip
地址的数据从哪张网卡走。下面的配置文件有两张网卡,分别是 enp2s0f0
以及 enp2s0f1
。分别接着两个不同的网络,数据一般从 9.81.0.1
这个网关走,但是发往 10.0.0.0/8
的数据从 10.175.104.1
这个网关走,优先级是通过 metric
这个项指定的,数字越小优先级越高。
network:
renderer: networkd
ethernets:
enp2s0f0:
dhcp4: false
#dhcp-identifier: mac
addresses:
- 9.81.252.171/16
#gateway4: 9.81.0.1
routes:
- to: 0.0.0.0/0
via: 9.81.0.1
metric: 30
nameservers:
addresses:
- 10.72.255.100
- 10.72.55.82
- 10.98.48.39
search: [xxx.com]
optional: true
enp2s0f1:
dhcp4: false
addresses:
- 10.175.105.113/22
#gateway4: 10.175.104.1
routes:
- to: 10.0.0.0/8
via: 10.175.104.1
metric: 20
nameservers:
addresses:
- 10.72.255.100
- 10.72.55.82
- 10.98.48.39
search: [xxx.com]
optional: true
网络传输
rsync
http://man.linuxde.net/rsync
rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
scp
TODO
与 Window 共享数据
samba
# install
sudo apt install samba
sudo apt install smbclient
# 启动、停止、重启命令
sudo service smb start
sudo service smb stop
sudo service smb restart
sudo service smbd restart
# 配置文件 /etc/samba/smb.conf
[tags]
comment=xxx
browseable = yes
path = USER/DIR/PATH
writable = yes
guest ok = no
valid users = usrname
# force users = usrname
invalid users =
directory mask = 0755
create mask = 0664
# 增加 samba 用户:
sudo smbpasswd -a usrname
# window 断开samba连接
net use * /del /y
https://linuxize.com/post/how-to-use-linux-screen/ ↩︎