免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4934 | 回复: 7
打印 上一主题 下一主题

Linux命令之学习总结 [复制链接]

论坛徽章:
2
狮子座
日期:2014-08-29 16:15:422015亚冠之阿尔纳斯尔
日期:2015-08-28 17:47:49
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-08 15:12 |只看该作者 |倒序浏览
本帖最后由 122285969 于 2011-05-08 16:17 编辑

学习Linux命令也有些时日了,今天把这份简单总结分享给大家
如果你是正在学习Linux命令的朋友,希望能给你带来些许帮助

有问题才会有方向,解决问题就是我们的方向
所以让我们带着下面6个问题出发……

    当前用户直接能使用的命令都存在哪里呢?
    当前用户直接能使用的命令一共有多少个?
    我记不清命令拼写该怎么处理呢?
    我怎么知道一个命令是干什么的?
    我怎么知道一个命令如何使用呢?
    当前目录的可执行文件怎么不能直接执行?



我们按照上面的顺序一一来解答:

    当前用户直接能使用的命令都存在哪里呢?


我们先看看root用户:
  1. [root@Centos ~]# whoami
  2. root
复制代码
PS:当前用户root
  1. [root@Centos ~]# echo $PATH
  2. /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
复制代码
PS:Linux所有可以直接执行的命令都是存在 PATH 环境变量中以“:”分隔的路径下的
  1. [root@Centos ~]# echo $PATH | sed 's/:/\n/g' | cat -n
  2.      1  /usr/kerberos/sbin
  3.      2  /usr/kerberos/bin
  4.      3  /usr/local/sbin
  5.      4  /usr/local/bin
  6.      5  /sbin
  7.      6  /bin
  8.      7  /usr/sbin
  9.      8  /usr/bin
  10.      9  /root/bin
复制代码
PS:默认root用户所有可以直接执行的命令,就存在这9个目录下


我们再看看一个普通用户的情况:
  1. [ctu@Centos ~]$ whoami
  2. ctu
复制代码
PS:当前用户ctu
  1. [ctu@Centos ~]$ echo $PATH
  2. /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/ctu/bin
  3. [ctu@Centos ~]$ echo $PATH | awk -F ':' '{for (i=1; i<=NF; i++) {printf("%s\n",$i)}}' | cat -n
  4.      1  /usr/kerberos/bin
  5.      2  /usr/local/bin
  6.      3  /bin
  7.      4  /usr/bin
  8.      5  /home/ctu/bin
复制代码
PS:普通用户默认可以直接执行的命令,就存在这个5个目录下。我们可以看到,root跟普通用户的默认 PATH 环境变量的值并不相同,没在各自环境变量中指定路径的命令,就只能用绝对路径和相对路径来执行了。


    当前用户直接能使用的命令一共有多少个?


我们先写一个测试脚本:
  1. [root@Centos ~]# cat -n comm_sum_1.sh
  2.      1  #!/bin/sh
  3.      2
  4.      3  sum=0
  5.      4  count=0
  6.      5
  7.      6  echo -e "I'am $USER !\n"
  8.      7
  9.      8  for comm_path in `echo $PATH | sed 's/:/\n/g'`
  10.      9  do
  11.     10          count=`ls $comm_path 2>/dev/null | wc -l`
  12.     11          echo -e "$count\t: $comm_path"
  13.     12          sum=$[sum+count]
  14.     13  done
  15.     14
  16.     15  echo -e "\n$sum\t: comm_sum"
复制代码
我们以root用户运行一下试试看吧:
  1. [root@Centos ~]# . comm_sum_1.sh
  2. I'am root !

  3. 14      : /usr/kerberos/sbin
  4. 20      : /usr/kerberos/bin
  5. 0       : /usr/local/sbin
  6. 0       : /usr/local/bin
  7. 264     : /sbin
  8. 111     : /bin
  9. 348     : /usr/sbin
  10. 1111    : /usr/bin
  11. 0       : /root/bin

  12. 1868    : comm_sum
复制代码
PS:提示我们root用户可以直接使用的命令一共有 1868 个? 真的是这样吗?

我们再写一个脚本,这次加入了可执行权限的判断,并把不能直接执行的命令记录在 no_allow_comm.txt 文件中
  1. [root@Centos ~]# cat -n comm_sum_2.sh
  2.      1  #!/bin/sh
  3.      2
  4.      3  sum=0
  5.      4
  6.      5  echo -e "I'am $USER !\n"
  7.      6
  8.      7  for comm_path in `echo $PATH | sed 's/:/\n/g'`
  9.      8  do
  10.      9          count=0
  11.     10          for file in `ls $comm_path 2>/dev/null`
  12.     11          do
  13.     12                  [ -x "$comm_path/$file" ] && count=$[count+1] || echo "$comm_path/$file" >> no_allow_comm.txt
  14.     13          done
  15.     14          echo -e "$count\t: $comm_path"
  16.     15          sum=$[sum+count]
  17.     16  done
  18.     17
  19.     18  echo -e "\n$sum\t: comm_sum"
  20.     19
复制代码
我们以脚本 comm_sum_2.sh 来检测试试看:
  1. [root@Centos ~]# . comm_sum_2.sh
  2. I'am root !

  3. 14      : /usr/kerberos/sbin
  4. 20      : /usr/kerberos/bin
  5. 0       : /usr/local/sbin
  6. 0       : /usr/local/bin
  7. 264     : /sbin
  8. 111     : /bin
  9. 348     : /usr/sbin
  10. 1107    : /usr/bin
  11. 0       : /root/bin

  12. 1864    : comm_sum
复制代码
PS:啊?这个跟我们上次检测的结果有出入了
  1. [root@Centos ~]# cat -n no_allow_comm.txt
  2.      1  /usr/bin/ecryptfs-dot-private
  3.      2  /usr/bin/huge_page_setup_helper.pyc
  4.      3  /usr/bin/huge_page_setup_helper.pyo
  5.      4  /usr/bin/pygtk-demo
  6. [root@Centos ~]# ecryptfs-dot-private
  7. -bash: /usr/bin/ecryptfs-dot-private: 权限不够
  8. [root@Centos ~]# ls -l /usr/bin/ecryptfs-dot-private
  9. -rw-r--r-- 1 root root 1154 2009-09-04 /usr/bin/ecryptfs-dot-private
复制代码
PS:我们再次检测的时候,提示一共有 1864 个了。还有4个命令,确实不可以直接执行。

用一个普通用户来试试看:
  1. [ctu@Centos ~]$ . comm_sum_1.sh
  2. I'am ctu !

  3. 20      : /usr/kerberos/bin
  4. 0       : /usr/local/bin
  5. 111     : /bin
  6. 1111    : /usr/bin
  7. 0       : /home/ctu/bin

  8. 1242    : comm_sum
复制代码
PS:脚本1检测的结果是 1242 个
  1. [ctu@Centos ~]$ . comm_sum_2.sh
  2. I'am ctu !

  3. 20      : /usr/kerberos/bin
  4. 0       : /usr/local/bin
  5. 111     : /bin
  6. 1105    : /usr/bin
  7. 0       : /home/ctu/bin

  8. 1236    : comm_sum
复制代码
PS:脚本2检测的结果是 1236 个,一样有出入
  1. [ctu@Centos ~]$ cat -n no_allow_comm.txt
  2.      1  /usr/bin/amtu
  3.      2  /usr/bin/aulastlog
  4.      3  /usr/bin/ecryptfs-dot-private
  5.      4  /usr/bin/huge_page_setup_helper.pyc
  6.      5  /usr/bin/huge_page_setup_helper.pyo
  7.      6  /usr/bin/pygtk-demo
  8. [ctu@Centos ~]$ amtu
  9. -bash: /usr/bin/amtu: 权限不够
  10. [ctu@Centos ~]$ ls -l /usr/bin/amtu
  11. -rwxr-x--- 1 root root 33412 2008-05-25 /usr/bin/amtu
复制代码
PS:跟上面的结果是一样的,也有些命令虽然是在 PATH 环境变量中,仍然不可以直接执行的。


    我记不清命令拼写该怎么处理呢?


我们以命令 ifconfig 为例说明:

我要使用这个命令,但是我不记得怎么拼写了,模糊地记得好像前面两个字符是 if 吧?

那就输入 if ,再按两下 TAB 键吧。
  1. [root@Centos ~]# if
  2. if         ifconfig   ifenslave  ifrename
  3. ifcfg      ifdown     ifnames    ifup
复制代码
系统自动为我们找到了我们要使用的命令 ifconfig

但是 TAB 键的方法只适合我们记得前面几个字符的情况。

要是我们只记得第3,4个字符为 co 呢? 或者我们只记得命令中含有 fig 呢?这样的情况我们使用 TAB 键好像无能为力了。

显然 TAB 键在这些情况下并不适合,要必要寻找新的方法来替代了(这并不是 TAB 键功能的缺陷)。

我们写一个命令查找的shell脚本
  1. [ctu@Centos ~]$ cat -n comm_find.sh
  2.      1  #!/bin/sh
  3.      2
  4.      3  read -p "Please enter a keyword : " comm_name
  5.      4
  6.      5  echo -e "I'am $USER !\n"
  7.      6
  8.      7  for comm_path in `echo $PATH | sed 's/:/\n/g'`
  9.      8  do
  10.      9          ls $comm_path 2>/dev/null | grep -iE "$comm_name" && echo -e "\n[ $comm_path ]\n"
  11.     10  done
复制代码
我们测试下只记得第3,4个字符是 co 的情况:
  1. [root@Centos ~]# . comm_find.sh
  2. Please enter a keyword : ^..co
  3. I'am root !

  4. ifconfig
  5. iwconfig
  6. ldconfig

  7. [ /sbin ]

  8. dbconverter-2
  9. lvconvert
  10. pwconv
  11. racoon
  12. racoonctl
  13. vgconvert

  14. [ /usr/sbin ]

  15. chcon
  16. cscope
  17. cscope-indexer
  18. fgconsole
  19. opcontrol
  20. piconv
  21. recountdiff
  22. rfcomm
  23. secon
  24. sfconvert

  25. [ /usr/bin ]
复制代码
凭着我们的印象,相信你能找出来要使用的命令 ifconfig ,除非你从来就没使用过。

我们再看看只记得含有 fig 的情况:
  1. [root@Centos ~]# . comm_find.sh
  2. Please enter a keyword : fig
  3. I'am root !

  4. krb5-config

  5. [ /usr/kerberos/bin ]

  6. chkconfig
  7. ifconfig
  8. iwconfig
  9. ldconfig
  10. plipconfig
  11. vconfig

  12. [ /sbin ]

  13. authconfig
  14. authconfig-gtk
  15. authconfig-tui
  16. hciconfig
  17. iconvconfig
  18. iconvconfig.i686
  19. system-config-authentication
  20. system-config-lvm
  21. system-config-network
  22. system-config-network-cmd
  23. system-config-network-gui
  24. system-config-network-tui
  25. system-config-packages
  26. sys-unconfig
  27. timeconfig

  28. [ /usr/sbin ]

  29. authconfig
  30. authconfig-gtk
  31. authconfig-tui
  32. curl-config
  33. dateconfig
  34. gpg-error-config
  35. libgcrypt-config
  36. libusb-config
  37. nspr-config
  38. nss-config
  39. pkg-config
  40. scim-config-agent
  41. scrollkeeper-config
  42. system-config-authentication
  43. system-config-date
  44. system-config-display
  45. system-config-kdump
  46. system-config-keyboard
  47. system-config-language
  48. system-config-lvm
  49. system-config-network
  50. system-config-network-cmd
  51. system-config-rootpassword
  52. system-config-securitylevel
  53. system-config-securitylevel-tui
  54. system-config-soundcard
  55. system-config-time
  56. system-config-users
  57. xml2-config
  58. xmlsec1-config
  59. xslt-config

  60. [ /usr/bin ]
复制代码
一样可以凭着印象找出来的,这样也就可以应付所有忘记拼写但使用过的命令的情况了。


    我怎么知道一个命令是干什么的?


我们以 ping 命令为例说明:
  1. [ctu@Centos ~]$ man ping

  2. PING(8)                System Manager’s Manual: iputils                PING(8)

  3. NAME
  4.        ping, ping6 - send ICMP ECHO_REQUEST to network hosts
复制代码
  1. [ctu@Centos ~]$ info ping

  2. File: *manpages*,  Node: ping,  Up: (dir)

  3. PING(8)                System Manager’s Manual: iputils                PING(8)

  4. NAME
  5.        ping, ping6 - send ICMP ECHO_REQUEST to network hosts
复制代码
PS:man info命令给出了要查找命令的功能说明


    我怎么知道一个命令如何使用呢?
  1. [root@Centos ~]# ping
  2. Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
  3.             [-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
  4.             [-M mtu discovery hint] [-S sndbuf]
  5.             [ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
复制代码
PS:不带参数执行一个命令,通常会给出该命令的简单使用说明,但不是所有命令都会的
  1. [ctu@Centos ~]$ man ping

  2. OPTIONS
  3.        -a     Audible ping.

  4.        -A     Adaptive ping. Interpacket interval adapts to round-trip
  5.               time, so that effectively not more than one (or more, if
  6.               preload  is  set)  unanswered probes present in the net-
  7.               work. Minimal interval is 200msec  for  not  super-user.
  8.               On networks with low rtt this mode is essentially equiv-
  9.               alent to flood mode.

  10.        -b     Allow pinging a broadcast address.

  11.        -B     Do not allow ping to change source  address  of  probes.
  12.               The address is bound to one selected when ping starts.

  13.        -c count
  14.               Stop  after  sending  count  ECHO_REQUEST  packets. With
  15.               deadline option, ping waits for count  ECHO_REPLY  pack-
  16.               ets, until the timeout expires.

  17.        -d     Set  the  SO_DEBUG  option  on  the  socket  being used.
  18.               Essentially, this socket option is  not  used  by  Linux
  19.               kernel.

  20.        -F flow label
  21.               Allocate and set 20 bit flow label on echo request pack-
  22.               ets.  (Only ping6). If value is zero,  kernel  allocates
  23.               random flow label.
复制代码
PS:man命令会给出命令的详细参数说明,还有info也一样,通常info命令会有相应的应用举例,按自己喜好来查找吧


    当前目录的可执行文件怎么不能直接执行?


默认情况下,Linux是不搜索当前目录的命令的
  1. [root@Centos ~]# echo $PATH
  2. /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  3. [root@Centos ~]# cat -n hp.sh
  4.      1  #!/bin/bash
  5.      2
  6.      3  echo "hello ping"
复制代码
PS:hp.sh作用就是输出“hello ping”
  1. [root@Centos ~]# chmod +x hp.sh
复制代码
PS:添加当前用户的可执行权限
  1. [root@Centos ~]# hp.sh
  2. -bash: hp.sh: command not found
复制代码
PS:具有可执行权限,也确实存在当前目录下,但是仍然提示命令找不到
  1. [root@Centos ~]# ./hp.sh
  2. hello ping
复制代码
PS:使用相对路径,我们就可以执行成功
  1. [root@Centos ~]# export PATH=.:$PATH
复制代码
PS:现在我们将当前目录加入到 PATH 环境变量中
  1. [root@Centos ~]# echo $PATH
  2. .:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  3. [root@Centos ~]# hp.sh
  4. hello ping
复制代码
PS:不使用绝对路径或者相对路径,这次我们也可以执行成功了
  1. [root@Centos ~]# ping
  2. Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
  3.             [-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
  4.             [-M mtu discovery hint] [-S sndbuf]
  5.             [ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
复制代码
PS:此时执行的 ping 命令是系统自带的
  1. [root@Centos ~]# mv hp.sh ping
复制代码
PS:我们将 hp.sh 也改名为 ping
  1. [root@Centos ~]# ping
  2. hello ping
复制代码
PS:这次执行的ping命令就不再是系统自带的了。命令搜索是按照 PATH 环境变量,以“:”分隔的路径,从左到右逐个搜索的。因此当我们将 hp.sh 脚本改名成 ping 命令时。这时候存在两个 ping 命令了。而当前目录下的 ping 优先于 /bin/ping 命令,也就被执行了。

就写到这里吧,希望大家多多支持!!谢谢!!



--- THE END ---

论坛徽章:
0
2 [报告]
发表于 2011-05-08 15:22 |只看该作者
加油~

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
3 [报告]
发表于 2011-05-08 16:23 |只看该作者
回复 1# 122285969


我们写一个命令查找的shell脚本

直接使用系统的find命令是不是更简洁一些

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
4 [报告]
发表于 2011-05-08 20:59 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
5 [报告]
发表于 2011-05-09 10:02 |只看该作者
谢谢分享!

论坛徽章:
0
6 [报告]
发表于 2011-05-09 10:15 |只看该作者
学习……

论坛徽章:
0
7 [报告]
发表于 2011-05-09 10:17 |只看该作者
最喜欢这样的帖子,不浮夸,从基础做起……
楼主再接再砺……

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
8 [报告]
发表于 2011-05-09 13:44 |只看该作者
支持支持!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP