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 指定用戶家目錄
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
更復雜的一個例子,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
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
https://linuxize.com/post/how-to-use-linux-screen/ ↩︎