[oeasy]python0029_放入系統(tǒng)路徑_PATH_chmod_程序路徑_執(zhí)行原理
?
放入路徑
回憶上次內(nèi)容
上次總算可以把
sleep.py
直接執(zhí)行了#!/usr/bin/python3
用的是
python3
解釋sleep.py
sleep.py文件頭部要聲明好打開方式
修改
sleep.py
文件 的執(zhí)行權(quán)限chmod u+x sleep.py
給當(dāng)前用戶增加 執(zhí)行
execute
權(quán)限運(yùn)行
./sleep.py
成功但我不想總帶著當(dāng)前路徑
./
我想要直接輸入
sleep.py
回車就自動(dòng)運(yùn)行這可能么???
進(jìn)行搜索

按圖索驥

#顯示當(dāng)前路徑 echo $PATH
echo $PATH
echo : 顯示
$
: 說明這是一個(gè)環(huán)境變量
PATH
: 能直接運(yùn)行程序的路徑

$PATH 里面有什么?
這里面有很多
路徑
路徑之間用
:
分隔開這些路徑下的命令都可以直接執(zhí)行
無需輸入路徑就能直接運(yùn)行
比如我們最熟悉的ls
執(zhí)行路徑
回憶一下無論我們?cè)谀膫€(gè)目錄下
都能執(zhí)行 ls 命令
ls #ls 命令在哪 whereis ls # 從路徑直接執(zhí)行l(wèi)s /usr/bin/ls #ls 詳細(xì)信息 ls -lh /usr/bin/ls
ls 是 /usr/bin下面的一個(gè)可執(zhí)行文件
大小為139K

/usr/bin
在$PATH
的路徑列表里所以
/usr/bin
下 的ls
就能直接執(zhí)行不需要在前面附加路徑
/usr/bin/
只用文件名
ls
就能直接執(zhí)行而且不論當(dāng)前路徑在哪個(gè)路徑下
ls
命令都能直接執(zhí)行但是
如果環(huán)境變量
$PATH
中沒有/usr/bin
就找不到
ls
了就連
ls
也不能執(zhí)行了真的是這樣嗎?
迷失路徑
將PATH清空
export PATH=

沒有了$PATH
真的連ls都找不到了??????
什么都干不了了
你說環(huán)境變量重要不重要?!?????♀?
重開終端
到桌面上重新打開一個(gè)新的xfce終端(terminal)
再echo 一下 $PATH
路徑就恢復(fù)了
只要如果命令所在路徑在
$PATH
路徑下面路徑下的程序就可以直接執(zhí)行

執(zhí)行路徑為什么有那么多呢?
執(zhí)行路徑作用
比如我有兩個(gè)不同版本的mc服務(wù)器
都在我的硬盤里
我怎么知道需要用啟動(dòng)哪個(gè)版本呢?
這兩個(gè)啟動(dòng)的位置不同
更明確說
就是可執(zhí)行文件的路徑不同
$PATH中誰靠前就執(zhí)行誰下面的命令
類似的需求很多
比如有兩個(gè)不同版本的 tomcat
或者兩個(gè)不同版本的 java
或者不同版本的python3
都可以各自默認(rèn)的執(zhí)行目錄
我們用的這個(gè) python3 到底在哪呢?

python3的位置
python3
就在/usr/bin/
下面

python3
和ls
都在/usr/bin/
下面/usr/bin
的含義binary 二進(jìn)制可執(zhí)行文件
unix software resources unix軟件資源
usr
bin
分析路徑
路徑中包含
python3
所在的路徑/usr/bin
見下圖紅框

無論當(dāng)前路徑在什么位置
系統(tǒng)就去
$PATH
里面從前往后找在
/usr/bin
當(dāng)中找到了python3然后執(zhí)行
/usr/bin
中找到的python3
就不往后找了
只要輸入
python3
只要這個(gè)路徑
/usr/bin
在$PATH
中系統(tǒng)在執(zhí)行命令時(shí)
就會(huì)去
/usr/bin
目錄中搜索命令那我們把
sleep.py
拷貝到/usr/bin
不就能被找到了么?首先得明確
當(dāng)前這個(gè)
sleep.py
在哪里呢?
當(dāng)前位置
pwd
present working directory
當(dāng)前工作路徑

當(dāng)前路徑就在
~
就是
/home/shiyanlou
就是當(dāng)前用戶
shiyanlou的
用戶文件夾什么是用戶文件夾呢?
用戶文件夾

我們的系統(tǒng)都是多用戶的
多用戶意味著可以有多個(gè)用戶登錄使用
每個(gè)用戶都有自己的桌面、文檔、下載目錄


放入路徑
#把文件拷貝過去 cp sleep.py /usr/bin #用管理員權(quán)限給考過去 sudo cp ./sleep.py /usr/bin #嘗試執(zhí)行 sleep.py #為當(dāng)前用戶增加可執(zhí)行權(quán)限 chmod u+x /usr/bin/sleep.py #使用管理員權(quán)限提權(quán) sudo chmod u+x /usr/bin/sleep.py #嘗試執(zhí)行 sleep.py #嘗試用管理員執(zhí)行 sudo sleep.py

最后 sleep.py 是可以執(zhí)行的
但前提還是
需要在最前面打一個(gè) sudo
進(jìn)行提權(quán)
才能執(zhí)行
如果我想不用sudo就直接運(yùn)行sleep.py呢
ls的參數(shù)

如果不清楚ls參數(shù)作用的話
可以查詢一下幫助

python之外
oeasy也有l(wèi)inux教程
學(xué)完python之后可以去
看看一些shell命令的細(xì)節(jié)
分析
sleep.py這個(gè)文件
擁有者(owner) 是root
用戶組(group) 是 root

當(dāng)前用戶不能直接執(zhí)行
只有 root 才能執(zhí)行

root代表著最高的權(quán)限
所以必須要加上sudo才可以
那原來的sleep.py為什么可以直接運(yùn)行呢?
所有者來源
原來的所有者是shiyanlou啊

那為什么拷貝到/usr/bin下面之后
所有者就從shiyanlou變成root了呢?
回憶拷貝過程
回憶一下拷貝的時(shí)候
直接拷貝失敗了

只能提權(quán)進(jìn)行拷貝
這時(shí)候cp執(zhí)行者就不是shiyanlou了
而是root
此后sleep.py就進(jìn)入了
/usr/bin
但是只能被文件所有者root調(diào)用
我想讓普通用戶也能執(zhí)行sleep.py
可以嗎?
提權(quán)
嘗試再提權(quán)
#使用管理員權(quán)限提權(quán) sudo chmod a+x /usr/bin/sleep.py #嘗試執(zhí)行 sleep.py
a+x 意思是
a
ll users 都增加e
x
ecute 的權(quán)限
不同位置的x含義不同
藍(lán)色對(duì)應(yīng) 文件擁有者(owner) - (root)
紅色對(duì)應(yīng) 文件擁有者用戶組(group) - (root)
黃色對(duì)應(yīng) 所有用戶 (all)
目前所有用戶都能執(zhí)行sleep.py了
問題
可是什么都放到
/usr/bin
下面
就像雞蛋都放在同一個(gè)籃子里
目錄之下非常雜亂
調(diào)整
/usr/bin
下面文件很多
很亂
很不安全
先把
sleep.py
從/usr/bin
中刪除掉
#先把/usr/bin下面的sleep.py刪掉 rm /usr/bin/sleep.py #不讓刪就用管理員權(quán)限刪 sudo rm /usr/bin/sleep.py #確認(rèn)刪除 ls /usr/bin/sleep.py
確認(rèn)刪除之后
我希望
sleep.py
還放在當(dāng)前用戶文件夾(~)
不動(dòng)
最終還能在任意路徑下執(zhí)行
可能實(shí)現(xiàn)嗎???
總結(jié)
我們要在任意路徑下直接執(zhí)行
sleep.py
把
sleep.py
放在/usr/bin/
下面最終可以在任意位置執(zhí)行程序
sleep.py
但是
/usr/bin
里面放的一般都是二進(jìn)制命令文件命令實(shí)在是太多太亂
最終還是刪除了sleep.py
我想
把宿主目錄添加到系統(tǒng)變量
$PATH
中
這樣有可能嗎???
我們下次再說!*
藍(lán)橋->
github->
gitee->
視頻->
作者:oeasy