Linux 基操

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

实际上更常用的是上面命令的集成工具,它们是 yumapt

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 镜像源

  1. sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
  2. sudo vim /etc/apt/sources.list
  3. Add new source address
  4. 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 指定用户家目录
adduser username --conf conf_file 指定 configuration 文件

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 # 查看当前用户的计划任务

用户和密码

useradd
adduser

# change password
passwd usrname

cat /etc/passwd
cat /etc/group


# 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,使用会话的名字和编号都能重新连接到相应的会话中。
在这里插入图片描述

网络

ubuntu 16.04

配置 DNS sudo vi /etc/resolv.conf

nameserver xx.xx.xx.xx
nameserver xx.xx.xx.xx
...
search xxx

配置网络接口信息 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

重启网络 sudo systemctl restart network

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

更复杂的一个例子,gatewayroutes 是可以替换的,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

Windows 操作

samba

sudo apt-get install samba
sudo apt-get install smbclient

启动、停止、重启命令
sudo /etc/init.d/samba start
sudo /etc/init.d/samba stop
sudo /etc/init.d/samba 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
directory mask = 0755
create mask = 0664

sudo smbpasswd -a usrname


  1. https://linuxize.com/post/how-to-use-linux-screen/ ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章