放入路径
回忆上次内容
- 上次总算可以把
sleep.py
直接执行了
- sleep.py文件头部要声明好打开方式
#!/usr/bin/python3
- 用的是
python3
解释sleep.py
- 修改
sleep.py
文件 的执行权限
- 给当前用户增加 执行
execute
权限
- chmod u+x sleep.py
- 运行
./sleep.py
成功
- 但我不想总带着当前路径
./
- 我想要直接输入
sleep.py
回车就自动运行
- 这可能么?🤪
进行搜索
编辑
按图索骥
编辑
#显示当前路径
echo $PATH
- echo $PATH
- echo : 显示
$
: 说明这是一个环境变量
PATH
: 能直接运行程序的路径
编辑
- $PATH 里面有什么?
- 这里面有很多
路径
- 路径之间用
:
分隔开
- 这些路径下的命令都可以直接执行
- 无需输入路径就能直接运行
- 比如我们最熟悉的ls
执行路径
- 回忆一下无论我们在哪个目录下
- 都能执行 ls 命令
ls
#ls 命令在哪
whereis ls
# 从路径直接执行ls
/usr/bin/ls
#ls 详细信息
ls -lh /usr/bin/ls
- ls 是 /usr/bin下面的一个可执行文件
- 大小为139K
编辑
/usr/bin
在$PATH
的路径列表里
- 所以
/usr/bin
下 的ls
就能直接执行 - 不需要在前面附加路径
/usr/bin/
- 只用文件名
ls
就能直接执行
- 而且不论当前路径在哪个路径下
ls
命令都能直接执行
- 但是
- 如果环境变量
$PATH
中没有/usr/bin
- 就找不到
ls
了 - 就连
ls
也不能执行了
- 真的是这样吗?
迷失路径
- 将PATH清空
- export PATH=
编辑
- 没有了$PATH
- 真的连ls都找不到了😱😱😱
- 什么都干不了了
- 你说环境变量重要不重要?!🙆🏻♀️
重开终端
- 到桌面上重新打开一个新的xfce终端(terminal)
- 再echo 一下 $PATH
- 路径就恢复了
- 只要如果命令所在路径在
$PATH
路径下面
- 路径下的程序就可以直接执行
编辑
- 执行路径为什么有那么多呢?
执行路径作用
- 比如我有两个不同版本的mc服务器
- 都在我的硬盘里
- 我怎么知道需要用启动哪个版本呢?
- 这两个启动的位置不同
- 更明确说
- 就是可执行文件的路径不同
- $PATH中谁靠前就执行谁下面的命令
- 类似的需求很多
- 比如有两个不同版本的 tomcat
- 或者两个不同版本的 java
- 或者不同版本的python3
- 都可以各自默认的执行目录
- 我们用的这个 python3 到底在哪呢?
编辑
python3的位置
python3
就在/usr/bin/
下面
编辑
python3
和ls
都在/usr/bin/
下面/usr/bin
的含义
- usr
- unix software resources unix软件资源
- bin
- binary 二进制可执行文件
分析路径
- 路径中包含
python3
所在的路径
/usr/bin
- 见下图红框
编辑
- 无论当前路径在什么位置
- 只要输入
python3
- 系统就去
$PATH
里面从前往后找 - 在
/usr/bin
当中找到了python3
- 就不往后找了
- 然后执行
/usr/bin
中找到的python3
- 只要这个路径
/usr/bin
在$PATH
中
- 系统在执行命令时
- 就会去
/usr/bin
目录中搜索命令
- 那我们把
sleep.py
拷贝到/usr/bin
不就能被找到了么? - 首先得明确
- 当前这个
sleep.py
在哪里呢?
当前位置
- pwd
- present working directory
- 当前工作路径
编辑
- 当前路径就在
~
- 就是
/home/shiyanlou
- 就是当前用户
shiyanlou的
用户文件夹
- 什么是用户文件夹呢?
用户文件夹
编辑
- 我们的系统都是多用户的
- 多用户意味着可以有多个用户登录使用
- 每个用户都有自己的桌面、文档、下载目录
编辑
编辑
放入路径
#把文件拷贝过去
cp sleep.py /usr/bin
#用管理员权限给考过去
sudo cp ./sleep.py /usr/bin
#尝试执行
sleep.py
#为当前用户增加可执行权限
chmod u+x /usr/bin/sleep.py
#使用管理员权限提权
sudo chmod u+x /usr/bin/sleep.py
#尝试执行
sleep.py
#尝试用管理员执行
sudo sleep.py
编辑
- 最后 sleep.py 是可以执行的
- 但前提还是
- 需要在最前面打一个 sudo
- 进行提权
- 才能执行
- 如果我想不用sudo就直接运行sleep.py呢
ls的参数
编辑
- 如果不清楚ls参数作用的话
- 可以查询一下帮助
编辑
- python之外
- oeasy也有linux教程
- 学完python之后可以去《oeasy教您玩转linux》
- 看看一些shell命令的细节
分析
- sleep.py这个文件
- 拥有者(owner) 是root
- 用户组(group) 是 root
编辑
- 当前用户不能直接执行
- 只有 root 才能执行
编辑
- root代表着最高的权限
- 所以必须要加上sudo才可以
- 那原来的sleep.py为什么可以直接运行呢?
所有者来源
- 原来的所有者是shiyanlou啊
编辑
- 那为什么拷贝到/usr/bin下面之后
- 所有者就从shiyanlou变成root了呢?
回忆拷贝过程
- 回忆一下拷贝的时候
- 直接拷贝失败了
编辑
- 只能提权进行拷贝
- 这时候cp执行者就不是shiyanlou了
- 而是root
编辑
- 此后sleep.py就进入了
/usr/bin
- 但是只能被文件所有者root调用
- 我想让普通用户也能执行sleep.py
- 可以吗?
提权
- 尝试再提权
#使用管理员权限提权
sudo chmod a+x /usr/bin/sleep.py
#尝试执行
sleep.py
- a+x 意思是
a
ll users 都增加- e
x
ecute 的权限
编辑
- 不同位置的x含义不同
- 蓝色对应 文件拥有者(owner) - (root)
- 红色对应 文件拥有者用户组(group) - (root)
- 黄色对应 所有用户 (all)
- 目前所有用户都能执行sleep.py了
问题
- 可是什么都放到
/usr/bin
下面
编辑
- 就像鸡蛋都放在同一个篮子里
编辑
- 目录之下非常杂乱
调整
/usr/bin
下面文件
- 很多
- 很乱
- 很不安全
- 先把
sleep.py
从/usr/bin
中删除掉
#先把/usr/bin下面的sleep.py删掉
rm /usr/bin/sleep.py
#不让删就用管理员权限删
sudo rm /usr/bin/sleep.py
#确认删除
ls /usr/bin/sleep.py
- 确认删除之后
编辑
- 我希望
sleep.py
- 还放在当前用户文件夹(~)
- 不动
- 最终还能在任意路径下执行
- 可能实现吗?🤔
总结
- 我们要在任意路径下直接执行
sleep.py
- 把
sleep.py
放在/usr/bin/
下面 - 最终可以在任意位置执行程序
sleep.py
- 但是
/usr/bin
里面放的一般都是二进制命令文件- 命令实在是太多太乱
- 最终还是删除了sleep.py
- 我想
- 把宿主目录添加到系统变量
$PATH
中
编辑