Ubuntu 18.04 從頭配置 openVPN MySQL+PAM VPN系統
環境
server:
Distributor ID: Ubuntu
Description: Ubuntu 18.04.1 LTS
Release: 18.04
Codename: bionic
client:
OS 名稱:Microsoft Windows 7 企業版
OS 版本:6.1.7601 Service Pack 1 Build 7601
一、為 root 使用者開啟 ssh 登入
- 修改root密碼
sudo passwd root
- 以其他賬戶登入,通過
nano
編輯配置檔案
su - root
nano /etc/ssh/sshd_config
其中nano為編輯器,與vi類似,但相比於vi更加類似於Windows環境的編輯器,所以更加易用,nano的最後兩行是按鍵提示 - 修改檔案中的如下內容
#permitrootlogin without-password
為
permitrootlogin yes
- 儲存
ctrl + x
- 重啟 sshd
systemctl restart sshd
現在就可以直接用root賬戶登入了
二、配置 openVPN
一、 修改源
- 檢視原始檔
cat /etc/apt/sources.list
- 修改原始檔
- 可以直接覆蓋原始檔
mv 修改好的檔案 要修改的檔案
- 也可以修改內容
nano /etc/apt/sources.list
ctrl + x
儲存
二、 從本地原始碼包安裝 openVPN
- 將壓縮包移動到
/home
目錄下
mv 原始碼包(路徑) /home
- 解壓
tar xvf 包
- 執行 configure 檢查缺少的包
./configure --prefix=/usr
- 根據缺少的包查詢包名
apt-cache search 包名
- 安裝相應的包
apt-get install 包名
直到 3.檢查通過 - 編譯
make
- 安裝
make install
- 複製
openvpn-plugin-auth-pam.so
/etc/openvpn
先用find . | grep
查詢外掛路徑
得到路徑/usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so
再用cp -p /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so /etc/openvpn
- 其中會提示缺少 gcc 和 gcc+ ,Ubuntu中提供了 build-essential 軟體包,安裝了該軟體包,編譯c/c++所需要的軟體包也都會被安裝
apt-get install build-essential
- 另外幾個包
libssl1.0-dev
liblz4-dev
liblzo2-dev
libpam0g-dev
三、 檢查是否安裝成功
ls /usr/sbin
檢視有沒有 openVPN 的選項,有就成功了
三、MySQL 安裝和配置
- 查詢 MySQL 需要的包
apt-cache search mysql
- 安裝兩個包
apt-get install mysql mysql-client mysql-server
- 重要的一步:設定安全策略
mysql_secure_installation
在這裡設定資料庫的 root 賬戶密碼 - 檢視 MySQL 執行狀態
systemctl status mysql
- 設定 MySQL 開機啟動
systemctl enable mysql
附啟動、關閉、重啟、設定開機是否自啟動命令(其他服務也適用):#檢視服務狀態 systemctl status mysql #設定服務開機啟動 `systemctl enable mysql` #設定服務開機不啟動 `systemctl disable mysql` #啟動服務 `systemctl start mysql` #關閉服務 `systemctl stop mysql` #重啟服務 `systemctl restart mysql`
- 登入 MySQL
mysql -uroot -p12345678
- 建立 openvpn 資料庫
-- 新增vpn使用者,允許訪問資料庫 GRANT ALL ON openvpn.* TO [email protected]'%' IDENTIFIED BY 'vpn123456' WITH GRANT OPTION; GRANT ALL ON openvpn.* TO [email protected]'localhost' IDENTIFIED BY 'vpn123456' WITH GRANT OPTION; -- 更新sql資料庫的許可權設定,這步很重要,少了會導致測試認證失敗 flush privileges; -- 建立資料庫openvpn CREATE DATABASE IF NOT EXISTS openvpn DEFAULT CHARSET utf8; -- 切換資料庫 USE openvpn; -- 建立使用者資料表 CREATE TABLE IF NOT EXISTS user ( username char(32) COLLATE utf8_unicode_ci NOT NULL, password char(128) COLLATE utf8_unicode_ci NOT NULL, active int(10) NOT NULL DEFAULT 1, creation timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, expired_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, name varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, email char(128) COLLATE utf8_unicode_ci DEFAULT NULL, note text COLLATE utf8_unicode_ci NULL, quota_cycle int(10) NOT NULL DEFAULT 30, quota_bytes bigint(20) NOT NULL DEFAULT 10737418240, enabled int(10) NOT NULL DEFAULT 1, PRIMARY KEY (username), KEY idx_active (active), KEY idx_enabled (enabled) ) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- 建立日誌資料表 CREATE TABLE IF NOT EXISTS log ( username varchar(32) COLLATE utf8_unicode_ci NOT NULL, start_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, end_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, trusted_port int(10) DEFAULT NULL, protocol varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL, remote_ip varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL, bytes_received bigint(20) DEFAULT 0, bytes_send bigint(20) DEFAULT 0, status int(10) NOT NULL DEFAULT 1, KEY idx_username (username), KEY idx_start_time (start_time), key idx_end_time (end_time) ) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- 新增測試使用者 INSERT INTO user(name,username, password, expired_time) VALUES('test','test', ENCRYPT('123456'), DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 30 DAY));
四、安裝配置 pam_mysql
一、安裝和配置
- 更新
apt-get update
- 搜尋
apt-cache search pam
,apt-cache search libpam_mysql
安裝apt-get install libpam_mysql
- 搜尋
apt-cache search pam-krb5
安裝apt-get install libpam-krb5
- 搜尋
apt-cache search sasl
安裝apt-get install sasl2-bin
- 設定saslauthd開機自啟
systemctl enable saslauthd
- 建立
/etc/pam.d/openvpn
檔案
cd /etv/pam.d
touch openvpn
nano ./openvpn
注意:檔案中的路徑需要替換auth required /lib/x86_64-linux-gnu/security/pam_mysql.so user=vpn passwd=vpn123456 host=localhost db=openvpn table=user usercolumn=username passwdcolumn=password where=active=1 sqllog=0 crypt=1 account required /lib/x86_64-linux-gnu/security/pam_mysql.so user=vpn passwd=vpn123456 host=localhost db=openvpn table=user usercolumn=username passwdcolumn=password where=active=1 sqllog=0 crypt=1 #crypt(0) -- Used to decide to use MySQL's PASSWORD() function or crypt() #0 = No encryption. Passwords in database in plaintext. NOT recommended! #1 = Use crypt #2 = Use MySQL PASSWORD() function
先在根目錄下查詢find . | grep pam_mysql.so
將得到路徑替換檔案中的 - 測試認證
#驗證本地登入,使用者名稱和密碼是登入 Ubuntu 使用的使用者名稱和密碼 testsaslauthd -u user -p pwd -s sshd #驗證openvpn,使用者名稱密碼是資料庫openvpn.user中的使用者名稱和密碼(test,123456) testsaslauthd -u username -p password -s openvpn #成功會顯示: 0: OK "Success."</code>
二、可能出現的問題
-
用
testsaslauthd -u test -p 123456 -s openvpn
測試認證時顯示:connect() : No such file or directory
-
用
systemctl status saslauthd
檢視saslauthd執行狀態如下顯示active(exited)
:saslauthd.service - LSB: saslauthd startup script Loaded: loaded (/etc/init.d/saslauthd; generated) Active: active (exited) since Thu 2018-11-0114:58:31 UTC; 43s ago Docs: man:systemd-sysv-generator(8)
-
解決方法
首先可能是未建立/etc/pam.d/openvpn
檔案
其次可能是/etc/default/saslauthd
檔案中的START=no
沒有修改為yes
# Settings for saslauthd daemon # Please read /usr/share/doc/sasl2-bin/README.Debian for details. # # Should saslauthd run automatically on startup? (default: no) START=no # Description of this saslauthd instance. Recommended. # (suggestion: SASL Authentication Daemon) DESC="SASL Authentication Daemon" # Short name of this saslauthd instance. Strongly recommended. # (suggestion: saslauthd) NAME="saslauthd" # Which authentication mechanisms should saslauthd use? (default: pam) #
最後
systemctl restart saslauthd
重啟
五、在 Windows 端生成證書
- 進入openVPN安裝目錄
cd E:\OpenVPN\easy-rsa
E:
dir
- 複製檔案
copy vars.bat.sample vars.bat
- 執行檔案
vars.bat
vars.bat
- 執行檔案
clean-all.bat
clean-all.bat
- 執行檔案
build-ca.bat
build-ca.bat
- 執行檔案
build-key-server.bat openvpn1.bat
build-key-server.bat openvpn1.bat
- 執行檔案
build-key.bat szq
build-key.bat szq
- 執行檔案
build-key.bat szq1
build-key.bat szq1
7.和 8.生成了兩個客戶端分別是 szq 和 szq1 - 執行檔案
build-dh.bat
build-dh.bat
生成的證書在keys
資料夾內 - 用 winscp 將 keys 資料夾複製到伺服器的
etc/openvpn/easy-rsa
下
六、建立/etc/openvpn/server.conf檔案
一、 server.conf 檔案內容如下
port 1194 #指定埠
proto tcp #指定採用的傳輸協議,可以選擇tcp或udp
dev tap #指定建立的通訊隧道型別,可選tun或tap
#tap模式也就是橋接模式,通過軟體在系統中模擬出一個tap裝置,該裝置是一個二層裝置,同時支援鏈路層協議。
#tun模式也就是路由模式,通過軟體在系統中模擬出一個tun路由,tun是ip層的點對點協議。
ca /etc/openvpn/easy-rsa/keys/ca.crt #ca證書
cert /etc/openvpn/easy-rsa/keys/openvpn1.crt #伺服器公鑰
key /etc/openvpn/easy-rsa/keys/openvpn1.key #伺服器私鑰
dh /etc/openvpn/easy-rsa/keys/dh2048.pem #指定迪菲赫爾曼引數的檔案路徑
local 10.6.0.103 #本機IP,這是一個內網IP,不過在路由上已經做了IP的對映到一個外網ip
server 10.8.0.0 255.255.255.0 #指定虛擬區域網佔用的IP地址段和子網掩碼,此處配置的伺服器自身佔用10.8.0.1。
#設定管理,通過此埠管理管理正在連線的使用者
management 10.6.0.103 1195
#定義openvpn執行時使用的使用者及使用者組。
user nobody
group nogroup
keepalive 20 120 # 保持連線,每 20 秒 ping 一次,若是 120 秒未收到封包,即認為 client 斷線
#mysql 認證,如不需要可註釋掉
#plugin /etc/openvpn/openvpn-auth-pam.so /usr/sbin/openvpn
plugin /etc/openvpn/openvpn-plugin-auth-pam.so openvpn
#client-cert-not-required #不請求客戶的CA證書,使用User/Pass驗證
username-as-common-name #使用客戶提供的UserName作為Common Name
;金鑰不用重協商,客戶端也需要設定,否則iOS下,會出現一段時間後自動斷開的情況
reneg-sec 0
#伺服器自動給客戶端分配IP後,客戶端下次連線時,仍然採用上次的IP地址(第一次分配的IP儲存在ipp.txt中,下一次分配其中儲存的IP)
ifconfig-pool-persist ipp.txt
#push "redirect-gateway def1 bypass-dhcp"
#push "dhcp-option DNS 8.8.8.8"
#push "dhcp-option DNS 8.8.4.4"
#push "dhcp-option DNS 192.168.1.1"
#讓所有客戶端都增加到10.6.0.0/24
push "route 10.6.0.0 255.255.255.0"
client-to-client #允許客戶端與客戶端相連線,預設情況下客戶端只能與伺服器相連線
comp-lzo #開啟VPN連線壓縮,如果伺服器端開啟,客戶端也必須開啟
persist-key #通過keepalive檢測超時後,重新啟動VPN,不重新讀取keys,保留第一次使用的keys。
persist-tun #通過keepalive檢測超時後,重新啟動VPN,一直保持tun或者tap裝置是linkup的。否則網路連線,會先linkdown然後再linkup。
verb 3 #指定日誌檔案的記錄詳細級別,可選0-9,等級越高日誌內容越詳細
max-clients 1000 #最多允許連線1000個客戶端
;script-security 3 #OpenVPN 2.1需要'--script-security 2'或更高版本來呼叫使用者定義的指令碼或可執行檔案
log /etc/openvpn/logs/openvpn.log #指定記錄OpenVPN的日誌檔案路徑
log-append /etc/openvpn/logs/openvpn.log
status /etc/openvpn/logs/openvpn-status.log #指定記錄OpenVPN狀態的日誌檔案路徑
#設定連線和斷開指令碼,以便統計流量資訊 重要
#client-connect /etc/openvpn/connect.sh
#client-disconnect /etc/openvpn/disconnect.sh
二、 檔案內容如下
#!/bin/sh
DB='openvpn'
DBADMIN='vpn'
DBPASSWD='vpn123456'
mysql -u$DBADMIN -p$DBPASSWD -e "INSERT INTO log(username,start_time,trusted_port,protocol,remote_ip,status) VALUES('$common_name',now(),'$trusted_port’,'$proto_1','$ifconfig_pool_remote_ip',1)" $DB
三、 檔案內容如下
#!/bin/sh
DB='openvpn'
DBADMIN='vpn'
DBPASSWD='vpn123456'
#插入日誌
mysql -u$DBADMIN -p$DBPASSWD -e "
UPDATE log SET end_time=now(),bytes_received=$bytes_received,bytes_send=$bytes_send,status=0 WHERE remote_ip='$ifconfig_pool_remote_ip' AND username='$common_name' AND status=1
" $DB
#如果流量超出,則鎖定使用者
mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET active=0 WHERE user.username IN (SELECT username FROM (SELECT log.username AS username, quota_bytes FROM user, log WHERE log.username='$common_name' AND log.username=user.username AND log.status=0 AND TO_DAYS(NOW())-TO_DAYS(start_time)<=quota_cycle GROUP BY log.username HAVING SUM(bytes_received)+SUM(bytes_sent)>=quota_bytes) AS u);" $DB
#如果過期時間超出,則鎖定使用者
mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET active=0 WHERE username='$common_name' AND UNIX_TIMESTAMP(now())>UNIX_TIMESTAMP(expired_time);" $DB
七、 設定轉發
一、 開啟路由核心轉發
圖中紅框內容改為綠框內容
為了讀取sysctl.conf檔案並且讓調整後設置對當前系統的session生效,鍵入如下命令:
sysctl -p
二、 設定防火牆的埠轉發
- 先檢視網絡卡資訊
ifconfig -a
顯示全部介面資訊
紅框 ens160 表示第一塊網絡卡
- 輸入命令設定轉發
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ens160 -j MASQUERADE
向 NAT 表的 POSTROUTING 鏈條列尾新增一條規則,規則的具體內容是:
所有來自10.8.0.0/24、從ens160出去的資料包地址都偽裝成指定IP輸出,SNAT就是改變轉發資料包的源地址 - iptables 命令規則
iptables [-t 表名] 選項 [鏈名] [條件] [-j 控制型別]
-P 設定預設策略:iptables -P INPUT (DROP|ACCEPT)
-F 清空規則鏈
-L 檢視規則鏈(列出已有規則)(-n 顯示IP數字 預設會反向解析成域名)
-A 在規則鏈末尾加新規則
-I INPUT/… num 在規則鏈頭部加入新規則
-D INPUT/… num 刪除某一規則
-s 匹配來源地址IP/MASK(!取反)
-d 匹配目標地址
-i 網絡卡名 匹配從這塊網絡卡流入的資料
-o 網絡卡名 匹配從這塊網絡卡流出的資料
-p 匹配協議(tcp,udp,icmp)
–dport num 匹配目標埠
–sport num 匹配來源埠
-i eth0
匹配從網路介面 eth0 進來
-o eth0
匹配從網路介面 eth0 出去
DNAT
:目標地址轉換
SNAT
:原地址轉換
-j SNAT --to-source
-j DNAT --to-destination
-j MASQUERADE
#等價於-j SNAT --to-source
一起寫。
八、 新增定時任務定時統計流量、超過流量或已過期的使用者將踢出連線
- 新增/etc/openvpn/openvpn_flow_calc.sh 檔案,主要是通過分析 openvpn-status.log 檔案來即時統計使用者流量資訊
#!/bin/sh NAME_TAG=("OpenVPN CLIENT LIST" "ROUTING TABLE" "GLOBAL STATS" "END") LOG_FILE="/etc/openvpn/openvpn-status.log" DB='openvpn' DBADMIN='vpn' DBPASSWD='vpn123456' flow_info_index=0 function IsFlowInfoStatus() { if [ "${1}" == "${NAME_TAG[0]}" ] then #進入客戶端列表,返回[1] flow_info_index=1 return 1 elif [ "${1}" == "${NAME_TAG[1]}" ] || [ "${1}" == "${NAME_TAG[2]}" ] || [ "${1}" == "${NAME_TAG[3]}" ] then #進入其他資訊,返回結束[0] flow_info_index=0 return 0 fi if [ ${flow_info_index} -lt 1 ] then #沒有進入客戶端列表,返回[0] return 0 fi let "flow_info_index+=1" if [ ${flow_info_index} -lt 4 ] then #進入客戶端列表,還沒有進入IP列表,返回[1] return 1 fi #進入到IP列表,返回[2] return 2; } flow_infos=("") function GetFlowInfo() { OLD_IFS=${IFS} IFS=$2 unset flow_infos flow_infos=(${1}) IFS=${OLD_IFS} #echo "flow_infos: ${#flow_infos[@]}" } function StringSplit() { local OLD_IFS=${IFS} IFS=$2 local array=(${1}) IFS=${OLD_IFS} echo ${array[@]} } function UpdateUserFlowToDB() { local common_name=${flow_infos[0]} local bytes_received=${flow_infos[2]} local bytes_sent=${flow_infos[3]} #echo "username: $username received: $received sents: $sents" local ip_port=(`StringSplit ${flow_infos[1]} ':'`) local trusted_ip=${ip_port[0]} local trusted_port=${ip_port[1]} #echo "ip: $trusted_ip port: $trusted_port" #更新日誌 mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE log SET end_time=now(),bytes_received=$bytes_received,bytes_send=$bytes_send WHERE trusted_port=$trusted_port AND username='$common_name' AND status=1" $DB #統計流量 mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET active=0 WHERE user.username IN (SELECT username FROM (SELECT log.username AS username, quota_bytes FROM user, log WHERE log.username='$common_name' AND log.username=user.username AND TO_DAYS(NOW())-TO_DAYS(start_time)<=quota_cycle GROUP BY log.username HAVING SUM(bytes_received)+SUM(bytes_sent)>=quota_bytes) AS u);" $DB #判斷使用者是否被禁用或過期 mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET active=0 WHERE username='$common_name' AND (enabled=0 or UNIX_TIMESTAMP(now())>UNIX_TIMESTAMP(expired_time));" $DB local SQL="SELECT COUNT(*) FROM user WHERE username='$common_name' AND active=0" local COUNT=($(mysql -u$DBADMIN -p$DBPASSWD -e "$SQL" $DB)) if [ ${COUNT[1]} -ne 0 ] then (sleep 1 echo kill $common_name sleep 1)|telnet localhost 7505 fi } #判斷使用者是否過期 #mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SET enabled=0 WHERE UNIX_TIMESTAMP(now())>UNIX_TIMESTAMP(expired_time);" $DB while read LOG_FILE; do IsFlowInfoStatus "${LOG_FILE}" status=$? #echo "output: ${status}" if [ ${status} -eq 2 ] then GetFlowInfo "${LOG_FILE}" "," if [ ${#flow_infos[@]} -ne 5 ] then continue fi UpdateUserFlowToDB fi done < ${LOG_FILE}
- 安裝 incron
#搜尋 [email protected]:~# apt-cache search incron #安裝 [email protected]:~# apt-get install incron
- 新增/etc/incron.d/openvpn 檔案,每分鐘執行指令碼,檔案內容如下:
* * * * * root /etc/openvpn/openvpn_flow_calc.sh
九、 測試服務
- 啟動openvpn服務
openvpn --daemon --config /etc/openvpn/server.conf
- 檢視服務是否啟動
ps -ef | grep openvpn
如圖即啟動成功
- 如果啟動不成功檢視日誌排錯
cat /etc/openvpn/logs/openvpn.log
十、 配置客戶端
一、 設定網絡卡
二、 配置檔案
client #指定當前VPN是客戶端
dev tap #必須與伺服器端的保持一致
proto tcp #必須與伺服器端的保持一致
remote 10.6.0.103 1194 #設定Server的IP地址和埠,這個地方需要嚴格和Server端保持一致。
resolv-retry infinite #斷線自動重新連線
nobind #不繫結特定的本地埠號
#route 10.172.192.0 255.255.255.0
persist-key
persist-tun
ca ca.crt #ca證書
cert szq.crt #客戶端公鑰
key szq.key #客戶端私鑰
#remote-cert-tls server
comp-lzo #與伺服器保持一致
verb 4 #指定日誌檔案的記錄詳細級別,可選0-9,等級越高日誌內容越詳細
auth-user-pass #詢問使用者名稱和密碼
<ca>
#複製ca.crt的內容
</ca>
<cert>
複製szq.crt的內容
</cert>
<key>
複製szq.key的內容
</key>
十、 連線客戶端時出現問題
一、 在開啟使用者連線日誌記錄後
-
報錯
./xx.sh: Permission denied
需要修改 nobody 的許可權:
nano /etc/sudoers
編輯 sudoers 檔案,在紅框的 root 下一行新增nobody ALL=(ALL) NOPASSWD:ALL
-
日誌報錯
WARNING: External program may not be called unless '--script-security 2' or higher is enabled. See --help text or man page for detailed info.
在server.conf中新增script-security 3
十一、 使用者訪問許可權控制
每個客戶端分配不同的IP地址,然後利用 iptables 防火牆對不同的 IP 地址進行控制;
- 為客戶端分配IP段:
server 10.8.2.0 255.255.255.0
- 給指定客戶端分配地址,根據名稱獲取指定客戶端
ifconfig-push 10.8.2.5 10.8.2.6
- 來自10.8.2.0的資料包只有訪問10.66.4.12時才能通過:
iptables -A FORWARD -i tun0 -s 10.8.2.0/24 -d 10.66.4.12 -j ACCEPT
N、需要掌握的命令
一、 cmd 命令
- 檢視本機路由
route print
- 複製
copy D:\原始目錄\檔案.字尾 E:\新目錄\檔案.字尾
如果有同名檔案,需要覆蓋,那就在copy
後加上/f這個引數,是一個斜槓加字母F。如果名稱中有空格,請把路徑用英文雙引號括起來。 - 顯示d盤目錄列表
dir d:\
二、 MySQL 命令
- 更新資料表
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause];
三、 Ubuntu 命令
- 檢視端口占用情況
netstat -an
顯示簡要資訊netstat -i
- 啟動openVPN服務
openvpn --daemon --config /etc/openvpn/server.conf
- 檢視所有介面資訊
ifconfig -a
顯示簡要資訊ifconfig -s
ifconfig 網路裝置 引數
可以顯示、修改、增加、刪除網路裝置的資訊,比如啟動指定網絡卡、配置IP地址、啟動關閉網路協議等 - 所有日誌都在
/var/log
目錄下
ls /var/log
包括系統日誌(syslog),軟體包管理器日誌(dpkg.log),身份驗證日誌(auth.log)等
- 複製檔案
cp -p 原始檔或目錄 目標檔案或目錄
- a 通常在拷貝目錄時使用。它保留連結、檔案屬性,並遞迴地拷貝目錄
- d 拷貝時保留連結
- f 刪除已經存在的目標檔案而不提示
- i 在覆蓋目標檔案之前將給出提示要求使用者確認
- p 此時cp除複製原始檔的內容外,還將把其修改時間和訪問許可權也複製到新檔案中
- r 若給出的原始檔是一目錄檔案,此時cp將遞迴複製該目錄下所有的子目錄和檔案。此時目標檔案必須為一個目錄名。
- l 不作拷貝,只是連結檔案。 - 查詢檔案
find . | grep 檔名
注意:查詢檔案之前要先進入要查詢的目錄,如果沒有就進入根目錄cd /
- 檢視命令
man xx
- 檢視所有執行的程式
ps -ef
-e 顯示所有程序,環境變數
-f 全格式
-h 不顯示標題
-l 長格式
一般配合grep使用ps -ef | grep 程序名
- 終止程序
kill -9 程序ID
根據程序ID殺死程序,-9是強制終止退出killall 程序名
通過程式的名字,直接殺死所有程序,也可以使用-9強制殺死
chmod 777 xx.sh
- Ubuntu中,chmod 755代表使用者對該檔案擁有讀,寫,執行的許可權,同組其他人員擁有執行和讀的許可權,沒有寫的許可權,其他使用者的許可權和同組人員許可權一樣。
- chmod 777代表user,group和others 都有讀寫和可執行許可權。
- 在終端輸入ls -al,可以看到如: -rwx-r–r– (一共10個引數)
第一個跟引數跟chmod無關
2-4引數:屬於user
5-7引數:屬於group
8-10引數:屬於others
接下來就簡單了:r=>可讀 | w=>可寫 | x=>可執行
r=4 w=2 x=1
755就代表 rwx-xr-xr,而777代表rwx-rwx-rwx