內容選單標籤

2021年10月30日 星期六

Python 入門






**********************************************************
一、變數 Variable 與常數 Constant
**********************************************************

變數
---------------------------------
程式執行過程中,可以被改變的資料
x=3
x=x+2
print(x)
5

type(print)
<class 'builtin_function_or_method'>



dir()
['LstA', '__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'i']




#列出有那些 builtin_function_or_method
dir(__builtins__)
.
.
 'abs', 'aiter', 'all', 'anext', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']



常數
---------------------------------
程式執行過程中,不能被改變的資料
import math
type(math)
<class 'module'>
math.pi
3.141592653589793



#列出有那些 modules
help("modules")
Please wait a moment while I gather a list of all available modules...
.
.
abc                 gzip                run                 zoomheight
aifc                hashlib             runpy               zzdummy
antigravity         heapq               runscript           





 變數命名規則
---------------------------------
  1. 變數名稱第一個字元,必須是英文字母、底線或中文(不建議),後即可搭配數字
  2. 變數名稱區分大小寫
  3. 不能使用python內建的保留字:關鍵字 keyword、指令

import keyword
dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'keyword']

type(keyword)
<class 'module'>

dir(keyword)
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'iskeyword', 'issoftkeyword', 'kwlist', 'softkwlist']


#列出  keyword
keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']


keyword.iskeyword("else")
True

keyword.iskeyword("name")
False



















**********************************************************
二、資料型態 DataType
**********************************************************

文字串Text String Type
---------------------------------
name="Tom"
type(name)
<class 'str'>


數值 Numeric Types
---------------------------------
整數 Integer
total=100
type(total)
<class 'int'>

浮點數 FloatPoint
myPi=3.14
type(myPi)
<class 'float'>

複數 Complex
myComplex=3+2j
type(myComplex)
<class 'complex'>


布林 Boolean Type
---------------------------------
myBoolean=5>3
myBoolean
True
type(myBoolean)
<class 'bool'>

myBoolean=5<3
myBoolean
False
type(myBoolean)
<class 'bool'>



序列 Sequence Types
---------------------------------
串列 List                #變數宣告後,可以變更當中資料
ListA=["apple", "banana", "cherry"]
type(ListA)
<class 'list'>
ListB=["Tom",85,70,92]
type(ListB)
<class 'list'>


序對Tuple                #變數宣告後,不可變更當中資料
TupleA=("Sun","Mon","Wed")
type(TupleA)
<class 'tuple'>




範圍 Range
---------------------------------
range(1,5+1)
range(1, 6)
type(range(1,5+1))
<class 'range'>

help(range)
Help on class range in module builtins:

class range(object)
 |  range(stop) -> range object
 |  range(start, stop[, step]) -> range object



for i in range(1,5+1):
    print(i)
    
1
2
3
4
5



Mapping Type
---------------------------------
字典 Dictionary
DicWeek={0:"Sunday",1:"Monday",2:"Tuesday"}
type(DicWeek)
<class 'dict'>
DicWeek.keys()
dict_keys([0, 1, 2])
DicWeek.values()
dict_values(['Sunday', 'Monday', 'Tuesday'])


集合Set Type
---------------------------------
SetWeek={"Wednesday","Thursday","Friday","Saturday"}
type(SetWeek)
<class 'set'>

Set1={"A","B","C"}
Set2={"B","C","D","E"}

Set1>=Set2                #Set1 是否包含 Set2所有元素
False

Set1<=Set2
False


Set1|Set2                #聯集
{'E', 'C', 'B', 'D', 'A'}

Set1&Set2                #交集
{'C', 'B'}

Set1-Set2                #差集,Set1 有,Set2沒有的元素列出 
{'A'}

Set1^Set2                #互斥或xor, Set1和Set2共同元素外的組合 
{'E', 'D', 'A'}

 














**********************************************************
三、運算子 Operator
**********************************************************


help('+')
Operator precedence
*******************

The following table summarizes the operator precedence in Python, from
highest precedence (most binding) to lowest precedence (least
binding).  Operators in the same box have the same precedence.  Unless
the syntax is explicitly given, operators are binary.  Operators in
the same box group left to right (except for exponentiation, which
groups from right to left).
.
.
.



算數運算子 Arithmetic Operator
---------------------------------

x=13;y=2

x+y
15
x-y
11
x*y
26
x/y
6.5

x**y    #次方
169

x//y    #除法取整數商
6

x%y    #除法取餘數
1









指定運算子 Assignment Operator
---------------------------------

weight=70
weight=weight+5
print(weight)
75






關係運算子 Comparison Operators
---------------------------------

a=5;b=2

a>b
True

a>=b
True

a<b
False

a<=b
False

a==b    #等於
False

a!=b    #不等於
True






邏輯運算子 Logical Operators
---------------------------------

5<7
True
3>8
False


5<7 and 3>8
False

5<7 or 3>8
True


not 5<7
False

not 3>8
True








複合指定運算子 Compound Assignment Operator
---------------------------------

weight=70
weight=weight+5
print(weight)
75

weight=weight+5
weight+=5

weight=weight-5
weight-=5

weight=weight*5
weight*=5

weight=weight/5
weight/=5




Identity Operator
---------------------------------
x='BC';y="ABCD"

x is y
False

x is not y
True




Membership Operator
---------------------------------
x='BC';y="ABCD"

x in y
True

x not in y
False
















**********************************************************
四、標準輸入指令:input
**********************************************************
>>> help(input)
Help on built-in function input in module builtins:

input(prompt=None, /)
    Read a string from standard input.  The trailing newline is stripped.
    
    The prompt string, if given, is printed to standard output without a
    trailing newline before reading input.
    
    If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.
    On *nix systems, readline is used if available.

>>> name=input("輸入你的名字:")
輸入你的名字:小明
>>> name
'小明'
>>> type(name)
<class 'str'>

>>> score=int(input("輸入分數:"))
輸入分數:93
>>> score
93
>>> type(score)
<class 'int'>
















**********************************************************
五、標準輸出指令:print
**********************************************************
>>> help(__builtins__.print)
Help on built-in function print in module builtins:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
    
    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.


>>> print('A','B','C');print('D','E')
A B C
D E

>>> print(1,2,3,sep='+',end="=")
1+2+3=



format指令,格式化輸出
---------------------------------
na1="John";na2="Ku"
age1=16;age2=7
height1=176.8;height2=98.9
print("名字:{0:4s} 年齡:{1:2d} 身高:{2:6.2f}".format(na1,age1,height1))
print("名字:{0:4s} 年齡:{1:2d} 身高:{2:6.2f}".format(na2,age2,height2))

名字:John 年齡:16 身高:176.80
名字:Ku    年齡: 7  身高:  98.90

#String靠對齊,Integer靠對齊,Float對齊小數點
















**********************************************************
六、結構化的程式設計 Structured Programming
**********************************************************
其主要精神就是將問題從上而下、由大到小逐步分解成較小單元,這些單元稱為模組 module,又可再細分更小的單元,不但方便程式撰寫,減輕程式設計師負擔,讓程式設計師針對各模組開發設計,日後修改與維護都較為容易。
結構化程式設計包含三種流程控制結構: 

循序 Sequential Structure
---------------------------------

x=3
y=6
print(x+y)
9







選擇 Selection Structure 
---------------------------------

if 條件運算式:
    程式區塊     
~~~~~~~~
help('if')
The "if" statement
******************

The "if" statement is used for conditional execution:

   if_stmt ::= "if" assignment_expression ":" suite
               ("elif" assignment_expression ":" suite)*
               ["else" ":" suite]



height=int(input("輸入身高:"))
if height>=160:
    print("身高中等!")
=========
輸入身高:168
身高中等!





if 條件運算式:
    程式區塊1   
else:
    程式區塊2     
~~~~~~~~
Num=int(input("輸入一整數:"))
if Num%2==0:
    print(Num,"是偶數!")
else:
    print(Num,"是奇數!")
=========
輸入一整數:56
56 是偶數!

==========
輸入一整數:33
33 是奇數!




Num=int(input("輸入一整數:"))
print(Num,"是偶數!"if Num%2==0 else "是奇數!")
=========
輸入一整數:12
12 是偶數!

=========
輸入一整數:77
77 是奇數!




a=3;b=6
Min=a if a<b else b
print(Min)
=========
3




for i in range(1,10+1):
    print(i if i%2==0 else ' ',end='')
=========
 2 4 6 8 10                #奇數只印出空白





if 條件運算式1:   
    程式區塊1        
elif 條件運算式2:
    程式區塊2       
elif 條件運算式3:
    程式區塊3       
.
.
else:                    
    程式區塊n           
~~~~~~~~
Score=int(input("輸入一整數:"))
if Score>=90:
    print("分數A等!")
elif Score>=80:
    print("分數B等!")
elif Score>=70:
    print("分數C等!")
elif Score>=60:
    print("分數D等!")
else:
    print("分數E等!")
=========
輸入一整數:100
分數A等!

=========
輸入一整數:85
分數B等!

=========
輸入一整數:73
分數C等!

=========
輸入一整數:68
分數D等!

=========
輸入一整數:59
分數E等!











重複 Repetition Structure
---------------------------------

for item in sequence:
    for的程式區塊
else:
    else的程式區塊(可省)
~~~~~~~~迴圈次數可以明確

help("for")
The "for" statement
*******************

The "for" statement is used to iterate over the elements of a sequence
(such as a string, tuple or list) or other iterable object:

   for_stmt ::= "for" target_list "in" expression_list ":" suite
                ["else" ":" suite]



myRange=range(1,9+1)
for i in myRange:
    print(i,end=' ')
========= 
1 2 3 4 5 6 7 8 9 


for i in range(1,9+1):
    print(i,end=' ')
=========    
1 2 3 4 5 6 7 8 9 





for i in "Hello":
    print(i,end=', ')
=========    
H,e,l,l,o,



LstA=['Hello','World']
for i in LstA:
    print(i)
=========    
Hello
World 





for i in range(1,6+1):
    print(i,end=" ")
else:
    print("\n",i," 超出範圍!",sep="")
=========    
1 2 3 4 5 6 
6 超出範圍!    #else之後,i =6 而不是 i=7







while 條件運算式:
    符合條件運算式時要執行的程式區塊
else:
    不符合條件運算式時要執行的程式區塊
~~~~~~~~迴圈次數不明確定

help("while")
The "while" statement
*********************

The "while" statement is used for repeated execution as long as an
expression is true:

   while_stmt ::= "while" assignment_expression ":" suite
                  ["else" ":" suite]


cnt=1
while cnt<=10:
    print(cnt,end=' ')
    cnt=cnt+1
=========
1 2 3 4 5 6 7 8 9 10





n=1
while n <=6:
    print(n,end=" ")
    n+=1
else:
    print("\n",n,"超出範圍!",sep="")
=========
1 2 3 4 5 6 
7超出範圍!    #else之後,n =7 而不是 n=6





cnt=1
while cnt<=10:
    print(cnt,end=' ')

    if cnt==6:break
    
    cnt=cnt+1
=========    #break 強制終止迴圈
1 2 3 4 5 6




cnt=1
while cnt<=10:
    print(cnt,end=' ')

    if cnt==6:continue
    
    cnt=cnt+1
============    #continue 跳過目前迴圈後的程式碼,繼續執行下一輪迴圈
1 2 3 4 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6Traceback (most recent call last):
  File "C:/Users/kk/Desktop/python/003.py", line 3, in <module>
    print(cnt,end=' ')
KeyboardInterrupt















**********************************************************
python 撰寫風格
********************************************************** 
#單行註解

''' 以下式多行註解
 「;」 
    敘述很短時,可用半形分號,把多形敘述併成一行。

    python 會在指令後,如:while 或 if  ,以縮排表示程式區塊 CodeBlock (python 稱 Suite)。
   「:」    
    半形冒號,提醒使用者下一行程式碼必須縮排,預設值則以一個「Tab」鍵,
    即4個空白字元來完成縮排。
'''
    


   
x=6;y=9
if x<y:
    print("正確")
else:
    print("不正確")
=========
正確









**********************************************************
變數交換
**********************************************************

a=3;b=5
tmp=a
a=b
b=tmp
print("a=",a,",","b=",b)
=========
a= 5 , b= 3




a=7;b=9
a,b=b,a
print("a=",a,",","b=",b)
=========
a= 9 , b= 7






**********************************************************
函式 Functtion
**********************************************************



內建函式 Built-In Function 👉 直接使用
---------------------------------

dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']

dir(__builtins__)
.
.
 'abs', 'aiter', 'all', 'anext', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 
.

type(__builtins__)
<class 'module'>

help(__builtins__)
Help on built-in module builtins:
NAME
    builtins - Built-in functions, exceptions, and other objects.
.
.

type(abs)                                                             
<class 'builtin_function_or_method'>


x=-3.6                                                              
print(abs(x))                                                              
3.6







標準函式庫 Standard Library 👉 import 後才可使用
---------------------------------

help("modules")
Please wait a moment while I gather a list of all available modules...
.
_heapq              codeop              math                stringprep
.
Enter any module name to get more help.  Or, type "modules spam" to search
for modules whose name or summary contain the string "spam".


import math
dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'math']

type(math)
<class 'module'>

help(math)
Help on built-in module math:

NAME
    math

DESCRIPTION
    This module provides access to the mathematical functions
    defined by the C standard.

FUNCTIONS
    acos(x, /)
        Return the arc cosine (measured in radians) of x.
.

DATA
    e = 2.718281828459045
    inf = inf
    nan = nan
    pi = 3.141592653589793
    tau = 6.283185307179586


dir(math)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']

math.pi
3.141592653589793





def 函式名稱 ( [參數] ):
    程式區塊
    return 值

自訂函式    def 自行定義
---------------------------------

def myAdd(x,y):
    answer=x+y
    return answer

x=int(input("x="))
y=int(input("y="))

print("x+y=",myAdd(x,y))
=========
x=3
y=6
x+y= 9







外部函式庫的函式 👉先安裝--> import  後才可使用
---------------------------------


















**********************************************************
例外處理
**********************************************************
基本的例外錯誤處理(try-except)
不同的例外錯誤處理(different exceptions)
finally區塊(try-except-finally)
自行拋出例外錯誤(raise exceptions)


x=3;y=6
print(z)
print(x+y)
=========
Traceback (most recent call last):
  File "C:/Users/User/Desktop/00.py", line 2, in <module>
    print(z)
NameError: name 'z' is not defined




x=3;y=6

try:
    print(z)
except:
    print("Error!")
    
print(x+y)
=========有捕捉錯誤,所以print(x+y) 可以順利執行。
Error!
9









 **************

 **************






 **************

 **************






 **************

 **************






 **************

 **************






 **************

 **************






 **************

 **************






 **************

 **************






 **************

 **************






 **************

 **************






 **************

 **************






 **************

 **************






 **************

 **************






 **************

 **************







2021年10月28日 星期四

pyhton for math

******************
 一上
******************


----------------------------------------------因數
Num=int(input("輸入一正整數,求因數:"))
for i in range(1,Num+1):
    if Num%i==0:
        print(i,end=", ")
=========
輸入一正整數,求因數:54
1, 2, 3, 6, 9, 18, 27, 54, 






----------------------------------------------質數 Prime number  (除了1和本身以外,沒有其它因數)
Num=int(input("輸入一正整數,求小於此數的所有質數:"))

for N in range(2,Num+1):
    isPrime=True
    for i in range(2,N):
        if N%i==0:
            isPrime=False
            break
    if isPrime==True:
        print(N,end=", ")
=========
輸入一正整數,求小於此數的所有質數:50
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,



~~~~~~~~~~~~~~~~~~~~~~~不同寫法
N=int(input("輸入一正整數,求小於此數的所有質數:"))

for Num in range(2,N+1):
    if all(Num%i!=0 for i in range(2,Num)):
        print(Num,end=", ")
=========
輸入一正整數,求小於此數的所有質數:50
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 








----------------------------------------------

=========






----------------------------------------------

=========








******************
 二上
******************


----------------------------------------------解一元一次方程式
a=int(input("請輸入一元一次方程式:aX+b=0 的係數\na="))
b=int(input("b="))

print("x=",-b/a)
=========
請輸入一元一次方程式:aX+b=0 的係數
a=2
b=3
x= -1.5

==========
請輸入一元一次方程式:aX+b=0 的係數
a=3
b=-12
x= 4.0




----------------------------------------------利用公式解,解一元二次方程式
a=int(input("請輸入一元二次方程式:aX^2+bX+c=0 的係數\na="))
b=int(input("b="))
c=int(input("c="))
judgment=(b*b-4*a*c)

if judgment>0:
    ans1=(-1*(b)+(judgment**0.5))/(2*a)
    ans2=(-1*(b)-(judgment**0.5))/(2*a)
    print("因判別式=",judgment," 大於 0,所以x=",ans1," 或x=",ans2)
    
if judgment==0:
    ans1=(-1*(b)+(judgment**0.5))/(2*a)    
    print("因判別式=",judgment," 所以x=",ans1)

if judgment<0:
        print("因判別式=",judgment,"  小於 0,所以無解")
=========
請輸入一元二次方程式:aX^2+bX+c=0 的係數
a=3
b=7
c=2
因判別式= 25  大於 0,所以x= -0.3333333333333333  或x= -2.0

==========
請輸入一元二次方程式:aX^2+bX+c=0 的係數
a=1
b=22
c=121
因判別式= 0  所以x= -11.0

==========
請輸入一元二次方程式:aX^2+bX+c=0 的係數
a=2
b=3
c=4
因判別式= -23   小於 0,所以無解





----------------------------------------------

=========






----------------------------------------------

=========






----------------------------------------------

=========






----------------------------------------------

=========






----------------------------------------------

=========

2021年10月22日 星期五

CentOS8 -- vsFtp


# cat /etc/redhat-release
CentOS Linux release 8.4.2105


============================
安裝、啟用
============================
//-h, --help, --help-cmd
# dnf list -h
列出軟體包中的軟體包或群組
General DNF options:
...
List command-specific options:
  --all                 顯示所有軟體包(預設值)
  --available           只顯示可用的軟體包
  --installed           只顯示已安裝的軟體包
  --extras              只顯示附加的軟體包
  --updates             只顯示要升級的軟體包
  --upgrades            只顯示要升級的軟體包
  --autoremove          只顯示要被自動移除的軟體包
  --recent              只顯示最近變動的軟體包
  PACKAGE               軟體包名稱規格




# dnf list | grep vsftpd
vsftpd.x86_64                                          3.0.3-33.el8                                      appstream


# dnf -y install vsftpd
...
已安裝:
  vsftpd-3.0.3-33.el8.x86_64


# dnf list installed | grep vsftpd
vsftpd.x86_64                        3.0.3-33.el8                     @appstream
 


# rpm -qa| grep vsftpd
vsftpd-3.0.3-33.el8.x86_64


# vi /etc/vsftpd/vsftpd.conf
...
chroot_local_user=YES                //enable
...



# ls /usr/sbin | grep vsftpd
vsftpd


# ls /usr/lib/systemd/system | grep vsftpd
vsftpd.service
vsftpd@.service
vsftpd.target




# ls /etc/vsftpd
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh



# ls /var/ftp
pub



# systemctl start vsftpd.service                //restart



# systemctl enable vsftpd.service
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /us                               r/lib/systemd/system/vsftpd.service.

# systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor pre>
   Active: active (running) since Mon 2021-10-25 14:40:02 CST; 55s ago
  Process: 10077 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exite>

# systemctl | grep vsftpd
vsftpd.service                                                                 loaded active running   Vsftpd ftp daemon

# ps -aux | grep vsftpd
root       10078  0.0  0.0  27056   416 ?        Ss   14:40   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root       10144  0.0  0.0  12136  1120 pts/0    S+   14:45   0:00 grep --color=auto vsftpd






============================
防火牆
============================
# firewall-cmd --state
running

# firewall-cmd --get-zones
block dmz drop external home internal nm-shared public trusted work

# firewall-cmd --get-active-zone
public
  interfaces: ens160

# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

# firewall-cmd --get-services | grep ftp
... freeipa-replication freeipa-trust ftp galera ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client 
...

# firewall-cmd --permanent --zone=public --add-service=ftp
success

# firewall-cmd --reload
success

# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: cockpit dhcpv6-client ftp ssh
...






============================
安全增強型Linux(Security-Enhanced Linux)簡稱SELinux
============================
此似乎不用!






============================
新增使用者、使用測試
============================
# useradd s317
# passwd s317
更改使用者 s317 的密碼。
新 密碼:1234
...

# cat /etc/group
...
s317:x:1000:


# cat /etc/passwd
...
s317:x:1000:1000::/home/s317:/bin/bash


# cat /etc/shadow
...
s317:$6$tXTfrXFxa8Dh.Vrb$CG80j89DvfZQUtJTIgfEh.50QP8WED1jSKRiQe.tK08Wrgkt.HxYArGcqGuiLkrqUZgbGiXQ8h8GwQvC1Tgsz0:18948:0:99999:7:::


# ls -l /home
drwx------. 2 s317 s317 62 11月 17 11:05 s317

# id s317
uid=1000(s317) gid=1000(s317) groups=1000(s317)



[root@centos ~]# su -l s317
[s317@centos ~]$ mkdir {01..40}
[s317@centos ~]$ ls
01  04  07  10  13  16  19  22  25  28  31  34  37  40
02  05  08  11  14  17  20  23  26  29  32  35  38
03  06  09  12  15  18  21  24  27  30  33  36  39

[s317@centos ~]$ su
密碼:
[root@centos s317]# cd
[root@centos ~]#

# lsattr /home
-------------------- /home/s317

# chattr +a -R /home/s317

# lsattr /home
-----a-------------- /home/s317



檔案總管-->網址列
ftp://s317@172.31.147.99/40
pwd: 1234

登入有錯
500 OOPS: vsftpd: refusing to run with writable root inside chroot()

# vi /etc/vsftpd/vsftpd.conf
...
chroot_local_user=YES                //enable
allow_writeable_chroot=YES        //新加此行
...
# systemctl restart vsftpd.service 


可新增文件,但中文檔名亂碼!

因為 windows10 的檔名中文編碼預設為 gbk,而linux中預設檔名編碼為utf8,由於編碼不一致,所以導致了檔名亂碼的問題

建議使用 FileZilla Client 傳輸檔案
FileZilla_3.56.2_win64_sponsored2-setup 下載安裝
檔案 --> 站台管理員 -->  新增站台 --> 主機:172.31.145.99 --> 使用者:317 --> 密碼:1234 --> 字元集 -->強制使用 UTF-8





# ps aux | grep s317
s317        1838  0.0  0.2  77464  4572 ?        S    16:04   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root        1842  0.0  0.0  12136  1040 pts/0    S+   16:04   0:00 grep --color=auto s317


# kill -9 1838                //送出 kill ,訊號9,強制結束該行程     //??pietty 連線會中斷


# ps aux | grep s317
root        1844  0.0  0.0  12136  1068 pts/0    S+   16:06   0:00 grep --color=auto s317



# userdel -rf s317

# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:33:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
users:x:100:
nobody:x:65534:
dbus:x:81:
utmp:x:22:
utempter:x:35:
input:x:999:
kvm:x:36:
render:x:998:
systemd-journal:x:190:
systemd-coredump:x:997:
systemd-resolve:x:193:
tss:x:59:
polkitd:x:996:
ssh_keys:x:995:
unbound:x:994:
sssd:x:993:
chrony:x:992:
sshd:x:74:

# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
unbound:x:997:994:Unbound DNS resolver:/etc/unbound:/sbin/nologin
sssd:x:996:993:User for sssd:/:/sbin/nologin
chrony:x:995:992::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

# cat /etc/shadow
root:$6$0Krx6tdRpUj4JFE3$FLoaaQX4f30/sad5y7ezYrYQxK5Ubej.voRHptAn53Q42iuvkWH/zpE/RtDsvn4luxiXdnAmNpUGgUuxQoL8S1::0:99999:7:::
bin:*:18397:0:99999:7:::
daemon:*:18397:0:99999:7:::
adm:*:18397:0:99999:7:::
lp:*:18397:0:99999:7:::
sync:*:18397:0:99999:7:::
shutdown:*:18397:0:99999:7:::
halt:*:18397:0:99999:7:::
mail:*:18397:0:99999:7:::
operator:*:18397:0:99999:7:::
games:*:18397:0:99999:7:::
ftp:*:18397:0:99999:7:::
nobody:*:18397:0:99999:7:::
dbus:!!:18915::::::
systemd-coredump:!!:18915::::::
systemd-resolve:!!:18915::::::
tss:!!:18915::::::
polkitd:!!:18915::::::
unbound:!!:18915::::::
sssd:!!:18915::::::
chrony:!!:18915::::::
sshd:!!:18915::::::

# ls -l /home
總計 0


# dnf -y remove vsftpd

# dnf list installed | grep vsftpd

2021年10月7日 星期四

CentOS8 基本操作

 

------------------------------------------------------ vi 使用
一般模式:標記、刪除、搬移、複製
G:移到檔案最後。5G:移到檔案第5行。gg:移到檔案開頭
dd:刪除游標所在之行。5dd 表刪除自游標算起 5 行
yy:拷貝游標所在之行至緩衝區。5yy:拷貝游標所在之處以下 5 行至緩衝區。p:把緩衝區之資料貼上來
u:復原至上一動作。 ‧ : 重覆執行上個指令


編輯模式
i (insert) 進入編輯模式、ESC離開編輯模式


命令模式
:wq ( 寫入並離開 vi )。:q! ( 強迫離開並放棄編輯的檔案 )
:set nu (列出行號)  :set nonu (不列出行號)
/pattern (往下尋找pattern字串),按"n"找下一個符合字串 ,按"N"找上一個符合字串
?pattern (往上尋找pattern字串),按"n"找上一個符合字串 ,按"N"找下一個符合字串



------------------------------------------------------ 詳細使用手冊



# man man
MAN(1) Manual pager utils MAN(1)
NAME
man - an interface to the on-line reference manuals
SYNOPSIS    //摘要
DESCRIPTION
...

Space】往前捲一個頁面
【b】       往後捲一個頁面

PageDown】往前捲半個頁面
PageUp】     往後捲半個頁面

【Enter】往下移行一行

【方向鍵】上下左右

/關鍵字】往後搜尋關鍵字,【n】同方向繼續搜尋,【N】反方向繼續搜尋
【?關鍵字】往前搜尋關鍵字,【N】同方向繼續搜尋,【n】反方向繼續搜尋

【q】離開


# man --help

# man -h

# info man





------------------------------------------------------ 檔案系統

檔案系統階層標準 Filesystem Hierarchy Standard FHS 說明檔案目錄在 Linux 階層架構與擺放位置。



------------------------------------------------------查看内核kernel的版本
# cat /etc/redhat-release
CentOS Linux release 8.4.2105


# cat /proc/version
Linux version 4.18.0-305.3.1.el8.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 8.4.1 20200928 (Red Hat 8.4.1-1) (GCC)) #1 SMP Tue Jun 1 16:14:33 UTC 2021


# uname -a
Linux centos.kk 4.18.0-305.3.1.el8.x86_64 #1 SMP Tue Jun 1 16:14:33 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux






------------------------------------------------------network address
# man ip

# ip --help

# ip -help

# ip -h


//路由表複雜時比 ifconifg 效能較佳
# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:cc:33:0e brd ff:ff:ff:ff:ff:ff
    inet 172.31.145.99/24 brd 172.31.145.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fecc:330e/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

# ip route
default via 172.31.145.254 dev ens33 proto static metric 100
172.31.145.0/24 dev ens33 proto kernel scope link src 172.31.145.99 metric 100





------------------------------------------------------行程
# man ps
NAME
       ps - report a snapshot of the current processes.
...


# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.2 251560 14000 ?        Ss   13:54   0:01 /usr/lib/systemd/systemd --switched-root --system -
root           2  0.0  0.0      0     0 ?        S    13:54   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   13:54   0:00 [rcu_gp]
...



# ls ..
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var


/proc 是一種虛擬文件系統。儲存的是當前核心運行狀態的一系列特殊文件,用戶可以通過這些文件查看有關系統硬體及當前正在運行進程的信息。

# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 158
...


/run 程式或服務啟動後會將其 PID 放置於此,正在執行
# ls /run
...
cryptsetup     fsck             mount      sshd.pid        udev


# cat /run/sshd.pid
1006




------------------------------------------------------配合資教中心系統升級與補強

取得 CentOS
http://ftp.kh.edu.tw/Linux/Caosity/centos/8.4.2105/isos/x86_64/CentOS-8.4.2105-x86_64-dvd1.iso



# dnf -y install wget

# wget http://ftp.kh.edu.tw/APPL/dnf/CentOS8/fix-dnf_repo-CentOS8.sh

# ls -l

# chmod 755 fix-dnf_repo-CentOS8.sh

# ls -l
總計 8
-rw-------. 1 root root 1167 10月  8 13:47 anaconda-ks.cfg
-rwxr-xr-x. 1 root root 1943 11月  4 14:30 fix-dnf_repo-CentOS8.sh


//修正套件庫來源及增加 epel 套件庫來源
# ./fix-dnf_repo-CentOS8.sh

# dnf -y update




------------------------------------------------------讓設備自動定期更新套件
# dnf -y install dnf-automatic

# vi /etc/dnf/automatic.conf
...
apply_updates = yes

# systemctl start dnf-automatic.timer

# systemctl enable dnf-automatic.timer
Created symlink /etc/systemd/system/timers.target.wants/dnf-automatic.timer → /usr/lib/systemd/system/dnf-automatic.timer.

# systemctl status dnf-automatic.timer
● dnf-automatic.timer - dnf-automatic timer
   Loaded: loaded (/usr/lib/systemd/system/dnf-automatic.timer; enabled; vendor>
   Active: active (waiting) since Wed 2021-11-17 16:07:52 CST; 17s ago
  Trigger: Thu 2021-11-18 06:23:10 CST; 14h left



------------------------------------------------------看更新紀錄,知道那些套件更新
# cat /var/log/dnf.rpm.log
...
2021-11-17T15:53:16+0800 INFO --- logging initialized ---
2021-11-17T16:03:28+0800 INFO --- logging initialized ---
2021-11-17T16:03:28+0800 SUBDEBUG Installed: dnf-automatic-4.7.0-4.el8.noarch

# tail /var/log/dnf.rpm.log
2021-11-17T15:52:22+0800 SUBDEBUG Upgraded: glibc-2.28-151.el8.x86_64
2021-11-17T15:52:22+0800 SUBDEBUG Upgraded: glibc-langpack-zh-2.28-151.el8.x86_64
2021-11-17T15:52:22+0800 SUBDEBUG Upgraded: glibc-common-2.28-151.el8.x86_64
2021-11-17T15:52:22+0800 SUBDEBUG Upgraded: tzdata-2021a-1.el8.noarch
2021-11-17T15:52:22+0800 SUBDEBUG Upgraded: filesystem-3.8-3.el8.x86_64
2021-11-17T15:52:23+0800 SUBDEBUG Upgraded: ncurses-base-6.1-7.20180224.el8.noarch
2021-11-17T15:52:23+0800 SUBDEBUG Upgraded: libgcc-8.4.1-1.el8.x86_64
2021-11-17T15:53:16+0800 INFO --- logging initialized ---
2021-11-17T16:03:28+0800 INFO --- logging initialized ---
2021-11-17T16:03:28+0800 SUBDEBUG Installed: dnf-automatic-4.7.0-4.el8.noarch

# tail -2 /var/log/dnf.rpm.log
2021-11-17T16:03:28+0800 INFO --- logging initialized ---
2021-11-17T16:03:28+0800 SUBDEBUG Installed: dnf-automatic-4.7.0-4.el8.noarch

# cat /var/log/dnf.rpm.log | more

# cat /var/log/dnf.rpm.log | grep Installed





------------------------------------------------------檔案目錄簡介
# ls -l /
總計 16
lrwxrwxrwx.   1 root root    7  6月 22 13:06 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 11月 18 09:25 boot
drwxr-xr-x.  20 root root 3120 11月 18 09:25 dev
drwxr-xr-x.  83 root root 8192 11月 18 09:30 etc
drwxr-xr-x.   3 root root   18  6月 22 13:06 home
lrwxrwxrwx.   1 root root    7  6月 22 13:06 lib -> usr/lib
lrwxrwxrwx.   1 root root    9  6月 22 13:06 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6  6月 22 13:06 media
drwxr-xr-x.   3 root root   18  6月 22 13:06 mnt
drwxr-xr-x.   2 root root    6  6月 22 13:06 opt
dr-xr-xr-x. 178 root root    0 11月 18 09:24 proc
dr-xr-x---.   2 root root  166  6月 22 13:06 root
drwxr-xr-x.  27 root root  760 11月 18 09:25 run
lrwxrwxrwx.   1 root root    8  6月 22 13:06 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6  6月 22 13:06 srv
dr-xr-xr-x.  13 root root    0 11月 18 09:25 sys
drwxrwxrwt.  11 root root  276 11月 18 09:30 tmp
drwxr-xr-x.  12 root root  144 11月 17 15:49 usr
drwxr-xr-x.  20 root root  278 11月 18 09:25 var



# dnf -y install tree

# tree -L 1 /
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

19 directories, 0 files




/proc 是一種虛擬文件系統。儲存的是當前核心運行狀態的一系列特殊文件,用戶可以通過這些文件查看有關系統硬體當前正在運行進程的信息。

# ps -aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.2  0.2 175000 13524 ?        Ss   09:24   0:01 /usr/lib/syst
root           2  0.0  0.0      0     0 ?        S    09:24   0:00 [kthreadd]
...

# ls /proc/1
attr                environ    mountinfo      personality   statm
autogroup           exe        mounts         projid_map    status
...

# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
...




/run 程式或服務啟動後會將其 PID 放置於此,正在執行

# ls /run
agetty.reload  cron.reboot      firewalld  lvm             setrans     tuned
auditd.pid     cryptsetup       fsck       mount           sshd.pid    udev
...

# cat /run/sshd.pid
1029





/opt 第3方程式放在此


# ls -al /sys
總計 0
dr-xr-xr-x.  13 root root   0 11月 18 09:25 .
dr-xr-xr-x.  17 root root 224 11月 17 15:49 ..
drwxr-xr-x.   2 root root   0 11月 18 09:24 block
drwxr-xr-x.  36 root root   0 11月 18 09:24 bus
...



Linux       根目錄 /
Windows 根目錄 \



------------------------------------------------------inode
一、 inode是什麼?
檔案儲存在硬碟上,硬碟的最小儲存單位叫做”扇區”(Sector)。每個扇區儲存512位元組(相當於0.5KB)。
作業系統讀取硬碟的時候,是一次性連續讀取多個扇區,即一次性讀取一個”塊”(block)。這種由多個扇區組成的”塊”,是檔案存取的最小單位。”塊”的大小,最常見的是4KB,即連續八個 sector組成一個 block。
檔案資料都儲存在”塊”中,那麼很顯然,我們還必須找到一個地方儲存檔案的元資訊,比如檔案的建立者、檔案的建立日期、檔案的大小等等。這種儲存檔案元資訊的區域就叫做inode,中文譯名為”索引節點”。
每一個檔案都有對應的inode,裡面包含了與該檔案有關的一些資訊。

二、inode的內容
inode包含檔案的元資訊,具體來說有以下內容:
  • 檔案的位元組數
  • 檔案擁有者的User ID
  • 檔案的Group ID
  • 檔案的讀、寫、執行許可權
  • 檔案的時間戳,共有三個:
    • ctime (status Change time) 指檔案的屬性或內容上次被修改的時間
    • mtime (Modified time) 指檔案內容上一次變動的時間,
    • atime (Access time) 指檔案上一次開啟、讀取的時間。
  • 連結數,即有多少檔名指向這個inode
  • 檔案資料block的位置

# ls
anaconda-ks.cfg 


// stat - display file or file system status
# stat anaconda-ks.cfg
 File: anaconda-ks.cfg
  Size: 1167            Blocks: 8          IO Block: 4096   普通檔案
Device: fd00h/64768d    Inode: 9406547     Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:admin_home_t:s0
Access: 2021-10-08 13:47:25.937036895 +0800
Modify: 2021-10-08 13:47:25.970035323 +0800
Change: 2021-10-08 13:47:25.970035323 +0800
 Birth: 2021-10-08 13:47:25.937036895 +0800

三、inode的大小
inode也會消耗硬碟空間,所以硬碟格式化的時候,作業系統自動將硬碟分成兩個區域:
  1. 資料區,存放檔案資料;
  2. inode區(inode table),存放inode所包含的資訊。
每個inode節點的大小,一般是128位元組或256位元組。inode節點的總數,在格式化時就給定,一般是每1KB或每2KB就設定一個inode。假定在一塊1GB的硬碟中,每個inode節點的大小為128位元組,每1KB就設定一個inode,那麼inode table的大小就會達到128MB,佔整塊硬碟的12.8%。
//硬碟總KB數*每個inode大小(KB)=總inode table 大小(KB)
1000000*0.128=128000(KB)

//每個硬碟分割槽的inode總數和已經使用的數量
//df - report file system disk space usage
// -i, --inodes     list inode information instead of block usage

# df -i
檔案系統              Inode I已用   I可用 I已用% 掛載點
devtmpfs             736104   394  735710     1% /dev
tmpfs                740808     1  740807     1% /dev/shm


由於每個檔案都必須有一個inode,因此有可能發生inode已經用光,但是硬碟還未存滿的情況。這時,就無法在硬碟上建立新檔案。

四、inode號碼
每個inode都有一個號碼,作業系統用inode號碼來識別不同的檔案。
Unix/Linux系統內部不使用檔名,而使用inode號碼來識別檔案。對於系統來說,檔名只是inode號碼便於識別的別稱或者綽號。
表面上,使用者通過檔名,開啟檔案。實際上,系統內部這個過程分成三步:首先,系統找到這個檔名對應的inode號碼;其次,通過inode號碼,獲取inode資訊;最後,根據inode資訊,找到檔案資料所在的block,讀出資料。

//看到檔名對應的inode號碼:
# ls -i anaconda-ks.cfg
9406547 anaconda-ks.cfg



五、目錄檔案
Unix/Linux系統中,目錄(directory)也是一種檔案。開啟目錄,實際上就是開啟目錄檔案。
目錄檔案的結構,就是一系列目錄項(dirent)的列表。每個目錄項,由兩部分組成:所包含檔案的檔名,以及該檔名對應的inode號碼。

# ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

//列出整個目錄檔案,即檔名和inode號碼
// -i, --inode print the index number of each file

# ls -i /etc
 4489148 adjtime                    4732111 mke2fs.conf
 4225576 aliases                   12705687 modprobe.d
...


//列出檔案的詳細資訊
//-l     use a long listing format
[root@centos ~]# ls -l /etc
總計 1060
-rw-r--r--.  1 root root       16 10月  8 13:46 adjtime
-rw-r--r--.  1 root root     1529  5月 15  2020 aliases

目錄檔案的讀許可權(r)和寫許可權(w),都是針對目錄檔案本身。由於目錄檔案內只有檔名和inode號碼,所以如果只有讀許可權,只能獲取檔名,無法獲取其他資訊,因為其他資訊都儲存在inode節點中,而讀取inode節點內的資訊需要目錄檔案的執行許可權(x)。




------------------------------------------------------Link
六、硬連結
一般情況下,檔名和inode號碼是”一一對應”關係,每個inode號碼對應一個檔名。但是,Unix/Linux系統允許,多個檔名指向同一個inode號碼。
這意味著,可以用不同的檔名訪問同樣的內容;對檔案內容進行修改,會影響到所有檔名;但是,刪除一個檔名,不影響另一個檔名的訪問。這種情況就被稱為”硬連結”(hard link)。

# touch readme.txt
# ls -li
總計 8
9406547 -rw-------. 1 root root 1167 10月  8 13:47 anaconda-ks.cfg
8414221 -rw-r--r--. 1 root root    0 11月 19 11:12 readme.txt

//ln
# link readme.txt readme.txt.HardLink
# ls -li
總計 8
9406547 -rw-------. 1 root root 1167 10月  8 13:47 anaconda-ks.cfg
8414221 -rw-r--r--. 2 root root    0 11月 19 11:12 readme.txt
8414221 -rw-r--r--. 2 root root    0 11月 19 11:12 readme.txt.HardLink

原始檔與目標檔案的inode號碼相同,都指向同一個inode。inode資訊中有一項叫做”連結數”,記錄指向該inode的檔名總數,這時就會增加1。

反過來,刪除一個檔名,就會使得inode節點中的”連結數”減1。當這個值減到0,表明沒有檔名指向這個inode,系統就會回收這個inode號碼,以及其所對應block區域。

# rm -f readme.txt
# ls -li
9406547 -rw-------. 1 root root 1167 10月  8 13:47 anaconda-ks.cfg
8414221 -rw-r--r--. 1 root root    0 11月 19 11:12 readme.txt.HardLink

# cat readme.txt.HardLink




七、軟連結
檔案A和檔案B的inode號碼雖然不一樣,但是檔案A的內容是檔案B路徑。讀取檔案A時,系統會自動將訪問者導向檔案B。因此,無論開啟哪一個檔案,最終讀取的都是檔案B。這時,檔案A就稱為檔案B的”軟連結”(soft link)或者”符號連結(symbolic link)。

這意味著,檔案A依賴於檔案B而存在,如果刪除了檔案B,開啟檔案A就會報錯:”No such file or directory”。這是軟連結硬連結最大的不同:檔案A指向檔案B檔名,而不是檔案B的inode號碼,檔案B的inode”連結數”不會因此發生變化。

# ln -s readme.txt readme.txt.SoftLink
# ls -li
總計 8
9406547 -rw-------. 1 root root 1167 10月  8 13:47 anaconda-ks.cfg
8414221 -rw-r--r--. 1 root root    0 11月 19 11:21 readme.txt
8414222 lrwxrwxrwx. 1 root root   10 11月 19 11:23 readme.txt.SoftLink -> readme.txt

# rm -f readme.txt

# ls -li
總計 8
9406547 -rw-------. 1 root root 1167 10月  8 13:47 anaconda-ks.cfg
8414222 lrwxrwxrwx. 1 root root   10 11月 19 11:27 readme.txt.SoftLink -> readme.txt
//表示錯誤


# cat readme.txt.SoftLink
cat: readme.txt.SoftLink: 沒有此一檔案或目錄



八、inode的特殊作用
由於inode號碼與檔名分離,這種機制導致了一些Unix/Linux系統特有的現象。
  1. 有時,檔名包含特殊字元,無法正常刪除。這時,直接刪除inode節點,就能起到刪除檔案的作用。
  2. 移動檔案或重新命名檔案,只是改變檔名,不影響inode號碼。
  3. 開啟一個檔案以後,系統就以inode號碼來識別這個檔案,不再考慮檔名。因此,通常來說,系統無法從inode號碼得知檔名。這點使得軟體更新變得簡單,可以在不關閉軟體的情況下進行更新,不需要重啟。因為系統通過inode號碼,識別執行中的檔案,不通過檔名。更新的時候,新版檔案以同樣的檔名,生成一個新的inode,不會影響到執行中的檔案。等到下一次執行這個軟體的時候,檔名就自動指向新版檔案,舊版檔案的inode則被回收。





------------------------------------------------------分割區使用狀況及掛載狀態


LVM 的全名是 Logical Volume Manager,邏輯捲軸管理員。之所以稱為『捲軸』可能是因為可以將 filesystem 像捲軸一樣伸長或縮短之故!LVM 的作法是將幾個實體的 partitions (或 disk) 透過軟體組合成為一塊看起來是獨立的大磁碟 (VG) , 然後將這塊大磁碟再經過分割成為可使用分割槽 (LV), 最終就能夠掛載使用了。
使用 LVM 可在分割磁區時不必一次分割大量空間給各個 Partition,等日後哪個磁區空間不足時再分配之前未分配的空間或新增一顆硬碟來配給使用。

Physical Volume, PV, 實體捲軸:
作為 LVM 最基礎的物理捲軸,可以是 partition 也可以是整顆 disk。

Volume Group, VG, 捲軸群組:
將許多的 PV 整合成為一個捲軸群組 (VG),這就是所謂的最大的主要大磁碟。 讀者應該知道磁碟的最小儲存單位為 sector,目前主流 sector 為 512bytes 或 4K。而 LVM 也有最小儲存單位, 那就是 Physical Extent (PE),所有的資料都是透過 PE 在 VG 當中進行交換的。

Physical Extent, PE, 實體範圍區塊:
PE 是整個 LVM 最小的儲存區塊,系統的檔案資料都是藉由寫入 PE 來處理的。 簡單的說,這個 PE 就有點像檔案系統裡面的 block 。PE 預設需要是 2 的次方量,且最小為 4M 才行。

Logical Volume, LV, 邏輯捲軸:
最終將 VG 再切割出類似 partition 的 LV 即是可使用的裝置了。 LV 是藉由『分配數個 PE 所組成的裝置』,因此 LV 的容量與 PE 的容量大小有關。



# fdisk -l                //manipulate disk partition table
Disk /dev/sda: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x6ae82c81

所用裝置   可開機   Start     結束     磁區 Size Id 類型
/dev/sda1  *         2048  2099199  2097152   1G 83 Linux
/dev/sda2         2099200 20971519 18872320   9G 8e Linux LVM

Disk /dev/mapper/cl-root: 8 GiB, 8585740288 bytes, 16769024 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/cl-swap: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes



# ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

# df -Th                // report file system disk space usage
檔案系統                        類型          容量      已用      可用         已用%     掛載點
devtmpfs                        devtmpfs      2.9G     0              2.9G        0%         /dev
tmpfs                              tmpfs            2.9G     0              2.9G        0%         /dev/shm
tmpfs                              tmpfs            2.9G     9.0M       2.9G        1%         /run
tmpfs                              tmpfs            2.9G     0              2.9G        0%         /sys/fs/cgroup
/dev/mapper/cl-root       xfs                8.0G      1.8G        6.2G       23%        /
/dev/sda1                       xfs                1014M   282M      733M      28%         /boot
tmpfs                             tmpfs             579M     0              579M      0%         /run/user/0






# ls /root
anaconda-ks.cfg  fix-dnf_repo-CentOS8.sh  readme.txt.HardLink  readme.txt.SoftLink

# du -h /root                //estimate file space usage
32K     /root



------------------------------------------------------檔案系統權限
Owner
Group
Other  

r    100    4
w   010    2
x    001    1

每一個檔案均有一個 Owner,僅有 root 與 owner 可以更改檔案存取保護模式 --> chmod
                                                    只有 root 可以更改檔案的 Owner 與 Group         -->chown



# ls -l /etc/shadow
----------. 1 root root 787 11月 17 14:36 /etc/shadow
// ---------- 全關,只有 root 可以改

# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 33600  4月  7  2020 /usr/bin/passwd

密碼在系統檔中,本應只有 root 可以改
為了方便使用者可以自行設定密碼,所以改由使用者執行
即暫時將使用者身分提升至 root,完成工作後再自動降回使用者身分
但若故意將密碼設的太長造成溢位,無法完成設定密碼工作,就會一直在 root 身分




------------------------------------------------------打包、壓縮、解壓縮

# du /etc
...
24492   /etc



//tar - an archiving utility
//-c, --create   Create  a  new  archive.
//-x, --extract  Extract  files from an archive. 
// -f, --file=ARCHIVE  Use archive file or device ARCHIVE.
//-z, --gzip, --gunzip, --ungzip   Filter the archive through gzip(1).

//c:打包   v:顯示運作過程   f:指定檔案名稱  z:壓縮
# tar cvfz test.tar.gz /etc

# ls -l
總計 5448
-rw-------. 1 root root    1167 10月  8 13:47 anaconda-ks.cfg
-rw-r--r--. 1 root root 5568963 11月 19 15:40 test.tar.gz



# mkdir etc_bk
# mv test.tar.gz etc_bk

# cd ./etc_bk
# ls
test.tar.gz

# tar xvfz test.tar.gz

# ls -l
總計 5452
drwxr-xr-x. 83 root root    8192 11月 19 13:49 etc
-rw-r--r--.  1 root root 5568963 11月 19 15:40 test.tar.gz




------------------------------------------------------ 網路
HostOS:
windows10    172.31.145.100     MAC Address 24-4B-FE-E8-E6-06

GuestOS:
CentOS8.2    172.31.145.99



//Windows10 ,無法 ping
Windows 系統 --> 控制台 --> Windows Defender 防火牆 --> 進階設定 --> 輸入規則 -->
檔案及印表機共用 (回應要求 - ICMPv4-In) - 私人  -->  右鍵 -->啟用規則

 # ping 172.31.145.100
PING 172.31.145.100 (172.31.145.100) 56(84) bytes of data.
64 bytes from 172.31.145.100: icmp_seq=1 ttl=128 time=0.240 ms
...
^C
--- 172.31.145.100 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2031ms
rtt min/avg/max/mdev = 0.205/0.245/0.292/0.040 ms







------------------------------------------------------網卡

# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=ens33
UUID=faff608e-1af3-4d6d-a3f8-85123c116ffd
DEVICE=ens33
ONBOOT=yes
IPADDR=172.31.147.99
PREFIX=24
GATEWAY=172.31.147.254
DNS1=163.28.136.21
DOMAIN=168.95.1.1
IPV6_PRIVACY=no




# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:a9:bc:b0 brd ff:ff:ff:ff:ff:ff
    inet 172.31.147.99/24 brd 172.31.147.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 2001:288:8241:1::33f/128 scope global dynamic noprefixroute
       valid_lft 604568sec preferred_lft 604568sec
    inet6 2001:288:8241:1:20c:29ff:fea9:bcb0/64 scope global dynamic noprefixroute
       valid_lft 2591925sec preferred_lft 604725sec
    inet6 fe80::20c:29ff:fea9:bcb0/64 scope link noprefixroute
       valid_lft forever preferred_lft forever




//maddress - multicast address.
# ip maddr
1:      lo
        inet  224.0.0.1
        inet6 ff02::1
        inet6 ff01::1
2:      ens33
        link  01:00:5e:00:00:01
        link  33:33:00:00:00:01
        link  33:33:ff:a9:bc:b0
        link  33:33:ff:00:02:76
        inet  224.0.0.1
        inet6 ff02::1:ff00:276
        inet6 ff02::1:ffa9:bcb0 users 2
        inet6 ff02::1
        inet6 ff01::1






//  -s, -stats, -statistics            link   - network device.
# ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    RX: bytes  packets  errors  dropped overrun mcast
    0          0        0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    0          0        0       0       0       0
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:a9:bc:b0 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    207086     1990     0       10      0       0
    TX: bytes  packets  errors  dropped carrier collsns
    80785      448      0       0       0       0




//Bring up interface x.
# ip link set ens33 up                //啟用網路介面卡   up:開    down:關



# ip route
default via 172.31.147.254 dev ens33 proto static metric 100
172.31.147.0/24 dev ens33 proto kernel scope link src 172.31.147.99 metric 100






//nmcli - command-line tool for controlling NetworkManager
# nmcli device status
DEVICE  TYPE      STATE     CONNECTION
ens33   ethernet  已連線    ens33
lo      loopback  不受管理  --



//啟用網卡   停用網卡:disconnect
# nmcli device connect ens33
裝置「ens33」已成功以「faff608e-1af3-4d6d-a3f8-85123c116ffd」啟用。





// nmtui - Text User Interface for controlling NetworkManager
# nmtui
//先進行 PieTTY 設定:選項 --> 亞洲語系修正 --> Unicode 亞洲寬符號字元 (取消)






------------------------------------------------------路由
# ip route | column -t
default                 via  172.31.147.254  dev    ens33   proto   static  metric  100
172.31.147.0/24  dev  ens33                 proto  kernel  scope  link    src        172.31.147.99  metric  100


# ip route | column -t>kkRouteTable.txt

# ls
anaconda-ks.cfg  kkRouteTable.txt  test.tar.gz

# cat kkRouteTable.txt




//IPv6 Route Table
# ip -6 route | column -t
::1                   dev  lo                        proto  kernel  metric  256  pref    medium
2001:288:8241:1::276  dev  ens33                     proto  kernel  metric  100  pref    medium
2001:288:8241:1::/64  dev  ens33                     proto  ra      metric  100  pref    medium
fe80::/64             dev  ens33                     proto  kernel  metric  100  pref    medium
default               via  fe80::ea1c:baff:fec9:968  dev    ens33   proto   ra   metric  100     pref  medium



//tracepath, tracepath6 - traces path to a network host discovering MTU along this path
//對應traceroute
# tracepath 168.95.1.1
 1?: [LOCALHOST]                      pmtu 1500
 1:  _gateway                                              0.853ms
 1:  _gateway                                              0.924ms
 2:  10.241.3.153                                          1.570ms
 3:  192.192.69.248                                        7.018ms
 4:  192.192.69.240                                        9.348ms
...





// ss - another utility to investigate sockets
//-a, --all    Display both listening and non-listening (for TCP this  means  established
              connections) sockets.

//-n, --numeric      Do  not try to resolve service names.
// -t, --tcp     Display TCP sockets.
//-p, --processes    Show process using socket.


//對應 netstat -antp
# ss -antp
State       Recv-Q    Send-Q                Local Address:Port                                   Peer Address:Port    Process
LISTEN      0         128                         0.0.0.0:22                                          0.0.0.0:*        users:(("sshd",pid=14945,fd=4))
ESTAB       0         52                    172.31.147.99:22                                    172.31.147.21:52793    users:(("sshd",pid=1601,fd=5),("sshd",pid=1586,fd=5))
LISTEN      0         128                            [::]:22                                             [::]:*        users:(("sshd",pid=14945,fd=6))
LISTEN      0         32                                *:21                                                *:*        users:(("vsftpd",pid=14015,fd=4))
TIME-WAIT   0         0            [2001:288:8241:1::276]:51080       [2001:e10:2000:240:e643:4bff:fee8:a63c]:80 
...


# ss -t
State    Recv-Q    Send-Q       Local Address:Port        Peer Address:Port     Process
ESTAB    0         52           172.31.147.99:ssh        172.31.147.21:52793





------------------------------------------------------
//systemctl - Control the systemd system and service manager

//查詢目前所有已啟動的服務
# systemctl list-units
UNIT                                                                LOAD   ACTIVE SUB       DESCRIPTION
proc-sys-fs-binfmt_misc.automount                                   loaded active waiting   Arbitrary Executable File>
sys-devices-pci0000:00-0000:00:07.1-ata2-host1-target1:0:0-1:0:0:0-block-sr0.device loaded active plugged   VMware_ID>
...


# systemctl list-units | grep firewalld
firewalld.service                                                                   loaded active running   firewalld - dynamic firewall daemon




//查詢服務啟動或是關閉狀態,以檔名顯示
# systemctl list-unit-files
UNIT FILE                                  STATE
proc-sys-fs-binfmt_misc.automount          static
-.mount                                    generated
boot.mount                                 generated
dev-hugepages.mount                        static


# systemctl list-unit-files | grep firewalld
firewalld.service 




# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enab>
   Active: active (running) since Thu 2021-12-09 09:29:03 CST; 2h 19min ago
     Docs: man:firewalld(1)
 Main PID: 14781 (firewalld)
    Tasks: 3 (limit: 34168)
   Memory: 27.7M
   CGroup: /system.slice/firewalld.service
           └─14781 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid

12月 09 09:29:03 centos.kk systemd[1]: firewalld.service: Succeeded.
...






# systemctl stop firewalld.service                   //立即停止xxx.service
# systemctl start firewalld.service                  //立即啟動xxx.service
# systemctl is-active firewalld.service
active



//設定開機不啟動xxx.service
# systemctl disable firewalld.service
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

//設定開機啟動xxx.service
# systemctl enable firewalld.service
Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service.
Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.

# systemctl is-enabled firewalld.service
enabled



# chkconfig firewalld off                             //設定 firewalld 開機時不要啟動
# chkconfig firewalld on                             //設定 firewalld 開機時啟動,且不加.service






------------------------------------------------------SELINUX
# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      33



////關閉SELINUX
# vi /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
#SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted




查看由 systemd 所管理服務的日誌記錄
------------------------------------------------------日誌
# man journald.conf




//查看指定系統服務的日誌
# journalctl -u ssh.d
-- Logs begin at Mon 2021-12-13 07:50:40 CST, end at Mon 2021-12-13 07:51:31 CST. --
-- No entries --



////日誌檢視說明
# journalctl
-- Logs begin at Fri 2021-12-10 08:03:40 CST, end at Fri 2021-12-10 08:04:24 CST. --
12月 10 08:03:40 centos.kk kernel: Linux version 4.18.0-348.2.1.el8_5.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gc>
12月 10 08:03:40 centos.kk kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-348.2.1.el8_5.x86_64 root=/de>
12月 10 08:03:40 centos.kk kernel: Disabled fast string operations
...



//列出最後5行資料
# journalctl -n5
-- Logs begin at Mon 2021-12-13 07:50:40 CST, end at Mon 2021-12-13 08:06:44 CST. --
12月 13 08:06:43 centos.kk dnf[1700]: CentOS Linux 8 - BaseOS                         6.6 >
12月 13 08:06:44 centos.kk dnf[1700]: CentOS Linux 8 - Extras                         2.8 >
12月 13 08:06:44 centos.kk dnf[1700]: 已建立中介資料快取。
12月 13 08:06:44 centos.kk systemd[1]: dnf-makecache.service: Succeeded.
12月 13 08:06:44 centos.kk systemd[1]: Started dnf makecache.



//持續列出最後10行事件記錄
# journalctl --follow
-- Logs begin at Mon 2021-12-13 07:50:40 CST. --
12月 13 07:51:21 centos.kk systemd[1622]: Starting D-Bus User Message Bus Socket.
12月 13 07:51:21 centos.kk systemd[1622]: Listening on D-Bus User Message Bus Socket.
12月 13 07:51:21 centos.kk systemd[1622]: Reached target Sockets.
12月 13 07:51:21 centos.kk systemd[1622]: Reached target Basic System.
12月 13 07:51:21 centos.kk systemd[1622]: Reached target Default.
12月 13 07:51:21 centos.kk systemd[1622]: Startup finished in 150ms.
12月 13 07:51:21 centos.kk systemd[1]: Started User Manager for UID 0.
12月 13 07:51:21 centos.kk systemd[1]: Started Session 1 of user root.
12月 13 07:51:21 centos.kk sshd[1615]: pam_unix(sshd:session): session opened for user root by (uid=0)
12月 13 07:51:31 centos.kk systemd[1]: systemd-hostnamed.service: Succeeded.
...
^C


# tail -n 5 -f /var/log/messages
Dec 13 07:51:21 centos systemd[1]: Started Session 1 of user root.
Dec 13 07:51:31 centos systemd[1]: systemd-hostnamed.service: Succeeded.
Dec 13 08:05:59 centos systemd[1]: Starting Cleanup of Temporary Directories...
Dec 13 08:05:59 centos systemd[1]: systemd-tmpfiles-clean.service: Succeeded.
Dec 13 08:05:59 centos systemd[1]: Started Cleanup of Temporary Directories.






排程
------------------------------------------------------(一)使用者的設定
# man whereis
...
DESCRIPTION
       whereis locates the binary, source and manual files for the specified command names. 
...


# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz



//crontab - maintains crontab files for individual users
//-e     Edits the current crontab using the editor specified by the VISUAL or EDI‐
              TOR environment variables.  After you exit from the editor,  the  modified
              crontab will be installed automatically.

# crontab -e
14 0  * * * root /usr/bin/ls


//-l     Displays the current crontab on standard output.
# crontab -l
14 0  * * * root /usr/bin/ls


# cat /var/spool/cron/root
14 0  * * * root /usr/bin/ls

# journalctl -n 10
-- Logs begin at Mon 2021-12-13 13:43:53 CST, end at Mon 2021-12-13 14:05:37 CST. --
12月 13 14:01:01 centos.kk CROND[1793]: (root) CMD (run-parts /etc/cron.hourly)
12月 13 14:01:01 centos.kk run-parts[1796]: (/etc/cron.hourly) starting 0anacron
12月 13 14:01:01 centos.kk anacron[1802]: Anacron started on 2021-12-13
12月 13 14:01:01 centos.kk anacron[1802]: Will run job `cron.daily' in 31 min.
12月 13 14:01:01 centos.kk anacron[1802]: Jobs will be executed sequentially
12月 13 14:01:01 centos.kk run-parts[1804]: (/etc/cron.hourly) finished 0anacron
12月 13 14:03:36 centos.kk crontab[1809]: (root) BEGIN EDIT (root)
12月 13 14:04:22 centos.kk crontab[1811]: (root) BEGIN EDIT (root)
12月 13 14:04:37 centos.kk crontab[1811]: (root) END EDIT (root)
12月 13 14:05:37 centos.kk crontab[1815]: (root) LIST (root)

# cat /var/log/cron
Dec 13 14:04:22 centos crontab[1811]: (root) BEGIN EDIT (root)
Dec 13 14:04:37 centos crontab[1811]: (root) END EDIT (root)
Dec 13 14:05:37 centos crontab[1815]: (root) LIST (root)


# tail /var/log/cron
Dec 13 14:01:01 centos CROND[1793]: (root) CMD (run-parts /etc/cron.hourly)
Dec 13 14:01:01 centos run-parts[1793]: (/etc/cron.hourly) starting 0anacron
Dec 13 14:01:01 centos anacron[1802]: Anacron started on 2021-12-13
Dec 13 14:01:01 centos anacron[1802]: Will run job `cron.daily' in 31 min.
Dec 13 14:01:01 centos anacron[1802]: Jobs will be executed sequentially
Dec 13 14:01:01 centos run-parts[1793]: (/etc/cron.hourly) finished 0anacron
Dec 13 14:03:36 centos crontab[1809]: (root) BEGIN EDIT (root)
Dec 13 14:04:22 centos crontab[1811]: (root) BEGIN EDIT (root)
Dec 13 14:04:37 centos crontab[1811]: (root) END EDIT (root)
Dec 13 14:05:37 centos crontab[1815]: (root) LIST (root)





排程
------------------------------------------------------(二)系統的設定檔
# vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

53 14 * * * root /usr/bin/ls




# systemctl list-units | grep cron
crond.service                                                                     loaded active running   Command Scheduler



# systemctl restart crond.service

# tail /var/log/cron
Dec 13 14:52:58 centos crond[1912]: (CRON) STARTUP (1.5.2)
Dec 13 14:52:58 centos crond[1912]: (CRON) INFO (Syslog will be used instead of sendmail.)
Dec 13 14:52:58 centos crond[1912]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 44% if used.)
Dec 13 14:52:58 centos crond[1912]: (CRON) INFO (running with inotify support)
Dec 13 14:52:58 centos crond[1912]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
Dec 13 14:53:01 centos CROND[1914]: (root) CMD (/usr/bin/ls)
...



# journalctl -n 10
-- Logs begin at Mon 2021-12-13 13:43:53 CST, end at Mon 2021-12-13 14:53:01 CST. --
12月 13 14:52:58 centos.kk crond[1912]: (CRON) STARTUP (1.5.2)
12月 13 14:52:58 centos.kk crond[1912]: (CRON) INFO (Syslog will be used instead of sendma>
12月 13 14:52:58 centos.kk crond[1912]: (CRON) INFO (RANDOM_DELAY will be scaled with fact>
12月 13 14:52:58 centos.kk crond[1912]: (CRON) INFO (running with inotify support)
12月 13 14:52:58 centos.kk crond[1912]: (CRON) INFO (@reboot jobs will be run at computer'>
12月 13 14:53:01 centos.kk CROND[1914]: (root) CMD (/usr/bin/ls)
12月 13 14:53:01 centos.kk CROND[1913]: (root) CMDOUT (anaconda-ks.cfg)
12月 13 14:53:01 centos.kk CROND[1913]: (root) CMDOUT (kkRouteTable.txt)
12月 13 14:53:01 centos.kk CROND[1913]: (root) CMDOUT (locates the binary, source and manu>
12月 13 14:53:01 centos.kk CROND[1913]: (root) CMDOUT (test.tar.gz)



date
------------------------------------------------------
# date
一 12月 13 15:07:33 CST 2021


// 更改日期間:  MMDDhhmmYYYY  月日時分年
# date 121315062021
一 12月 13 15:06:00 CST 2021


//查看 BIOS 時間
# hwclock -r
2021-12-13 15:08:52.769105+08:00


//將電腦日期時間寫入到 BIOS 時間
# hwclock -w


------------------------------------------------------



------------------------------------------------------