用戶身份與文件的權限(普通權限、特殊權限、隱藏權限和文件控制列表ACL)

用戶身份

? ? ? ??root用戶是存在于所有類UNIX操作系統中的超級用戶,它擁有最高的系統所有權。root用戶的用戶身份號碼UID為0,UID相當于用戶的身份證號碼一樣,具有唯一性。管理員用戶(超級用戶)UID為0;系統用戶UID為1~999(不同的系統不一樣),Linux系統為了避免因某個服務程序出現漏洞而被黑客提權至整個服務器,默認服務會有獨立的系統用戶負責運行,進而有效控制被破壞的范圍(windows是單用戶操作系統,一旦該用戶被入侵,則有權限對整個環境進行操作),系統用戶只是用來管理某一項具體的服務,因此不需要登陸該系統服務器中,其終端解釋器為/sbin/nologin,因此該用戶被入侵時,并不能提權至整臺服務器;普通用戶的UID從1000開始(即使前面有閑置的號碼),是由管理員創建的日常工作的用戶。

? ? ? ? 用戶組分為基本用戶組(-g)和擴展用戶組(-G)。用戶組身份號碼GID可以把多個用戶加入到同一個組中,從而方便為組中的用戶統一規劃權限或指定任務。創建每個用戶時,將自動創建一個與其同名的基本用戶組,而且這個基本用戶組只有該用戶一個人。如果該用戶被納入其它用戶組,則這個其它用戶組稱之為擴展用戶組。一個用戶只能擁有一個基本用戶組,可以擁有多個擴展用戶組。 用id命令可以查看:用戶的用戶身份號碼(用戶名);基本用戶組身份號碼(基本用戶組名);擴展用戶組身份號碼(擴展用戶組名)。在默認情況下,基本用戶組名與用戶名一樣,除非自己指定。

? ? ? ? ?useradd命令 ?用于創建新的普通用戶,該命令創建的用戶目錄默認會存放在/home目錄中,默認的shell解釋器為/bin/bash,而且會默認創建一個與其同名的基本用戶組。 ?-d 指定家目錄 ?-u指定用戶的UID ?-g指定一個基本用戶組(必須是存在的組,沒有就要創建) ?-G指定擴展用戶組 ? -N不創建與用戶同名的基本用戶組 ?-s指定用戶的shell解釋器 ? useradd -d /home/linux -u 8888 -s /sbin/nologin linuxprobe ?創建了一個名為linuxprobe的用戶 ? # id linuxprobe ?輸出為:uid=8888(linuxprobe) gid=8888(linuxprobe) groups=8888(linuxprobe) ?此時用戶只有基本用戶組(名字為linuxprobe),沒有擴展用戶組 ? ?

? ? ? ? ?groupadd命令 ?用于創建組(基本或者擴展) ? ?groupadd zsx ? ? 創建一個名為zsx的組

? ? ? ? ?usermod命令 ?修改用戶的屬性 ?用戶的信息保存在/etc/passwd文件中,可以直接用文本編輯器來修改其中的用戶參數項目,也可以用usermod命令來修改已經創建的用戶信息,如用戶的UID、基本/擴展用戶組、默認終端等。-g 變更基本用戶組 ? -G 變更擴展用戶組 ? -s變更默認終端? ?-u修改用戶的UID? ? ?usermod -G root linuxprobe 增加擴展用戶組root, 則id查看信息為: uid = 8888 (linuxprobe)? gid=8888? (linuxprobe)? groups=8888(linuxprobe),0(root) ? 可見其擴展用戶組名為root,擴展用戶組身份號碼為0。這里在次變更: usermod -G zsx linuxprobe ?變為: ?uid=8888(linuxprobe)? gid= 8888 (linuxprobe)??? groups = 8888(linuxprobe) ,1001(zsx)

? ? ? ? passwd命令? ? passwd命令用于修改用戶的密碼,格式:passwd ?用戶名 ?僅僅只有passwd,則為修改自己的密碼。? ?-l 鎖定用戶,禁止其登陸 ? -u解除鎖定,允許其登陸 ? passwd -l luciusvorenus ? ?--stdin 允許通過管道符方式來設定用戶密碼 ? ? echo "zsx" | passwd --stdin luciusvorenus?

? ? ? ? userdel命令 刪除用戶 ? userdel linuxprobe 刪除該用戶,但是家目錄/home/linuxprobe會保留下來,可添加-r參數,連同家目錄一起刪除 ? ?-f 強制刪除用戶

文件權限與歸屬
? ? ? ? -為普通文件(一般文件、文本文件);d為目錄文件;l為軟鏈接文件;b為塊設備文件;c為字符設備文件(設備文件為硬件映射形成的文件,如硬盤等);p為管道文件;s為socket文件。

? ? ? ? 文件的所有者(所屬主)、所屬組和其它用戶對該文件所擁有的可讀(r,4)、可寫(w,2)和可執行(x,1)等權限。對目錄文件來說,可讀表示能夠讀取目錄內的文件列表;可寫表示能夠在目錄內新增、刪除和重命名 文件;可執行表示能夠進入該目錄。 文件的權限表示:rwxrw-r-- ?用數字表示則為: 764? ? ?-rwxr--r--. 1 root root 206 Sep 29 21:24 ex.sh? ? 該文件為普通文件,所屬主(所有者)為root用戶,擁有7權限;所屬組為root,擁有4權限;其他用戶擁有權限4。所屬主前面的數字1代表該文件的硬鏈接數(即實際指針的文件個數,軟鏈接不算)為1個。該文件的磁盤占用大小為206個字節,最后一次修改的時間為9月29日的21:24分,文件的名稱為ex.sh。

SUID特殊權限位(u+s)
? ? ? ? SUID、SGID和SBIT的特殊權限位,是一種對文件進行設置的特殊功能,可以與一般權限同時使用,以彌補一般權限不能實現的功能。SUID擁有權限4,SGID擁有權限2,SBIT擁有權限1。rwsrwSrw-用數字表示為:其一般權限為rwxrw-rw-,即為766,載加上特殊權限,則為6766。第一個6為4+2。SUDI特殊權限位僅對擁有執行權限的二進制程序有效,即當用戶執行該二進制程序時,可以臨時擁有該二進制程序所屬主(所有者)的身份。對于/etc/passwd ?-rw-r--r--. 1 root root 1926 Sep 29 21:50 /etc/passwd? ? ?除了root管理員之外,其余所有用戶都只能讀取該文件信息,不能修改;對于/etc/shadow(保存了用戶的密碼)
----------. 1 root root 1990 Sep 29 18:48 /etc/shadow ?除了root用戶外,其余任何用戶都不能讀取、修改該文件; 對于passwd命令文件:-rwsr-xr-x. 1 root root 27832 Jan 29 ?2014 /bin/passwd ?該文件是二進制程序文件,所有用戶都可以執行該文件,因此任何一個用戶執行該文件時,都會臨時獲得該文件所屬主的身份,即root身份,進一步利用該身份可以取修改/etc/shadow和/etc/passwd文件的信息了(把變更的密碼信息寫到/etc/shadow文件中)。 rwx變為rws ?rw-變為rwS ?后面一樣 rwt ?rwT

SGID特殊權限位(g+s)

? ? ? ? SGID特殊權限位實現兩種功能:1.讓執行者臨時擁有屬組的權限(身份)(僅對擁有執行權限的二進制程序有效);2.對目錄文件進行設置時,在該目錄文件中創建的文件自動繼承該目錄的用戶組(只可以對目錄設置)。對于/dev/kmem文件(早期的linux系統才會有):cr--r----- 1 root system 2, 1 Feb 11 2017 kmem ?該文件為字符設備文件,只有root用戶和system組內的用戶才可以讀取該文件,其余用戶不能訪問。ps命令文件: ? ?-rwxr-sr-x. 1 bin system 100120 Feb 27 ?2014 /usr/bin/ps ?該文件為二進制程序,當任何一個用戶執行該文件時,可以臨時獲得所屬組的身份(system),從而可以讀取kmem文件中的信息,獲得系統中所有進程的狀態信息。利用SGID特殊權限位,可以為一個部門內部所有用戶設置一個共享目錄,即首先將所有用戶劃分為一個組,然后設置這個目錄的用戶組就為該部門成員所在的那個組:# mkdir /tmp/haha ? ? ? drwxrwxr-x. 2 root root 6? Mar ?5 15:46 haha? 可以看出該目錄文件的用戶組為root,則root組內的用戶都可以該目錄讀、寫和執行。賦予該目錄SGID特殊權限位: chmod g+s /tmp/haha ? 則:drwxrwsr-x. 2 root root 6 Mar ?5 15:46 haha ?則root組內任何一個用戶在該目錄內部創建文件時,創建的文件的所屬組都為root,從而該文件能夠被組內所有用戶訪問,即實現了組內用戶的共享目錄。 ? 注意:在對目錄設置SGID權限之前目錄內的所有文件的所屬組在設置SGID權限后不會發生變化。比如:chown root:bin /tmp/haha ? 此后,創建的文件的所屬組為bin ?之前的文件依然為root ? ?在默認情況下,一個用戶創建的文件的所屬主為該用戶,所屬組為該用戶的基本用戶組。一個用戶的基本用戶組只有該用戶一個成員,且默認情況下組名與用戶名相同。 ?當創建或傳送一個文件,這個文件的所屬主就為執行這個操作的用戶。

chmod和chown命令

? ? ? ? chmod命令用于設置一個文件的權限位,包括一般權限和特殊權限。對于文件zs,所有者可讀可寫可執行,對于所屬組可讀可寫,對于其它用戶沒有任何權限,即rwxrw----,其對應的數字為760,則:chmod 760 zs ?要設置為:rwsrw----,則: chmod 4760 zs chown命令用于設置文件的所有者和所屬組。其格式為:chown ?所有者:所屬組 文件或目錄名稱? ?chown bin:root zs ?設置zs文件的所有者為bin,所屬組為root ?
? ? ? ? SUID特殊權限位的設置: chmod ?u+s 文件名稱(僅對可執行的二進制程序文件有效)
? ? ? ? SGID特殊權限位的設置: chmod ?g+s 文件名稱(僅對可執行的二進制程序文件有效)
? ? ? ? ? ? ? ? ? ? ? ?chmod ?g+s 目錄名稱(僅對目錄文件有效)
? ? ? ? SBIT特殊權限位的設置: chmod ?o+t 目錄名稱
共性:chmod與chown命令在對目錄文件進行操作時,加上-R參數表示遞歸操作,即對目錄內所有的文件進行整體操作。不加-R參數,只是對目錄進行設置。
u 代表所屬主 ?g代表所屬組 ?o代表其它用戶 a代表全部用戶, 如 chmod u+x ex.sh 表示對ex.sh文件的所屬主增加執行權限(x)。 ?r w x s t 也可以用字母指明,可以不用數字 ? chmod +x file 和 chmod a+x file等價。

SBIT特殊權限位(o+t) ?僅對目錄設置
? ? ? ? 對于一個共享目錄,在設置了SGID特殊權限位后,該目錄及目錄內部創建的所有文件的用戶組都為該部門成員。為了防止一個人的文件被其他用戶刪除,則可以設置SBIT特殊權限位。SBIT特殊權限位可以確保用戶只能刪除自己的文件,不能刪除他人的文件(root用戶除外),即只能被文件的所有者執行刪除操作。?如RHEL7系統中的/tmp為一個共享目錄,默認已經設置好了SBIT特殊權限位:?drwxrwxrwt. 61 root root 4096 Oct ?6 22:35 /tmp? ? ?則,在該目錄中創建的文件只能夠被該文件的所有者和root用戶刪除,其余人都沒有權限刪除。 即使該文件的權限最大(777),且目錄允許進行讀、寫和執行,但還是無法刪除該文件。
? ? ? ? 另外需要注意,一個文件能否被刪除不取決于自身的權限,而取決于其所在目錄是否有寫入權限。如 /tmp/haha目錄: drwxr-sr-x. 2 root root 16 Mar ?5 16:18 haha ?可見對與該文件,只有root用戶有寫入權限,即新增、重命名和刪除目錄內的文件,其它任何用戶都不能在該目錄內部創建、刪除或者重命名文件,只能進入該目錄和讀取該目錄內部的文件列表。 ?chmod 775 haha ? 則:drwxrwsr-x. 2 root root 6 Mar ?5 16:43 haha ? 則此時root組內成員增加了寫權限,而賬戶zsx為root組內成員,此時zsx用戶可以在目錄內部新增、重命名和刪除文件。 ? 綜上,對文件的刪除、新增和重命名并不取決于文件本身,而是取決于文件所在的目錄。? ? ?chmod o+t /tmp/zsx

文件的隱藏權限
? ? ? ? 文件被隱藏起來的權限,默認情況下不能被用戶察覺。
? ? ? ? chattr命令用于設置(增加或刪除)文件的隱藏權限: chattr +參數 filename 增加隱藏權限 ?chattr -參數? filename 刪除隱藏權限 ? ?i 無法對文件進行修改(本身無法刪除,內容無法修改),對于目錄文件,僅能修改其中的子文件內容,不能新建或刪除文件。 ?a 僅允許補充(追加)內容,不能覆蓋/刪除內容,也不能刪除該文件或對文件重命名。 ? ? chattr +a zs 此時zs文件所在的目錄即使開放了用戶可以刪除文件的權限,但是該文件依然不能刪除,因為設置了隱藏權限。 移出: chattr -a zs? ? ? lsattr filename 用于查看文件的隱藏權限 ?ls命令是無法查看文件的隱藏權限的。

文件訪問控制列表ACL
? ? ? ? 用于對某個指定的用戶(u)或用戶組(g)進行單獨的權限設置,基于普通文件或者目錄文件設置ACL其實就是針對指定的用戶或用戶組設置文件或目錄的操作權限。如果針對目錄設置了ACL且采用了-R參數,則目錄中的文件會繼承其ACL;若針對文件設置了ACL,則文件不再繼承其所在目錄的ACL。
? ? ? ? setfacl命令 用于設置文件的ACL(文件訪問控制列表),對于普通文件采用-m參數即可;對于目錄文件若采用-m參數,則僅僅只是對目錄文件進行ACL的設置,對目錄內的其余文件沒有影響(注意,必須清晰目錄權限與目錄內部文件的權限之間的區別與聯系,嚴格遵守),若采用-Rm參數,則對目錄和目錄內部所有文件都設置ACL,即對于某個特定的用戶或用戶組有哪些權限,如果目錄內部已經有文件設置了ACL,則該文件不再繼承目錄的ACL。setfacl -b filename 用于刪除對文件已經設置好了的ACL。下面示例:
setfacl -m u:zsx:rx /root?
setfacl -Rm u:zsx:rwx /root/work/ ? ? ?對/root/work目錄設置ACL u指定用戶 g指定用戶組?
getfacl guess.sh ? ? ? ? guess.h文件是該目錄內部的文件,可見該文件繼承了目錄的ACL
# file: guess.sh ? 文件名
# owner: root ? ? 所屬主
# group: root ? ?所屬組
user::rw- ? ?
user:zsx:rwx
group::r--
mask::rwx ? 有效權限
other::r--
注意:zsx用戶要能進入到/root/work目錄,還必須對/root目錄也要設置ACL(上面第一條),若只是
對/root/work目錄進行設置,仍然進入不了該目錄。
getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:zsx:r-x
group::r-x
mask::r-x ??
other::---
getfacl /root/Desktop/
# file: root/Desktop/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x ? 可見目錄Desktop/并沒有繼承目錄/root的ACL,因為上面沒有使用-R參數
setfacl -b /root/
getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
group::r-x
other::--- ? 可見已經刪除了ACL
setfacl -m g:wheel:rwx work/ ? 針對wheel用戶組設置權限
getfacl work/
# file: work/
# owner: root
# group: root
user::rwx
group::r-x
group:wheel:rwx
mask::rwx
other::r-x
? ? getfacl命令 可以查看文件的所屬主、所屬組、各種權限和ACL權限。如查看/root目錄:
getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x ?所屬主權限
group::r-x ?所屬組權限
other::--- ? 其它用戶權限
如查看/root/work/:
getfacl work/
# file: work/
# owner: root
# group: root
user::rwx
group::r-x
group:wheel:rwx?
mask::rwx ? ?有效權限 ?
other::r-x

dr-xr-x---+ 17 root root 4096 Mar ?5 15:12 /root 采用ls命令可以查看文件是否設置了ACL,.號會變為+號。但是這也不是絕對的,如果文件的ACL是繼承了目錄的,那么用ls命令查看其屬性依然為.號,因此查看一個文件是否設置ACL,最準確的方法是使用getfacl命令。注意:某個用戶或用戶組的權限并不是只根據ACL配置來決定的,它是由該用戶或用戶組基本權限與配置的ACL權
限的“與”運算決定的,即other:r-x 與 wheel:rwx = wheel:r-x ?即實質上wheel組內的用戶對該目錄(上面的/root/work/目錄)只有讀和執行權限。對于有效權限mask:用戶或組所設置的權限必須要存在于mask的權限設置范圍內才會生效,否則無效。設置mask
的方法: setfacl -m m:w ?filenanme ?即設置文件filename的有效權限mask為w(寫)。

su命令與sudo服務(visudo)
? ? ? ? su命令可以解決切換用戶身份的要求。 su與su -是有區別的,前者只是切換了身份,但Shell環境仍然是原來用戶的Shell(環境不變);而后者連用戶和Shell環境一起切換成新用戶身份了。只有切換了Shell環境才不會出現PATH環境變量錯誤。
? ? ? ? sudo命令可以把特定命令的執行權限賦予給指定用戶,這樣既可以保證普通用戶完成特定的工作,又可以避免密碼的泄漏。sudo服務的配置原則:在保證普通用戶完成工作的前提下,應當盡量少賦予額外的權限。格式:sudo ?命令名稱 ?
? ? ? ? sudo命令具有如下功能:限制用戶執行指定的命令;記錄用戶執行的每一條命令;配置文件/etc/sudoers提供集中的用戶管理、權限與主機等參數;驗證密碼的后5分鐘內(默認值)無需再讓用戶再次驗證密碼。
? ? ? ? 對于/etc/sudoers文件:-r--r-----. 1 root root 4000 Jan 15 ?2014 /etc/sudoers ?可以看出,只有只有管理員用戶才可以對該配置文件進行修改,管理員和root組用戶可以對該文件查看。 ? ? ? ?sudo命令文件:---s--x--x. 1 root root 130712 Feb 26 ?2014 /usr/bin/sudo 該文件具有SUID特殊權限位,即任何用戶利用sudo命令都可以臨時獲得root管理員的身份,從而可以讀取和修改配置文件/etc/sudoers。如果擔心直接修改配置文件/etc/sudoers會出現問題,也可以使用sudo命令提供的visudo命令來配置用戶權
限,該命令在配置用戶權限時將禁止多個用戶同時修改sudoers配置文件,還可以對配置文件內參數進行語法檢查,并在發現參數錯誤時進行報錯。只有root管理員才可以使用visudo命令編輯sudo服務的配置文件。visudo命令配置sudo命令的配置文件/etc/sudoers時,其操作方法與Vim編輯器中用到的方法相同。綜上,sudo命令文件的服務配置文件為/etc/sudoers,可以直接進行編輯,也可以使用visudo命令進入編輯。
? ? sudo -h 列出幫助信息 ? ?sudo -l列出當前用戶可以執行的命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ?? # visudo
? ? (大約第99行:)
? ? root ? ? ? ? ? ? ? ALL=(ALL) ? ? ? ? ALL ? ? ? //可以再下面接著添加(配置)某個用戶的限制命令
誰可以使用 ?允許使用的主機=(以誰的身份) 可以執行的命令(必須用絕對路徑)
? ?luciusvorenus ? ? ?ALL=(ALL) ? ? ? /usr/bin/ls? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 允許使用的主機: 外部網絡或者內部網絡登陸進入系統,當采用ALL時,無論是本地還是遠程登陸的主機都可以允許使用規定的服務。
以誰的身份:ALL代表可以以任何用戶的身份,相當于root。 (ALL)=(root)
如果有多個命令,則命令之間用逗號進行間隔。在進行了以上配置以后,luciusvorenus用戶使用:sudo ls命令就相當于root用戶使用ls命令了,可以查看/root目錄內的內容等(初次使用sudo需要luciusvorenus用戶的密碼,默認時間為5分鐘,5分鐘內無需再讓用戶再次驗證密碼),如下:
# ls /root
ls: cannot open directory /root: Permission denied
# sudo ls /root
[sudo] password for luciusvorenus:?
anaconda-ks.cfg ?Desktop ?Documents ?Downloads?? ?gongxiang ?initial-setup-ks.cfg ?Music?? ?Pictures ?
Public ?Templates ?Videos ?work? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 為了避免用戶在輸入 sudo 命令 時頻繁的驗證用戶的密碼,可以將上面那一行內容改為如下內容:
luciusvorenus ? ? ?ALL=(ALL) ? ?NOPASSWD: ? ?/usr/bin/ls

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385469.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385469.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385469.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

存儲結構與磁盤劃分

文件系統層次化標準(FHS,file system hierarchy standard) 在windows操作系統中,要找到一個文件需要先進入該文件所在的磁盤分區(如C:\等 C:\ZSX\zsx.txt),然后在進入該分區下的一個具…

Linux中常用文件的含義

在Linux中配置了服務文件后,需要重啟該服務,配置信息才會生效。 /etc/passwd 保存了系統中所有用戶的信息,一旦用戶的登陸終端設置為/sbin/nologin,則不再允許登錄到系統 /etc/shadow與/etc/passwd均為用戶信息文件 /…

64. 最小路徑和

給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。 示例: 輸入: [[1,3,1],[1,5,1],[4,2,1] ] 輸出: 7 解釋: 因為路徑 1→3→1→1→1 的總和最小。…

Linux本地yum源配置以及使用yum源安裝各種應用程序

將軟件包傳送到Linux中后,掛載,然后配置yum軟件倉庫,最后就可以使用yum來安裝相應的應用程序了。假設掛載目錄為/tmp/ruanjianbao,則下面說明配置本地yum倉庫的過程: (1)cd /etc/yum.repos.d/…

gcc與g++編譯器

首先在Linux(RHEL7.0)上安裝gcc:yum install gcc gcc-c -y 其中gcc-c是為了能夠編譯c源代碼,即g。 gcc為Linux C/C下重要的編譯環境,是GUN項目中符合ANSIC標準的編譯系統, gcc可以編譯C、C、Objective-C、Java、Fortran、Pascal…

【Leetcode | 49】230. 二叉搜索樹中第K小的元素

給定一個二叉搜索樹,編寫一個函數 kthSmallest 來查找其中第 k 個最小的元素。 說明: 你可以假設 k 總是有效的,1 ≤ k ≤ 二叉搜索樹元素個數。 示例 1: 輸入: root [3,1,4,null,2], k 1 3 / \ 1 4 \ 2 輸出: 1 示例 2: 輸入…

gcc編譯器的整個工作過程

gcc hello.c ./a.out 或者 gcc hello.c -o hello ./hello ./表示執行當前目錄下的可執行程序或腳本程序。 首先gcc需要調用預處理程序cpp,由它負責展開在源文件中定義的宏,并向其中插入“#include”語句所包含的內容;接著gcc會調用…

宏定義對調試代碼的作用

以如下代碼為例&#xff1a; //head.h #ifndef __HEAD_H__ #define __HEAD_H__#define NUM1 10 #define NUM2 20 #endif//sum.c #include <stdio.h> //直接在標準庫中查找 #include "head.h" //先在工作目錄中查找&#xff…

【第15章】多重繼承

1. 虛基類介紹 多繼承時很容易產生命名沖突&#xff0c;即使我們很小心地將所有類中的成員變量和成員函數都命名為不同的名字&#xff0c;命名沖突依然有可能發生&#xff0c;比如非常經典的菱形繼承層次。如下圖所示&#xff1a; 類A派生出類B和類C&#xff0c;類D繼承自類B和…

gcc編譯器與g++編譯器的區別

gcc與g編譯器的程序文件分別為&#xff1a;/usr/bin/g和/usr/bin/gcc。 gcc 和 GCC 是兩個不同的東西&#xff0c;GCC:GNU Compiler Collection(GUN 編譯器集合)&#xff0c;它可以編譯C、C、JAV、Fortran、Pascal、Object-C、Ada等語言。gcc是GCC中的GUN C Compiler&#xff0…

1. 排序算法

一、概述 假定在待排序的記錄序列中&#xff0c;存在多個具有相同的關鍵字的記錄&#xff0c;若經過排序&#xff0c;這些記錄的相對次序保持不變&#xff0c;即在原序列中&#xff0c;r[i]r[j]&#xff0c;且r[i]在r[j]之前&#xff0c;而在排序后的序列中&#xff0c;r[i]仍…

1036. 跟奧巴馬一起編程(15)

美國總統奧巴馬不僅呼吁所有人都學習編程&#xff0c;甚至以身作則編寫代碼&#xff0c;成為美國歷史上首位編寫計算機代碼的總統。2014年底&#xff0c;為慶祝“計算機科學教育周”正式啟動&#xff0c;奧巴馬編寫了很簡單的計算機代碼&#xff1a;在屏幕上畫一個正方形。現在…

庫文件與頭文件

首先說明庫文件與頭文件在gcc中的具體使用方法&#xff0c;然后說明兩者的區別與聯系。 庫文件即庫函數&#xff0c;如printf和scanf函數。以libgtdf.so庫文件為例&#xff08;庫文件在命名時都以lib開頭&#xff0c;因此使用-l選項去鏈接指定的庫文件時可以省略lib三個字母&am…

gcc的常用參數

-c 編譯成目標文件.o&#xff08;只編譯不鏈接&#xff09; gcc -c hello.s -o hello.o -o 指出輸出文件名&#xff0c;輸出文件名跟在-o后面。如果不使用這一選項&#xff0c;則缺省的輸出文件名為a.out。gcc hello.c -o hello.exe&#xff08;在Linux中該項后綴名無要求&a…

1027. 打印沙漏(20)

本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定17個“*”&#xff0c;要求按下列格式打印 ************ *****所謂“沙漏形狀”&#xff0c;是指每行輸出奇數個符號&#xff1b;各行符號中心對齊&#xff1b;相鄰兩行符號數差2&#xff1b;符號數先從大到小順序遞減…

【C++ Priemr | 15】構造函數與拷貝控制

繼承的構造函數 1. 簡介&#xff1a; 子類為完成基類初始化&#xff0c;在C11之前&#xff0c;需要在初始化列表調用基類的構造函數&#xff0c;從而完成構造函數的傳遞。如果基類擁有多個構造函數&#xff0c;那么子類也需要實現多個與基類構造函數對應的構造函數。 class …

C命令行參數

C命令行參數的作用是在執行程序時&#xff0c;可以將命令行的參數傳值給C程序內部&#xff0c;這樣就可以從外部控制程序&#xff0c;而不是在代碼內對這些值進行硬編碼。命令行參數是使用main函數來處理的&#xff0c;argc是指參數的個數&#xff0c;為int類型&#xff1b;arg…

剖析數組名、函數名(不是指針常量,更不是指針)

對于一個數組&#xff0c;如 int a[4]; 如果只是給出數組名a&#xff0c;編譯器不知道該取該數組的第幾個元素&#xff0c;因此編譯器不會自動取值&#xff0c;而是返回該數組的首地址&#xff08;第一個元素的地址&#xff09;。其實&#xff0c;數組名a就是數組本身&#xf…

【C++ Priemr | 15】面向對象程序設計

類型準換與繼承 為了支持c的多態性&#xff0c;才用了動態綁定和靜態綁定。 需要理解四個名詞&#xff1a; 對象的靜態類型&#xff1a;對象在聲明時采用的類型&#xff0c;是在編譯期確定的。對象的動態類型&#xff1a;目前所指對象的類型&#xff0c;是在運行期決定的。對…

linux里source、. 、sh、bash、./有什么區別

轉載&#xff1a;https://www.cnblogs.com/pcat/p/5467188.html 1.source a.sh source可以簡寫為“.”&#xff0c;即. a.sh 注意中間有空格&#xff0c;在當前shell內去讀取、執行a.sh&#xff0c;而a.sh不需要有"執行權限"。 2.sh a.sh 和 bash a.sh 都是打開…