大資料學習之_01_Linux學習_02_組管理和許可權管理+定時任務排程+linux磁碟分割槽、掛載+linux的網路配...
10 組管理和許可權管理
10.1 Linux組的基本介紹
在linux中的每個使用者必須屬於一個組,不能獨立於組外。在linux中每個檔案有所有者、所在組、其它組的概念。
1) 所有者
2) 所在組
3) 其它組
4) 改變使用者所在的組
示意圖如下:

10.2 檔案/目錄的所有者
- 一般為檔案的建立者,誰建立了該檔案,就自然的成為該檔案的所有者。
-
檢視檔案的所有者
指令:ls –ahl
應用例項:建立一個組police,再建立一個使用者tom,將tom放在police組,然後使用tom來建立一個檔案ok.txt。【參考補充示例】
-
修改檔案的所有者
指令:chown 使用者名稱 檔名
應用案例:使用root使用者建立一個檔案apple.txt,然後將該檔案的所有者修改成tom。
補充示例:
示例:增加使用者時直接指定使用者的家目錄和使用者組
建立一個使用者,名字叫abc,主目錄是/home/abc/目錄,屬於aabb這個組。
useradd -d /home/abc/ abc -m -g aabb
-d的意思是指定使用者的主目錄
-m的意思是,如果主目錄不存在,那麼就自動建立這個目錄
-g的意思是指定該使用者屬於哪個組
注意1:我們需要先建立組aabb。命令:groupadd aabb
注意2:我們新增使用者後,要及時通過root使用者設定新增使用者的密碼。這是一個好習慣!
10.3 檔案/目錄的所在組
- 當某個使用者建立了一個檔案後,預設情況下,這個檔案的所在組就是該使用者所在的組。
-
檢視檔案/目錄所在組
指令:ls –ahl
應用例項:同上。 -
修改檔案所在的組
指令:chgrp 組名 檔名
應用例項:使用root使用者建立檔案orange.txt,看看當前這個檔案屬於哪個組【root】,然後將這個檔案所在組,修改到police組。
-
其他組
除檔案的所有者和所在組的使用者外,系統的其它使用者都是檔案的其它組。 -
改變使用者所在組
在新增使用者時,可以指定將該使用者新增到哪個組中,同樣的用root的管理許可權可以改變某個使用者所在的組。【參考補充示例】
指令:
1) usermod –g 組名 使用者名稱
2) usermod –d 目錄名 使用者名稱 (功能描述:改變該使用者登陸的初始目錄)
應用例項:建立一個土匪組(bandit)將tom這個使用者從原來所在的police組,修改到bandit(土匪)組,命令usermod -g bandit tom
10.4 許可權的基本介紹

10.5 rwx許可權詳解
rwx許可權詳解

檔案及目錄許可權實際案例

10.6 修改許可權指令-chmod
第一種方式:+ 、-、= 變更許可權

演示案例如下截圖:

第二種方式:通過數字變更許可權

10.7 修改檔案所有者-chown

10.8 修改檔案所在組-chgrp

10.9 最佳實踐-警察和土匪遊戲

(1)建立組
(2)建立使用者(好習慣,建立使用者後要設定密碼)

(3)jack 建立一個檔案,自己可以讀寫,本組人可以讀,其它組沒人任何許可權

(4)jack 可以修改該檔案,本組人可以讀寫,讓其它組人可以讀

(5)xh 投靠警察,看看是否可以讀寫(使用root使用者)

11 定時任務排程
11.1 crond任務排程
-
說明:
crontab 進行定時任務的設定。 -
概述:
任務排程:是指系統在某個時間執行的特定的命令或程式。
任務排程分類:
- 1) 系統工作:有些重要的工作必須周而復始地執行。如病毒掃描等。
- 2) 個別使用者工作:個別使用者可能希望執行某些程式。比如對mysql資料庫的備份。
-
基本語法:
crontab [選項] -
常用選項
-
快速入門:
設定任務排程檔案:/etc/crontab
設定個人任務排程。執行crontab –e
命令。
接著輸入任務到排程檔案,如:*/1 * * * * ls –l /etc/ > /tmp/to.txt
意思說:每小時的每分鐘執行ls –l /etc/ > /tmp/to.txt
命令 -
引數細節說明:
5個佔位符的說明:
特殊符號的說明:
特定時間執行任務案例:
-
應用例項:
案例1:每隔1分鐘,就將當前的日期資訊,追加到/tmp/mydate.log 檔案中
步驟:
1) 編寫一個檔案/home/mytask1.sh
,檔案內容是:date >> /tmp/mydate.log
2) 給檔案/home/mytask1.sh
一個可以執行的許可權,命令chmod 744 /home/mytask1.sh
3) 設定個人任務排程。執行crontab –e
命令
4) 輸入任務到排程檔案,任務內容:*/1 * * * * /home/mytask1.sh
5) 檢視檔案/tmp/mydate.log,成功!
案例2:每隔1分鐘,將當前日期和日曆資訊,都追加到/tmp/mycal.log 檔案中
步驟:
1) 編寫一個檔案/home/mytask2.sh
,檔案內容是:date >> /tmp/mycal.log
和cal >> /tmp/mycal.log
2) 給檔案/home/mytask2.sh
一個可以執行的許可權,命令chmod 744 /home/mytask2.sh
3) 設定個人任務排程。執行crontab –e
命令
4) 輸入任務到排程檔案,任務內容:*/1 * * * * /home/mytask2.sh
5) 檢視檔案/tmp/mycal.log,成功!
截圖同上!不在贅圖!
案例3:每天凌晨2:00將mysql資料庫testdb,備份到檔案/tmp/mydb.bak中。
步驟:
1) 編寫一個檔案/home/mytask3.sh
,檔案內容是:/usr/local/mysql/bin/mysqldump -uroot -proot testdb > /tmp/mydb.bak
2) 給檔案/home/mytask3.sh
一個可以執行的許可權,命令chmod 744 /home/mytask3.sh
3) 設定個人任務排程。執行crontab –e
命令
4) 輸入任務到排程檔案,任務內容:0 2 * * * /home/mytask3.sh
5) 檢視檔案/tmp/mydb.bak,成功!
截圖同上!不在贅圖! -
crond 相關指令:
1) conrtab –r:終止任務排程(刪除所有任務排程)。
2) crontab –l:列出當前有那些任務排程。
3) service crond restart [重啟任務排程]
-
拓展:比較難的shell指令碼的編寫
shell指令碼檔案內容:
#!/bin/bash #備份路徑 BACKUP=/data/backup/sql/dy #當前時間 DATETIME=$(date +%Y-%m-%d_%H%M%S) echo "===備份開始===" echo "備份檔案存放於${BACKUP}/$DATETIME.tar.gz" #資料庫地址 HOST=localhost #資料庫使用者名稱 DB_USER=root #資料庫密碼 DB_PW=Ces123456 #建立備份目錄 [ ! -d "${BACKUP}/$DATETIME" ] && mkdir -p "${BACKUP}/$DATETIME" #後臺系統資料庫 DATABASE=dy_backgroundms mysqldump -u${DB_USER} -p${DB_PW} --host=$HOST -q -R --databases $DATABASE | gzip > ${BACKUP}/$DATETIME/$DATABASE.sql.gz #投入品監管資料庫 DATABASE=dy_firip mysqldump -u${DB_USER} -p${DB_PW} --host=$HOST -q -R --databases $DATABASE | gzip > ${BACKUP}/$DATETIME/$DATABASE.sql.gz #壓縮成tar.gz包 cd $BACKUP tar -zcvf $DATETIME.tar.gz $DATETIME #刪除備份目錄 rm -rf ${BACKUP}/$DATETIME #刪除30天前備份的資料 find $BACKUP -mtime +30 -name "*.tar.gz" -exec rm -rf {} \; echo "===備份成功===" 注:find:linux的查詢命令,使用者查詢指定條件的檔案。 -mtime:標準語句寫法。 +10:查詢10天前的檔案,這裡用數字代表天數,+30表示查詢30天前的檔案。 "*.*":希望查詢的資料型別,"*.jpg"表示查詢副檔名為jpg的所有檔案,"*"表示查詢所有檔案,這個可以靈活運用,舉一反三 -exec:固定寫法。 rm -rf:強制刪除檔案,包括目錄。 {} \; :固定寫法,一對大括號+空格+\;
12 linux磁碟分割槽、掛載
12.1 分割槽的基本知識
分割槽的方式(知道即可):

Windows下的磁碟分割槽:

12.2 Linux分割槽
原理介紹:

Linux系統分割槽的原理示意圖:

硬碟說明:

檢視所有裝置(光碟機/media,u盤,硬碟)掛載情況
命令:lsblk 或者 lsblk -f 【簡記:老師不離開】

12.3 掛載的經典案例
-
說明:
下面我們以增加一塊新的虛擬硬碟2G 為例來熟悉下磁碟的相關指令和深入理解磁碟分割槽、掛載、解除安裝的概念。
圖同上【Linux系統分割槽的原理示意圖】。 -
如何增加一塊硬碟,步驟如下:
1) 虛擬機器新增硬碟
2) 分割槽fdisk /dev/sdb
3) 格式化mkfs -t ext4 /dev/sdb1
4) 掛載mount /dev/sdb1 /home/newdisk/
解除安裝umount /dev/sdb1 或者 umount /home/newdisk/
5) 設定可以自動掛載vim /etc/fstab
,新增完成後,執行mount -a
即刻生效。 -
步驟一:虛擬機器新增硬碟
先選中一臺虛擬機器,然後右鍵該虛擬機器,點選【設定】,然後在硬體列表裡選中【硬碟(SCSI)】,點選【新增(A)】,然後一路【下一步】,中間只有【選擇磁碟大小】的地方需要修改,直到完成。然後重啟系統(才能識別)!
重新檢視所有裝置(光碟機/media,u盤,硬碟)掛載情況
-
步驟二:分割槽命令:
fdisk /dev/sdb
-
開始對/sdb分割槽:
- m 顯示命令列表
- p 顯示磁碟分割槽,同:fdisk -1
- n 新增分割槽
- d 刪除分割槽
- w 寫入並退出
-
說明:開始分割槽後輸入n,新增分割槽,然後選擇p,分割槽型別為主分割槽。主分割槽編號:輸入1後回車,是否預設剩餘全部空間,回車。最後輸入w寫入分割槽並退出,若不儲存退出輸入q。
-
開始對/sdb分割槽:
-
步驟三:格式化磁碟
格式化命令:mkfs -t ext4 /dev/sdb1
其中ext4是格式化後的檔案型別
-
步驟四:掛載,先建立一個目錄/home/newdisk/,然後將一個分割槽與一個目錄聯絡起來,掛載命令:
mount 裝置名稱 掛載目錄
注意: 用命令列掛載重啟後會失效!
-
步驟五:永久掛載:通過修改/etc/fstab檔案實現掛載,新增完成後,執行
mount -a
即刻生效。
vim /etc/fstab
12.4 查詢系統整體磁碟使用情況
-
基本語法:
df -h -
應用例項:
查詢系統整體磁碟使用情況。
12.5 查詢指定目錄的磁碟佔用情況
-
基本語法:
du -h/目錄 -
查詢指定目錄的磁碟佔用情況,預設為當前目錄
-s 指定目錄佔用大小彙總
-h 帶計量單位
-a 含檔案
--max-depth=1子目錄深度
-c 列出明細的同時,增加彙總值 -
應用例項:
查詢/usr/目錄
的磁碟佔用情況,深度為1
命令:du -ach --max-depth=1 /usr/
12.6 磁碟情況-工作中實用指令
-
1、統計/home/資料夾下檔案的個數
ls –l /home/ | grep “^-” | wc -l
-
2、統計/home/資料夾下目錄的個數
ls –l /home/ | grep “^d” | wc -l
-
3、統計/home/資料夾下檔案的個數,包括子資料夾裡的
ls –lR /home/ | grep “^-” | wc -l
-
4、統計/home/資料夾下目錄的個數,包括子資料夾裡的
ls –lR /home/ | grep “^d” | wc -l
-
5、以樹狀顯示home目錄結構
tree /home/
[沒有tree指令咋辦,使用yum來安裝]
效果:
13 linux的網路配置
13.1 linux的網路配置的原理圖
目前我們的網路配置採用的是NAT

13.2 檢視網路IP和閘道器
檢視VMware虛擬網路編輯器

修改VMnet8的ip地址

檢視虛擬機器的閘道器

檢視windows環境的中VMnet8網路配置 (ipconfig指令方式和圖形化介面方式)
ipconfig指令方式

圖形化介面方式

使用ping,測試主機之間網路連通性
Linux ping Windows
Windows ping Linux
13.3 linux網路環境配置
13.2.1 第一種方法:自動獲取ip地址

勾選【自動連線(A)】即可

說明
登陸後,通過介面來設定自動獲取ip。
特點
1) 配置比較簡單。
2) 每次啟動linux後,分配的ip地址可能不一樣。不適合做伺服器。
13.3.2 第二種方法:配置固定的ip地址
-
方式一:
通過影象化介面進行操作,系統 -> 首選項 -> 網路連線 -> 選中【System eth0】-> 編輯
此種方式,不需要重啟網路服務或者重啟虛擬機器,因為我們點選【應用】的本質就是重啟網路服務!
-
方式二:
直接修改配置檔案來指定IP,並可以連線到外網(程式設計師推薦),
編輯
vim /etc/sysconfig/network-scripts/ifcfg-eth0
(原裝的虛擬機器)或者
vim /etc/sysconfig/network-scripts/ifcfg-Auto_eth1
(複製的原裝的虛擬機器,本博主使用的)要求:將ip地址配置為
靜態的static(或為none也行)
,ip地址為:192.168.xxx.xxx如果希望配置生效:
法1) reboot // 重啟系統
法2) service network restart // 重啟網路服務
配置檔案說明:
13.4 修改主機名
-
1) 檢視當前主機名
hostname -
2) 修改linux的主機對映檔案
vim /etc/sysconfig/network
檔案中內容如下:
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME= hadoop // 寫入新的主機名
注意:主機名稱不要有“_”下劃線,不識別。 -
3) 修改
vim /etc/hosts
檔案增加ip和主機的對映
192.168.25.204hadoop
….
-
4) 並重啟裝置,生效。
-
5) 如果希望Windows也可以通過
主機名
來連線CentOS,進入C:\Windows\System32\drivers\etc\hosts192.168.25.104 hadoop
14 程序管理(重點)
14.1 基本介紹
-
在LINUX中,每個執行的程式(程式碼)都稱為一個
程序
。每一個程序都分配一個ID號
。 - 每一個程序,都會對應一個父程序,而這個父程序可以複製多個子程序。例如:www伺服器。
-
每個程序都可能以兩種方式存在的。
前臺與後臺
,所謂前臺程序就是使用者目前的螢幕上可以進行操作的。後臺程序則是實際在操作,但由於螢幕上無法看到的程序,通常使用後臺方式執行,例如:[sshd,crond]。 - 一般系統的服務都是以後臺程序的方式存在,而且都會常駐在系統中。直到關機才才結束。
14.1.1 顯示系統執行的程序
-
ps命令是用來檢視目前系統中,有哪些正在執行,以及它們執行的狀況。可以不加任何引數。
用法說明:
-
ps -aux // 顯示所有的程序
- ps -aux | more // 分頁顯示所有的程序
-
ps -aux | grep sshd // 檢視sshd程序
14.1.2 ps指令詳解

應用例項:以全格式顯示當前所有的程序,檢視程序的父程序。

演示截圖:

檢視sshd程序的父程序號是多少?

14.2 終止程序kill和killall
-
介紹:
若是某個程序執行一半需要停止時,或是已消了很大的系統資源時,此時可以考慮停止該程序。使用kill命令來完成此項任務。 -
基本語法:
kill [選項] 程序號 (功能描述:通過程序號殺死程序,-9 強制終止)
killall 程序名稱 (功能描述:通過程序名稱殺死程序,也支援萬用字元,這在系統因負載過大而變得很慢時很有用) -
常用選項:
-9 : 表示強迫程序立即停止。 -
最佳實踐:
案例1:踢掉某個非法登入使用者。
案例2:終止遠端登入服務sshd,在適當時候再次重啟sshd服務。
案例3:終止多個gedit編輯器。通過程序名稱終止程序
killall gedit
案例4:強制殺掉一個終端。
kill 對應的bash的程序號,但是殺不掉。
kill -9 對應的bash的程序號
注意:
14.3 檢視程序樹pstree
-
基本語法:
pstree [選項] 可以更加直觀的來看程序資訊 -
常用選項:
-p : 顯示程序的PID
-u : 顯示程序的所屬使用者 -
應用例項:
案例1:請用樹狀的形式顯示程序的pid。
pstree -p
案例2:請用樹狀的形式程序的使用者id。
pstree –u
pstree -pu
14.4 服務(service)管理
-
介紹:
服務(service)
本質就是程序,但是是執行在後臺的,通常都會監聽某個埠,等待其它程式的請求,比如(mysql,sshd,防火牆等),因此我們又稱為守護程序
,是Linux中非常重要的知識點。【原理圖】 -
service管理指令:
service 服務名 [start | stop | restart | reload | status]
注意:在CentOS7X後,不再使用service,而是systemctl。
-
使用案例:
檢視當前防火牆的狀況,關閉防火牆和重啟防火牆。
service iptables status
-
細節討論:
1、關閉或者啟用防火牆後,立即生效。[我們可以通過Windows的telnet指令來測試某個埠是否在監聽並可以訪問
] 命令:telnet ip 埠
2、說明:
service iptables stop
service iptables start
這種方式只是臨時生效
,當重啟系統後,還是迴歸以前對服務的設定。
如果希望設定某個服務自啟動或關閉永久生效,要使用chkconfig指令
。
14.4.1 檢視服務名稱
-
檢視服務名稱:
方式1:使用
setup -> 系統服務
就可以看到。在Linux的命令列中輸入:setup 回車
選擇 系統服務 回車,服務前面顯示
星號
表示的該服務已啟動方式2:檢視/etc/init.d/服務名稱
14.4.2 服務的執行級別(runlevel)

一個思考題:
如果不小心將預設的執行級別設定成 0 或者 7 ,怎麼處理?
別怕,進入單使用者模式,修改成正常的即可!
14.5 chkconfig指令
-
介紹:
通過chkconfig命令可以給每個服務的各個執行級別設定自啟動/關閉。 -
基本語法:
0) 檢視所有服務在各個執行級別自啟動/關閉的狀態chkconfig --list
1) 檢視某個服務在各個執行級別自啟動/關閉的狀態
chkconfig --list | grep xxx
2) 檢視某個服務在各個執行級別自啟動/關閉的狀態
chkconfig 服務名稱 --list
3) 設定某個服務,在某個執行級別,開啟或關閉
chkconfig --level 5 服務名稱 on/off
例如:設定sshd服務在1執行級別時on。
chkconfig --level 1 sshd off/on
4) 設定某個服務,開啟或關閉
chkconfig 服務名稱 on/off
例如:使iptables徹底關閉。
chkconfig iptables off
[不管是哪個級別都關閉]
chkconfig iptables off
表示在所有level下關閉防火牆
chkconfig iptables on
表示在所有level下開啟防火牆 -
應用例項:
14.5 動態監控程序
-
介紹:
top與ps命令很相似。它們都用來顯示正在執行的程序。top與ps最大的不同之處,在於top在執行一段時間可以更新正在執行的的程序(預設每3秒變化一次)
。
-
基本語法:
top [選項] -
選項說明:
-
互動操作說明:
-
應用例項:
案例1:如何監視特定使用者
top:輸入此命令,按回車鍵,檢視執行的程序。
u:然後輸入“u”回車,再輸入使用者名稱,即可。
案例2:如何終止指定的程序。
top:輸入此命令,按回車鍵,檢視執行的程序。
k:然後輸入“k”回車,再輸入要結束的程序ID號,即可。
案例3:指定系統狀態更新的時間(每隔10秒自動更新)。
top -d 10
指定系統更新程序的時間為10秒。
14.6 監控網路狀態
-
介紹:
netstat指令 用於檢視系統網路情況
-
基本語法:
netstat [選項] -
選項說明:
-an 按一定順序排列輸出
-p 顯示哪個程序在呼叫 -
應用案例:
1、檢視服務名稱為sshd的服務的資訊。
命令:netstat –anp | grep sshd
2、檢視佔用22埠的程序。
命令:netstat –anp | grep 22
15 軟體包管理
15.1 rpm包的管理
-
介紹:
一種用於網際網路下載包的打包及安裝工具,它包含在某些Linux分發版中
。它生成具有.RPM副檔名的檔案
。RPM是RedHat Package Manager(RedHat軟體包管理工具)
的縮寫,類似windows的setup.exe,這一檔案格式名稱雖然打上了RedHat的標誌,但理念是通用的。
Linux的分發版本都有采用(suse、redhat、centos等等),可以算是公認的行業標準了。 -
rpm包的簡單查詢指令:
查詢已安裝的rpm列表rpm –qa | grep xxx
例如:rpm -qa | grep firefox
-
rpm包名基本格式:
一個rpm包名:firefox-45.0.1-1.el6.centos.x86_64.rpm
名稱:firefox
版本號:45.0.1-1
適用作業系統:el6.centos.x86_64,表示centos6.x的64位系統,如果是i686、i386表示32位系統,noarch表示通用
。 -
rpm包的其它查詢指令:
rpm -qa 查詢所安裝的所有rpm軟體包
rpm -qa | more 分頁查詢所安裝的所有rpm軟體包
rpm -qa | grep xxx 例如:rpm -qa | grep firefox
rpm -q 軟體包名 查詢rpm軟體包是否安裝,例如:rpm -q firefox
rpm -qi 軟體包名 查詢rpm軟體包資訊。例如:rpm -qi filefox
rpm -ql 軟體包名 查詢軟體包中的檔案,例如:
rpm -ql firefox
rpm -qf 檔案全路徑名 查詢檔案所屬的軟體包,例如:rpm -qf /etc/passwd
或者rpm -qf /root/install.log
15.2 解除安裝rpm包
-
基本語法:
rpm -e rpm包的名稱 -
應用案例:
刪除firefox軟體包
rpm -e firefox
-
細節討論:
1) 如果其它軟體包依賴於您要解除安裝的軟體包,解除安裝時則會產生錯誤資訊。
如:rpm -e foo
removing these packages would break dependencies:foo is needed by bar-1.0-1
2) 如果我們就是要刪除foo這個rpm 包,可以增加引數--nodeps
,就可以強制刪除,但是一般不推薦這樣做,因為依賴於該軟體包的程式可能無法執行。
如:rpm -e --nodeps foo
[小心使用]
15.3 安裝rpm包
-
基本語法:
rpm -ivh rpm包全路徑名稱 -
引數說明:
-i=install 安裝
-v=verbose 提示
-h=hash 進度條
--nodeps 不檢測依賴進度 -
應用例項:
演示解除安裝和安裝firefox瀏覽器。
提示:很多的rpm包,就在我們的centos安裝的映象檔案中。
安裝firefox瀏覽器步驟:
- 1、先找到firefox的安裝rpm包,可以掛載上我們的CentOS的ISO檔案,也可以從網路上下載firefox的安裝rpm包。我們演示的是掛載上我們的CentOS的ISO檔案。
- 2、然後到/media/目錄中找到irefox的安裝rpm包。
-
3、執行安裝命令。
按照下圖進行操作
此時會發現Linux桌面上出現一個光碟機
具體安裝過程:
15.4 yum包的管理
-
介紹:
yum 是一個 Shell 前端軟體包管理器
。基於RPM包管理,能夠從指定的伺服器自動下載rpm包並且安裝,可以自動處理依賴性關係
,並且一次安裝所有依賴的軟體包
。
-
yum的基本指令:
1、查詢yum伺服器是否有需要安裝的軟體(一般顯示的是最新版本的)
yum list | grep xxx 檢視軟體列表
2、安裝指定的yum包
yum install xxx 下載安裝 -
yum應用例項:
案例:請使用yum的方式來安裝firefox指令。
yum install firefox
//會自動的下載安裝適合你係統的最新版本
16 大廠面試題
16.1 百度面試題
問題:Linux常用命令,至少6個
答:netstat、top、lsblk、find、ps、chkconfig。
16.2 瓜子二手車面試題
問題:Linux檢視記憶體、磁碟儲存情況、磁碟io讀寫情況、端口占用、程序等命令。
答:
top
df -lh
netstat -tunlp
ps –aux | grep 程序名
iotop 如果沒有該命令,就先yum安裝一把
檢視端口占用情況:netstat -tunlp

iotop

17 感悟分享
唐朝有《賣炭翁》--背後有故事,以後深究之。

宋朝有《賣油翁》--背後有故事,以後深究之。

陳康肅公堯諮善射,當世無雙,公亦以此自矜。嘗射於家圃,有賣油翁釋擔而立,睨之,久而不去。見其發矢十中八九,但微頷之。康肅問曰:“汝亦知射乎?吾射不亦精乎?”翁曰:“無他,但手熟爾。
”康肅忿然曰:“爾安敢輕吾射?”翁曰:“以我酌油知之。”乃取一葫蘆置於地,以錢覆其口,徐以杓酌油瀝之,自錢孔入,而錢不溼。因曰:“我亦無他,惟手熟爾。
”康肅笑而遣之。
《賣油翁》這則故事的作者是歐陽修,出自他的私家筆記《歸田錄》。
老黃牛精神

18 資料附錄
-
尚矽谷大資料之Linux視訊
連結:https://pan.baidu.com/s/1wMTp4_Fh9Yl1CPjUNOydaw
密碼:6q4k
視訊質量:優良
視訊總個數:53個
視訊總時長:15:01:16
建議學習時長:5天