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/ ↩︎

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