Linux下的命令到底有多少,没人清楚。但是有一些命令是大多数系统都包含的,这些命令基本上都包含在GNU Coreutils包中。当然也有一些不包含在Coreutils包中,但是也很基本,很实用的软件,例如Sed,Awk,Grep等等。很多人包括我自己可能只用过其中的部分命令,而且即使对这部分命令,也可能只掌握了部分功能而已。另外一方面,网上有很多初学者,面对这么多的命令往往不知道如何下手,频繁着问如何学习Linux命令,因为他们不知道哪些命令有用,哪些参数有用。我们都是从新手走过来,而且学海无涯,我们依然需要不断的学习与总结,这也是我为什么要写这一系列文章的原因所在。

本系列的名称为学习Linux命令 (Learn linux command),至于学习哪些Linux命令,我自己也说不上来,只能说学习一些有用的命令,让人效率提升的命令,并且是一些基本的命令(系统自带的,所以不包括一些工具命令)。在这个系列里,我和各位一样也是一个学生,共同学习。

本系列文章中,命令出现的顺序与重要程度无关,完全是随机的。每一篇文章包含10个命令,特别重要的命令会单独一遍文章介绍。对于命令的介绍,这里不会罗列一个命令有多少参数,而只是通过例子介绍某个命令最有用的参数。如果大家要进一步了解命令的参数的意义,欢迎查阅相应的man手册,直接搜索定位某个参数。

uname - print system information

首先用uname命令看看你是什么系统:

[kodango@devops ~]$ uname
Linux

它告诉我,我用的是一个Linux系统。我想看看uname还能显示什么值,打开Windows上安装的Cygwin,同样执行这个命令,它告诉我用的是CYGWIN_NT-6.1:

tuantuan.lv@devops ~
$ uname
CYGWIN_NT-6.1

但是等等,这个好像不是一个系统名称,它到底是什么呢?看了下man手册,它告诉我们不带参数执行uname命令,效果等同于uname -s,它的作用是显示内核名称。如果要显示你的操作系统是什么,可以使用-o选项:

[kodango@devops ~]$ uname -o
GNU/Linux

tuantuan.lv@devops ~
$ uname -o
Cygwin

如果你想知道更多uname显示的内核或者操作系统有哪些,可以查看uname的wikipedia页面

知道了系统的基本信息之后,我还想进一步知道我用的是什么内核版本,很简单通过-r选项就可以显示内核版本号:

[kodango@devops ~]$ uname -r
3.6.2-1-ARCH

有一个比较容易混淆的选项是-v,它的描述是显示内核版本(print the kernel version),但是实际上它的输出往往是内核发布的时间(superuser上也有一个关于这个疑惑的回答):

[kodango@devops ~]$ uname -v
#1 SMP PREEMPT Sat Oct 13 07:19:40 CEST 201

通过uname命令,我们还可以查询自己的hostname:

[kodango@devops ~]$ uname -n
devops

OK,现在我们用-a选项显示全部信息吧:

[kodango@devops ~]$ uname -a
Linux devops 3.6.2-1-ARCH #1 SMP PREEMPT Sat Oct 13 07:19:40 CEST 2012 i686 GNU/Linux

上面的信息,从左到右依次是"KERNEL-NAME NODENAME KERNEL-RELEASE KERNEL-VERSION MACHINE OPERATING-SYSTEM"。

who - show who is logged on

使用who命令可以观察当前系统登录用户的情况,当然对于桌面用户,这个命令可能用处不是非常大。

下面是我在虚拟机中执行who命令(等价于who -s)的输出:

[kodango@devops ~]$ who
kodango  pts/0        Dec 29 12:12 (10.0.2.2)
kodango  pts/1        Dec 29 12:23 (10.0.2.2)
kodango  pts/2        Dec 29 12:54 (10.0.2.2)
kodango  pts/3        Dec 29 13:25 (10.0.2.2)
guest    pts/4        Dec 29 13:28 (devops)

解释一下,我打开了几个shell容器,并且使用guest账号ssh到本机器,所以上面会显示5个登录用户。上面的输出中,从左到右分别是登录用户、登录终端(这里是虚拟终端)、登录时间以及远程地址。由于前面4个地址都是我在主机上ssh到虚拟机的,所以显示的是虚拟网关的地址。而最后一个guest,是ssh到localhost,所以显示的是虚拟机的地址。可以在执行who命令的时候加上-H选项,就可以显示每列的标题:

[kodango@devops ~]$ who -H
NAME     LINE         TIME         COMMENT
kodango  pts/0        Dec 29 12:12 (10.0.2.2)
kodango  pts/1        Dec 29 12:23 (10.0.2.2)

如果要查看当前登录的用户(自己),可以使用-m选项:

[kodango@devops ~]$ who -m
kodango  pts/2        Dec 29 12:54 (10.0.2.2)

另外一各方法是使用-u选项,它会列出当前登录的账号,并且附加一些额外的信息。为了方便解释,这里也同样使用-H选项显示标题:

[kodango@devops ~]$ who -uH
NAME     LINE         TIME         IDLE          PID COMMENT
kodango  pts/0        Dec 29 12:12 03:48         268 (10.0.2.2)
kodango  pts/1        Dec 29 12:23 00:02         458 (10.0.2.2)
kodango  pts/2        Dec 29 12:54   .           268 (10.0.2.2)
kodango  pts/3        Dec 29 13:25 03:27         268 (10.0.2.2)
guest    pts/4        Dec 29 13:28 03:30         689 (devops)

带上-u选项后,登录时间后面会多出一列IDLE,它说明某个登录用户空闲(不操作)的时间,而点号'.'表示当前活动的用户,还有OLD表示很久不操作的用户(这里并没有出现)。

除了查看登录用户的情况外,who命令还提供了两个选项用于查看系统启动的时间以及当前系统运行的级别:

[kodango@devops ~]$ who -b
         system boot  Dec 29 12:11
[kodango@devops ~]$ who -r
         run-level 5  Dec 29 12:12

当然,who也提供了-a选项用于显示所有信息。

w - Show who is logged on and what they are doing

前面的who命令可以让我们知道当前用户登录的情况,但是不能知道他们在做什么?如果要看某个用户在执行什么命令就可以用w命令了。这个命令非常简单,基本上默认不加任何选项就可以了,或者带-f选项显示远程地址:

[kodango@devops ~]$ w
 17:11:08 up  4:59,  5 users,  load average: 0.00, 0.01, 0.05
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
kodango  pts/0     12:12    1:48   0.70s  0.02s less -s
kodango  pts/1     12:23    8:58   0.66s  0.41s info coreutils who invocation
kodango  pts/2     12:54    0.00s  1.00s  0.01s w -u
kodango  pts/3     13:25    1:02   0.46s  0.25s ssh guest@localhost
guest    pts/4     13:28    3:37m  0.17s  0.17s -bash

w命令显示的信息很全,首行显示了当前的时间,系统运行的时间,当前登录的用户个数以及系统的负载情况。

后面的就是当前登录用户的一个概览了,其中JCPU和PCPU分别表示所属终端所有进程以及当前运行进程占用的CPU时间。what一列就是当前终端正在执行的进程,它们分别是man命令、info命令、w -u命令、ssh命令以及什么都没执行的bash会话。

id - print real and effective user and group IDs

现在,我们知道系统中已经登录的用户情况,也知道他们现在都在做什么。下一步,我们想了解更多关于我们自己的情况,比如属于哪个组,组id,用户id,用户名称是什么,等等诸如此类的信息。那么,这个时候id命令就派得上用场了。

直接执行idcode>id命令可以查看用户信息,如果不跟某个用户名,则默认显示当前用户的信息:

[kodango@devops ~]$ id
uid=1000(kodango) gid=1000(kodango) groups=1000(kodango),7(lp),10(wheel),50(games),91(video),92(audio),93(optical),95(storage),96(scanner),98(power),100(users),109(vboxsf)

上面的信息比较杂乱,我们可以通过不同的选项查看自己关心的信息:

[kodango@devops ~]$ id -u   # 当前用户的ID
1000
[kodango@devops ~]$ id -g   # 当前用户的组ID
1000
[kodango@devops ~]$ id -G   # 当前用户属于哪些组
1000 7 10 50 91 92 93 95 96 98 100 109

但是,上面显示的全是数字ID,并不直观,可以在每个选项后面增加-n选项显示名称:

[kodango@devops ~]$ id -un
kodango
[kodango@devops ~]$ id -gn
kodango
[kodango@devops ~]$ id -Gn
kodango lp wheel games video audio optical storage scanner power users vboxsf

在脚本里面,我们有时候会需要判断当前用户是否root账号,就可以利用id命令来完成:

[kodango@devops shell_temp]$ [ `id -u` -eq 0 ] || echo "not root ueer"
not root ueer
[kodango@devops shell_temp]$ sudo su root
[root@devops shell_temp]# [ "`id -un`" = "root" ] && echo "root user"
root user

useradd/passwd/gpasswd/usermod/userdel

现在我们已经有了一个登录的账号,但是有时候难免需要创建新的账号,或者更新账号的信息,那就用得上useradd/userdel/usermod了。

利用useradd来创建一个新的用户,useradd命令的参数个数比较多,很容易吓走一批新手,但是事实上,有用的参数就几个,我们可以组合几个选项就可以创建一个新的账号,而且在大多数情况下都仅会用到这几个参数,它们分别是-m(创建个人家目录),-s(指定登录shell,例如/bin/bash),-U(创建与账号同名的组名),-G(将新创建的账号添加到特定的组,组之间用逗号分隔),例如在ArchLinux安装笔记中用到的创建新账号的命令(简化版):

[kodango@devops shell_temp]$ sudo useradd -m -U -s /bin/bash -G wheel guest
[kodango@devops shell_temp]$ id guest
uid=1001(guest) gid=1001(guest) groups=1001(guest),10(wheel)

账号创建完成后,先别急着登录,因为目前为止还没给新账号设置登录密码,这时候需要通过passwd命令来设置密码:

[kodango@devops shell_temp]$ sudo passwd guest
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

有时候,为了使用某个工具或者脚本,需要将用户添加到特定的组里面。这时候可以使用gpasswd命令来完成,gpasswd是用于管理用户组信息的命令,例如将guest账户添加到video组:

[kodango@devops ~]$ sudo gpasswd -a guest video
Adding user guest to group video

折腾的用户是最可怕的,他们需要更多的操作空间,usermod可以用于修改账号的信息,比较常见的一个用法是移动家目录,例如将guest用户的家目录迁移到/home/new_home目录下:

[root@devops ~]# usermod -m -d /home/guest_home guest
[root@devops ~]# ls /home/guest_home/ -la
total 32
drwx------ 2 guest guest 4096 Dec 29 17:53 .
drwxr-xr-x 4 root  root  4096 Dec 29 17:53 ..
-rw-r--r-- 1 guest guest   21 Jul 20 10:00 .bash_logout
-rw-r--r-- 1 guest guest   57 Jul 20 10:00 .bash_profile
-rw-r--r-- 1 guest guest  141 Jul 20 10:00 .bashrc

这里值得注意一点的是,-d和-m选项一般情况就都是同时使用的,否则新的家目录必须是已经存在的目录。

这里我创建guest账号的目的只是为了演示,现在我要用userdel命令把它删除了:

[root@devops ~]# userdel -r guest

同时,我们通过-r选项删除该用户的家目录。

cd - Change the shell working directory

cd命令相信是大家用得最多的一个命令之一了,它是一个shell的内置命令(内置命令可以通过help命令来查找帮助,例如help cd。它的用法看起来很简单,但是还是有一些小点可以说的。

例如,如果要回到当前用户的家目录,有以下三种方法:

cd
cd ~
cd ~kodango

其中,第三种方法还可以跳转到指定用户的家目录。

cd命令后面如果跟着一个相对路径的话,默认是相对于当前目录去查找的,但是你也可以通过设置环境变量CDPATH来更改查询范围,这个变量有点类似PATH变量。例如:

[kodango@devops ~]$ CDPATH=/etc/ cd profile.d
/etc/profile.d

如果跟着的目录名为'-',则表示回到上一个目录,实际上该用法等价于cd "$OLDPWD" && pwd,因为每当你更改目录时,shell都会将上一个目录位置记录在环境变量OLDPWD中。所以在刚登录shell的时候执行cd -是会报错的:

[kodango@devops ~]$ cd -
-bash: cd: OLDPWD not set