放入路径

回忆上次内容

  • 上次总算可以把 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/下面

编辑

  • python3ls 都在 /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参数作用的话

    • 可以查询一下帮助

编辑

分析

  • 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 意思是

    • all users 都增加
    • execute 的权限

编辑

  • 不同位置的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

编辑

[oeasy]python0029_放入系统路径_PATH_chmod_程序路径_执行原理的更多相关文章

  1. 【转】【Android测试技巧】01. root后adb shell默认不是root用户时,如何将文件放入手机系统中

    http://blog.csdn.net/wirelessqa/article/details/8624208 有些机器root后通过adb shell 后,默认不是root用户,需要输入 su才能切 ...

  2. Centos-当前和过去登入系统用户信息-last

    last 获取当前和过去登入系统的用户相关信息,执行last指令的时候会默认读取/var/log/wtmp文件 相关参数 -a 把客户端IP显示到最后一列 -R 不显示客户端IP地址或主机名 -n 显 ...

  3. java通过文件路径读取该路径下的所有文件并将其放入list中

    java通过文件路径读取该路径下的所有文件并将其放入list中   java中可以通过递归的方式获取指定路径下的所有文件并将其放入List集合中.假设指定路径为path,目标集合为fileList,遍 ...

  4. .Net中把图片等文件放入DLL中,并在程序中引用

    原文:.Net中把图片等文件放入DLL中,并在程序中引用 [摘要] 有时我们需要隐藏程序中的一些资源,比如游戏,过关后才能看到图片,那么图片就必须隐藏起来,否则不用玩这个游戏就可以看到你的图片了,呵呵 ...

  5. 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合中,遍历map集合

    package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...

  6. 有些其他程序设置为从 Outlook 下载并删除邮件。为防止发生此意外情况,我们将这些邮件放入一个特殊的 POP 文件夹中

    最近使用FOXMAIL接收MSN邮件时,发现有一些邮件收取不到,进到WEB页面,页面下方提示“你的邮件位于 POP 文件夹中!有些其他程序设置为从 Outlook 下载并删除邮件.为防止发生此意外情况 ...

  7. 将root 当成arraylist放入数据sturts2 入门笔记

    刚启动idea 就报出错误 [-- ::,] Artifact -sturts2:war exploded: Error during artifact deployment. See server ...

  8. windows系统调试MapReduce程序

    如果使用windows开发mapreduce程序,是不能进行debug的,会报如下错误,但其实不影响最终运行结果 DEBUG o.a.h.u.Shell - Failed to detect a va ...

  9. 在Linux系统如何让程序开机时自动启动

    在Linux系统如何让程序开机时自动启动      核心提示:系统的服务在开机时一般都可以自动启动,那在linux系统下如果想要程序在开机时自动启动怎么办?我们知道在 windows系统“开始”--& ...

  10. 在区块链上表白——使用C#将一句话放入比特币的区块链上

    最近在看区块链和比特币的知识,顺便简单研究了一下BitCoin的脚本语言,发现OP_RETURN这个命令可以在后面放入自己想说的内容,很多侧链啊,公证之类就是利用了这个特性,可以把一句话,或者一个哈希 ...

随机推荐

  1. sass语法嵌套规则与注释讲解

    语法嵌套规则 选择器嵌套 例如有这么一段css,正常CSS的写法 .container{width:1200px; margin: 0 auto;} .container .header{height ...

  2. C# Socket 封包 拆包 ProtoBuf 的使用

    //这是消息头包,消息头包大小是固定的, //每次传输都要先传消息头,在传消息体 enum EnumMsgType:消息类型 long PackgeSize:包大小 long TotalPackage ...

  3. zfile 在线云盘、网盘、OneDrive、云存储、私有云、对象存储、h5ai、上传、下载

    基于 Java 的在线网盘程序,支持对接 S3.OneDrive.SharePoint.又拍云.本地存储.FTP.SFTP 等存储源,支持在线浏览图片.播放音视频,文本文件.Office.obj(3d ...

  4. rofi编译支持中文输入版本

    准备工作 git clone https://github.com/davatorium/rofi.git 根据网上的信息,rofi 中文输入主要是依赖 xcb-imdkit 这个库 当然我们是使用源 ...

  5. Apisix网关-使用Grafana可视化Apisix的Prometheus数据

    Apisix安装部署 Apisix官网安装教程 Apisix Dashboard官网安装教程 本次教程使用RPM包安装方式 使用systemctl管理服务 Apisix配置要点 /usr/local/ ...

  6. requests高级操作

    requests的Cookie处理 有时相关的需求会让我们去爬取基于某些用户的相关用户信息,例如爬取张三人人网账户中的个人身份信息.好友账号信息等. 那么这个时候,我们就需要对当前用户进行登录操作,登 ...

  7. Wireshark基础教程

    Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息.常用于开发测试过程各种问题定位.本文主要内容包括: 1.Wireshark软件下载和安装以及Wiresha ...

  8. List<Map<String, Object>> 按照时间排序

    // 准备一个集合 List<Map<String, Object>> resList= Lists.newArrayList(); Map<String, Object ...

  9. work12

    day12   一.请简述集合框架. 集合是单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List和java.util.Set.其中,List的 ...

  10. mysql 联合表查询从表即使有索引依然ALL的一个原因-索引ALL解决,字符编码方式不一致导致全表搜索

    mysql 联合表查询从表即使有索引依然ALL的一个原因-索引ALL解决,字符编码方式不一致导致全表搜索那就是主表和从表的关联字段的编码方式不一样!!! 产生的现象: 解决之后,正确的使用了t2.or ...