重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設、域名注冊、服務器等服務
為企業(yè)提供網(wǎng)站建設、域名注冊、服務器等服務
linux常用的語言就是shell和python,首先我們得先了解語言的概念
作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設機構,我們在業(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設計、網(wǎng)站制作、成都網(wǎng)站制作、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運營等一系列服務,幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡營銷方法,創(chuàng)造更大的價值。
-EOF
EOF
編寫一個簡單的bash檔如下:
我們可以看到用./執(zhí)行bash檔時,沒有進入到/home目錄下,這種我們稱為 在子shell中執(zhí)行 ,其不影響當前shell的狀況(有時候執(zhí)行成功沒有效果的原因)。但是無論是. 執(zhí)行還是source執(zhí)行我們都成功進入了home路徑下,這我們稱之為 在當前shell執(zhí)行
su nologinshell 不加載用戶的shell
su - loginshell 加載用戶的shell
可以很明顯的看出來,當用不加載用戶的shell加載用戶時,是不會具有當前加載用戶的權限的,很像windows中的游客模式
history歷史記錄緩存
~/.bash_history退出后寫入緩存
~/.bash_logout退出后執(zhí)行
在這一層,順帶按圖索驥,理解一下linux系統(tǒng)開機的歷程。紅字:系統(tǒng)層開機/切換用戶歷程;藍字:用戶層開機/切換用戶歷程;黃字:用戶層關機歷程。
曾經(jīng)玩過一個游戲:在用戶指令關機時,會有一輛小火車開過,所以我們可以把調(diào)用小火車開過的程式調(diào)用寫在?
1、命令和文件的自動補齊 shift
2、命令的歷史記憶功能:上下鍵、!number 執(zhí)行第多少條命令、
!string 找到最近以string開頭的命令、! 上一個命令最后的參數(shù)、
!! 執(zhí)行上一個命令、^R 搜索歷史命令
3、別名功能:alias 查看別名、unalias 取消別名、(命名前加\斜線跳過別名)
alias xx=’xx’ 定義臨時別名、vim ~/.bashrc 定義永久別名
4.快捷鍵:^D 退出、^A 光標移動到命令最前、^E 光標移動到命令最后、
^L 清屏、^U 往前的刪掉、^K 往后的刪掉、^Y 撤銷、^M 回車
^S 鎖屏、^Q 解除鎖屏
5.前后臺作業(yè)控制: 后臺不保留、nohup 后臺保留、screen
; || (命令返回值echo ?)
*任意多個字符
?任意一個字符
[]匹配括號內(nèi)任意一個字符
()在子shell中執(zhí)行
{}集合
\轉義字符
注意點:echo -e “a\tb”
$? 前一條命令的執(zhí)行成功與否
$1 傳入的第一個參數(shù) $2 $3 位置變量
沒有使用環(huán)境變量的必要性
練習內(nèi)容:讀取用戶指定文檔的ip連通性
bc計算器
假設我們定義了一個變量為:
記憶的方法為:
利用${ } 還可針對不同的變數(shù)狀態(tài)賦值(沒設定、空值、非空值):
system(執(zhí)行shell 命令)
相關函數(shù) fork,execve,waitpid,popen
表頭文件 #includestdlib.h
定義函數(shù) int system(const char * string);
函數(shù)說明 system()會調(diào)用fork()產(chǎn)生子進程,由子進程來調(diào)用/bin/sh-c string來執(zhí)行參數(shù)string字符串所代表的命令,此命令執(zhí)行完后隨即返回原調(diào)用的進程。在調(diào)用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。
返回值 如果system()在調(diào)用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數(shù)string為空指針(NULL),則返回非零值。如果system()調(diào)用成功則最后會返回執(zhí)行shell命令后的返回值,但是此返回值也有可能為system()調(diào)用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執(zhí)行成功。
附加說明 在編寫具有SUID/SGID權限的程序時請勿使用system(),system()會繼承環(huán)境變量,通過環(huán)境變量可能會造成系統(tǒng)安全的問題。
范例 #includestdlib.h
main()
{
system(“l(fā)s -al /etc/passwd /etc/shadow”);
}
執(zhí)行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow
在c語言中調(diào)用shell命令的方法實現(xiàn)。
c程序調(diào)用shell腳本共有兩種方法
:system()、popen(),分別如下:
system()
不用自己去創(chuàng)建進程,系統(tǒng)已經(jīng)封裝了這一步,直接加入自己的命令即可
popen()
也可以實現(xiàn)執(zhí)行的命令,比system
開銷小
以下分別說明:
1)system(shell命令或shell腳本路徑);
system()
會調(diào)用fork()產(chǎn)生
子歷程,由子歷程來調(diào)用/bin/sh-c
string來履行
參數(shù)string字符串所代表的命令,此命令履行
完后隨即返回原調(diào)用的歷程。在調(diào)用system()期間sigchld
信號會被暫時擱置,sigint和sigquit
信號則會被漠視
。
返
回值:如果system()在調(diào)用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數(shù)string為空指針(null),則返回非零值。
如果
system()調(diào)用成功
則最后會返回履行
shell命令后的返回值,但是此返回值也有可能為system()調(diào)用/bin/sh失敗所返回的127,因
此最好能再反省
errno
來確認履行
成功
。
system命令以其簡略
高效的作用得到很很廣泛
的利用
,下面是一個例子
例:在/tmp/testdir/目錄下有shell腳本tsh.sh,內(nèi)容為
#!/bin/sh
wget
$1
echo
"done!"
2)popen(char
*command,char
*type)
popen()
會調(diào)用fork()產(chǎn)生
子歷程,然后從子歷程中調(diào)用/bin/sh
-c來履行
參數(shù)command的指令。參數(shù)type可應用
“r”代表讀取,“w”代表寫入。遵循此type值,popen()會建立
管道連到子歷程的標準
輸出設備
或標準
輸入設備
,然后返回一個文件指針。隨后歷程便可利用
此文件指針來讀取子歷程的輸出設備
或是寫入到子歷程的標準
輸入設備
中。此外,所有應用
文
件指針(file*)操作的函數(shù)也都可以應用
,除了fclose()以外。
返回值:若成功
則返回文件指針,否則返回null,差錯
原因存于errno中。注意:在編寫具suid/sgid權限的程序時請盡量避免應用
popen(),popen()會繼承環(huán)境變量,通過環(huán)境變量可能會造成系統(tǒng)安全的問題。
例:c程序popentest.c內(nèi)容如下:
#include
main
{
file
*
fp;
charbuffer[80];
fp=popen(“~/myprogram/test.sh”,”r”);
fgets(buffer,sizeof(buffer),fp);
printf(“%s”,buffer);
pclose(fp);
}
首先,命令應該是好和其他兩個區(qū)分開來的了,因為命令都是可以直接敲在shell上面回車執(zhí)行的,而系統(tǒng)調(diào)用和庫函數(shù)都不行;
其次,百Linux系統(tǒng)調(diào)用和C庫函數(shù)都是函數(shù)的形式,即都是“func(args)”的形式,但系統(tǒng)調(diào)用是
由系統(tǒng)內(nèi)核對外提供的服務接口;C庫函數(shù)和你自己寫的普通的函數(shù)沒有本質(zhì)的區(qū)別,只是在度C標準庫中而已,Linux上面glibc就是C函數(shù)庫。從表專面上看兩者不太好區(qū)分,不過,你可以從它們需要包含的頭文件來區(qū)分,C庫函數(shù)像printf在stdio.h中,std就是標準(standard)的縮寫形式,因此在stdxxx.h中的函數(shù),基本都是C庫函數(shù);像
ssize_t
read(int
fd,
void
*buf,
size_t
count);這樣很多的系統(tǒng)調(diào)用是包含在unistd.h中的,unistd意思是UNIX
Standard,從這個意義就可以區(qū)分了。
希望對你有所幫助,如還有問題,可隨屬時聯(lián)系我:-)