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