找回密码
 骑士注册

QQ登录

微博登录

搜索
❏ 站外平台:

Linux中国开源社区 技术 查看内容

命令行是你的至交好友

| 2013-03-15 14:25   评论: 3 收藏: 2 分享: 1    

再来谈一下用户权限

  本文中所谈及的所有权限问题都仅限于 *nix 操作系统。我对最新的 Windows 版本并不熟悉,但微软在其文件系统中使用了一种不同的权限概念。

用户和组

  同一台电脑中可以又数个不同的用户。事实上,很多应用注册自己的特殊用户,并在一个受限的环境里运行程序。每个用户以名称和/或 ID(UID) 区分。

你可以在 /etc/passwd 文件中找到现有用户的列表。

  组的列表存放在 /etc/group 文件中。一个组拥有一个名字和一个 ID (GID),并拥有另个或数个用户。每个用户通常还拥有一个与之对应的组,名称相同。

拥有者

  文件有其拥有者,默认情况,创建那个文件的用户就是它的拥有者。文件夹仅仅是一些特殊的文件,它们跟普通文件遵从一样的规则。

csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 20
drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 .
drwx------ 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba csaba 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir
d--------- 2 csaba csaba 4096 Feb 24 00:44 ThirdDir

  在ls -al命令中,每一个文件的拥有者会像“用户 组”(在这个例子中是“csaba csaba”)输出。我们可以用下面的方法改变AnotherDir这个文件夹的拥有者:

csaba@csaba-pc ~/tmp/NetTuts $ chown csaba:users ./AnotherDir/
csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 20
drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 .
drwx------ 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba users 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir
d--------- 2 csaba csaba 4096 Feb 24 00:44 ThirdDir

  chown命令用途是改变拥有者(CHange OWNer)。它有一个简单的用法:chown 用户:组 文件路径。一个用户只能将“组”这个位置改成一个他所在的组。一个普通用户不能更改他无权读取的文件的拥有者。当然,拥有管理员权限的用户,如 “root”,可以把任意文件的拥有者改成任意用户和组。

  这里有三种关于文件的权限:

  • r – 读取
  • w – 写入
  • x – 执行

  请注意: 如果一个文件夹内的文件可以被列出,这个文件夹本身拥有可执行的权限(x)。

  看看前面的例子,每一个文件系统的对象的权限在输出的开头(那些rwx字符)。每个标志位可以是”被设置“(那些有字母的位置),或者是“未设置”(用一个”-“标识,代表没有这个权限)。

  这三种权限被包含于三个组, 即每个组都有这三种权限:

  • 用户 – 对拥有者的权限
  • 组 – 对这个文件所在组的成员的权限
  • 其他人 – 对其他想要读取这个文件或文件夹的用户的权限

  这个叫做ThirdDir的文件夹没有任何标志位,所以它的拥有者也不能读取它:

chown: changing ownership of ‘./AnotherDir/’: Operation not permitted
csaba@csaba-pc ~/tmp/NetTuts $ ls -al ./ThirdDir/*
ls: cannot access ./ThirdDir/*: Permission denied

  但是拥有者拥有改变它的权限的权力:

csaba@csaba-pc ~/tmp/NetTuts $ chmod +rwx ./ThirdDir/
csaba@csaba-pc ~/tmp/NetTuts $ ls -al ./ThirdDir
total 8
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:44 .
drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 ..
csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 20
drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 .
drwx------ 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba users 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:44 ThirdDir

  chmod命令可以更改一个文件系统对象的权限,,它的用法是:chmod +/-权限 文件路径。使用+意味着你将给这个文件一个权限,-意味着去掉一个权限。你可以使用任意权限的组合。上个例子,我们给ThirdDir加上读取,写入,和可执行的权限。

  请注意: 用这个方式添加的读写和可执行权限,会作用于拥有者,组,和其他人。但是写入权限只会作用于当前的用户。

csaba@csaba-pc ~/tmp/NetTuts $ chmod +r-w ./ThirdDir/
csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 20
drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 .
drwx------ 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba users 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir
dr-xr-xr-x 2 csaba csaba 4096 Feb 24 00:44 ThirdDir

  第二个例子中,我们选择性的加上读取的权限,去掉了写入的权限,没有改动可执行权限。

  但是有时,你需要使用二进制的表示。chmod命令允许你使用10进制表示的二进制数据来更改权限。

  • rwx: 每一个bit都设置成1: 111. 十进制的7.
  • rw-: 由110代表. 十进制 6.
  • r-x: 由101代表. 十进制 5.
  • r--: 100. 十进制 4.
  • -wx: 011. 十进制 3.
  • -w-: 010. 十进制 2.
  • --x: 001. 十进制 1.
  • ---: 000. 十进制 0.

  chmod命令可以接受一个由0-7数字组成的字符串。每个数字由:用户,组,其他人,的顺序表示了特定的权限。

csaba@csaba-pc ~/tmp/NetTuts $ chmod 765 ./ThirdDir/
csaba@csaba-pc ~/tmp/NetTuts $ ls -al
total 20
drwxr-xr-x 5 csaba csaba 4096 Feb 24 00:44 .
drwx------ 7 csaba csaba 4096 Feb 19 21:09 ..
drwxr-xr-x 2 csaba users 4096 Feb 19 21:09 AnotherDir
drwxr-xr-x 2 csaba csaba 4096 Feb 24 00:06 SecondDir
drwxrw-r-x 2 csaba csaba 4096 Feb 24 00:44 ThirdDir

  这个命令设置了读取,写入,可执行给拥有者,读取,写入,不可执行给组,读取,可执行,还有不可写入给其他人。

Cat,Sed,Pipe

  下页是一些非常有用的命令。

Cat

  这个命令使用你能读出文件的内容。只要简单地提供一个文件名作为参数,之后它会输出这个文件的内容到标准输出(stdout)。

csaba@csaba-pc ~/tmp/NetTuts $ cat ./SecondDir/ThirdFile
./SecondDir/aFile
./SecondDir/AnotherFile
./SecondDir/ThirdFile
find: `./ThirdDir': Permission denied

Grep

  Grep查找一个模式并输出相匹配的行。你可以通过第三个参数指定要查找的文件:

csaba@csaba-pc ~/tmp/NetTuts $ grep "AnotherFile" ./SecondDir/ThirdFile
./SecondDir/AnotherFile

  加入--color选项,可以在结果行高亮匹配的内容。

Pipe 管道

  管道使用 | 这个字符表示; 它接受一个命令的输出并将其传给|后的命令. 这听起来好像挺简单的.但确是复杂的, 那一个符号| 实现起来却用了几万行代码,  你可以这样用: 

csaba@csaba-pc ~/tmp/NetTuts $ cat ./SecondDir/ThirdFile | grep "Another"
./SecondDir/AnotherFile

  这实际上运行cat命令, 而不是输出结果发送到标准输出, 管道将标准输出作为标准输入传给grep命令.grep命令读取输入的数据, 并搜索字条串"Another", 结果和我们先前的例子一样。

  The History of UNIX(unix的历史):  这是一个很有年代的视频,来自AT&T, 这是一个非常不错的视频.如果你只对PIPES感觉趣, 可以快进到4:56 

Sed

  sed 命令可以让你在输出中执行一些正则表达式操作。 sed可以用在标准输出或者管道命令中,它会输出结果到标准输出。

csaba@csaba-pc ~/tmp/NetTuts $ cat ./SecondDir/ThirdFile | grep "Another" | sed -e "s/AnotherFile/MyFile/"
./SecondDir/MyFile

  这个例子添加了sed命令。有了sed的帮助,我们可以在标准输出中将“AnotherFile” 替换为“MyFile”,是不是很酷?

  sed命令有很多选项,使用-e 参数指定要执行的正则表达式。如果你对正则表达式不熟悉的话,查看下面的手册: Introducing “Regular Expressions: Up and Running” or Regular Expressions Cheat Sheets.

定义你自己的命令行

  假设你需要经常执行下面的连接ssh的命令:

csaba@csaba-pc ~/tmp/NetTuts $ ssh my_username@complicated.server.address.com -p 8743

  你可以通过创建一个自定义的命令saysshcon来缩短这个命令。你可以使用alias来自定义命令。Alias语法类似这样的形式:alias shorthand='original_command'。

csaba@csaba-pc ~/tmp/NetTuts $ alias sshcon='ssh my_username@complicated.server.address.com -p 8743'

  但是alias是临时的,当你退出登录之后就会失效。一个可能的解决办法是编辑你的.bashrc文件。

.bashrc和.bash.profile文件

  .bashrc文件一般位于你的用户目录。这个文件可以让你指定任何你想在新开一个控制台或者登录一个shell时想要执行的命令。让我们把上面提到的sshcon加到里面。

csaba@csaba-pc ~/tmp/NetTuts $ mcedit ~/.bashrc

  把你的代码加到文件末尾,按F2保存文件,然后按ESC两次关闭文件。按CTRL+D退出shell,然后打开另一个shell,试试新添加的alias。

  一些操作系统, 像Solaris, 可能没有~/.bashrc文件。遇到这种情况,你可以编辑~/.bash_profile来实现这个操作。事实上,任何系统上都有~/.bash_profile。

  隐藏文件: 以一个点 (.) 开头的文件表明这个文件是隐藏文件。

些许网络命令

  让我们来玩些许网络命令。

Ping

  ping命令是一种用来检测一个服务器在线并可访问的一种简单方法。

csaba@csaba-pc ~/tmp/NetTuts $ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=47 time=44.0 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=47 time=65.6 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 44.081/54.871/65.661/10.790 ms
csaba@csaba-pc ~/tmp/NetTuts $ ping inexistent.server
ping: unknown host inexistent.server

  它的语言简单:ping IP_address_or_name。如果服务器可访问,你会看到详细回复列表。如果不可访问,会出现一个描述出错信息的问题。

Traceroute

  traceroute命令可以得出从你电脑到目标设备的路由。

csaba@csaba-pc ~/tmp/NetTuts $ traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  192.168.111.1 (192.168.111.1)  0.239 ms  0.322 ms  0.317 ms
 2  * * *
 3  95.77.39.65 (95.77.39.65)  45.754 ms  45.887 ms  46.024 ms
 4  ro-cj01a-rd4-xe-1-2-1-v1643.upcnet.ro (84.116.216.1)  83.121 ms ro-cj01a-rd4-xe-1-2-0-v1642.upcnet.ro (84.116.225.253)  83.289 ms ro-cj01a-rd4-xe-1-3-0-v1713.upcnet.ro (84.116.217.26)  83.119 ms
 5  84.116.217.93 (84.116.217.93)  83.153 ms 84.116.217.85 (84.116.217.85)  77.407 ms  77.350 ms
 6  84-116-131-53.aorta.net (84.116.131.53)  77.327 ms  53.442 ms  53.357 ms
 7  84.116.132.174 (84.116.132.174)  53.211 ms  48.923 ms  53.186 ms
 8  72.14.219.9 (72.14.219.9)  85.040 ms 72.14.214.29 (72.14.214.29)  67.289 ms  72.216 ms
 9  209.85.241.110 (209.85.241.110)  48.129 ms  47.389 ms 209.85.240.64 (209.85.240.64)  45.096 ms
10  72.14.239.62 (72.14.239.62)  47.254 ms 72.14.236.68 (72.14.236.68)  51.770 ms 72.14.239.62 (72.14.239.62)  43.242 ms
11  209.85.254.118 (209.85.254.118)  46.137 ms 209.85.254.116 (209.85.254.116)  52.165 ms 209.85.254.114 (209.85.254.114)  102.070 ms
12  * * *
13  google-public-dns-a.google.com (8.8.8.8)  47.471 ms  47.986 ms  43.645 ms

路由表

  *nix和Windows系统都有路由命令。尽管它们在语法上不同,但是基本的功能都是一样的。这个命令允许我们查看系统当前路由表,并在必要时添加或删除静态路由。

csaba@csaba-pc ~/tmp/NetTuts $ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.111.1   0.0.0.0         UG    0      0        0 eno1
loopback        localhost       255.0.0.0       UG    0      0        0 lo
192.168.111.0   *               255.255.255.0   U     1      0        0 eno1

  第一列是网络连接或通讯的目的地址。“default”指的是没有找到匹配的项或发送到本地的路由。Loopback是本地虚拟设备,它的IP地址是 127.0.0.1。这个IP地址在所有操作系统中都存在并总是指向本地机器(没有其它地址像127.0.0.1一样的功能)

  第二列是连接用以到达目的所使用的网关。第一行显示的是我的默认网关192.168.111.1。第二行是环回到达本地;第三行到达*,不需要网关用来访问我们自身的网络。

  第三个有趣的是最后一列:”Iface“。它指定用以同特定目的通信的接口。在我们的例子中,环回通信通过环回接口lo。其它的所有连接通过接口eno1。

  小贴士:如果你找不到route命令,可以试一下netstat -nr。它会产生相似的输出。

网络配置

  如果你想要瞅一眼网络配置,只需在命令行中键入 ifconfig。

csaba@csaba-pc ~/tmp/NetTuts $ ifconfig
eno1: flags=4163  mtu 1500
        inet 192.168.111.10  netmask 255.255.255.0  broadcast 192.168.111.255
        inet6 fe80::4e72:b9ff:fef6:c9ff  prefixlen 64  scopeid 0x20
        ether 4c:72:b9:f6:c9:ff  txqueuelen 1000  (Ethernet)
        RX packets 2935016  bytes 696255521 (664.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5586410  bytes 6331639146 (5.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 1  collisions 0
        device interrupt 17

lo: flags=73  mtu 16436
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 0  (Local Loopback)
        RX packets 7396  bytes 599533 (585.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7396  bytes 599533 (585.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  这里有很多信息。首先,我们拥有两部分,每个网络适配器一个。系统中,我的有线网卡名为 eno1。你可以看到如 e1000g0,eth0,en0 或是其它的名字。无线网络设备则通常(但并非绝对)以“w“开头。

  在名字的同一行中,则是接口的当前状态。这里,接口状态为 UP、broadcast、running等。 第二行则是 IPv4 IP 地址、子网掩码和网关地址。第三行与第二行相似,但对象是 IPv6。第四行以 “ether” 开始,是网卡的 MAC 地址,后面的数行则显示的是数据传输的统计信息。

当前网络连接

  另一个非常有用的命令是netstat。它可以列出系统所有的网络连接,以及相应的IP,接口,和系统所监听的端口。以上是我的系统中,netstat命令所输出的一部分。我去除了不相关的信息以使得其简洁些。

csaba@csaba-pc ~/tmp/NetTuts $ netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:59017           0.0.0.0:*               LISTEN
tcp        0     40 192.168.111.10:59017    109.99.97.81:53681      ESTABLISHED
tcp        0      0 192.168.111.10:51137    109.99.97.81:55175      TIME_WAIT
tcp        0      0 192.168.111.10:34715    173.194.70.109:993      ESTABLISHED
tcp        0      0 192.168.111.10:34722    173.194.70.109:993      ESTABLISHED
tcp        0      1 192.168.111.10:42876    86.162.58.4:7055        LAST_ACK
tcp6       0      0 :::111                  :::*                    LISTEN
tcp6       0      0 :::4434                 :::*                    LISTEN
tcp6       0      0 :::59017                :::*                    LISTEN

  每一行表示一个处于特定状态的连接,在这个例子中,你可以看到这些连接处于监听状态(看第一行,端口22,我的ssh服务端),已连接状态,等待状态等等。

最后的交代

  于是,你拥有了一些最常用的CLI命令!当然,这些命令的能力远超我在本教程中的介绍。希望我的文章能够为你揭开 CLI 神秘面纱的一角。感谢阅读!

 

文章来自:http://www.oschina.net/translate/the-command-line-is-your-best-friend

英文原文:The Command Line is Your Best Friend

参与翻译(9人):crab2313, showme, 风恒, 唇角轻扬, Khiyuan, lidashuang, fangjun105, processU,ShaoFantasy

12
查看其它分页:

收藏


最新评论

我也要发表评论

微博评论 2013-03-14 20:09 回复
我把shell叫做补丁

来自 万林wanlin 的新浪微博
Alerror 2013-03-14 21:49 回复

说实话我用手机只看第一页感觉在<<鸟哥的linux私房菜>>上都讲过就直接评论了:那时我的内存只有488M卡的很!!!我不断想让电脑在开机时直接命令行而不断尝试改配置文件,为此WUBI重装了数次!!!多翻翻那样的资料!!!

DeadFire 2013-03-31 01:55 回复
回复 Alerror 的帖子

嗯。不过翻译文章真是可遇不可求的,遇到了好的,就转过来哦。

返回顶部

分享到微信

打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。