本文是对日常使用linux,尤其在学习hadoop大数据组件时经常使用到的linux命令的一个总结,linux的每个命令都有很多可选的参数,在本文中不会详细的介绍每个命令的各种参数,只会介绍每个命令最常用的使用场景。本文共包括如下几部分:
- 基本概念
- 文件操作
- 用户管理
- 输入输出
- 网络操作
- vim
- 其它
一、基本概念
我们在使用Linux时,最基本的操作就是在控制台下执行各种linux命令。我们所执行的这些命令其实可分成两类:内部命令和外部命令。
内部命令和外部命令的最大区别是,内部命令是shell系统中内置的,不是一个独立的外部程序,因为有多种shell系统(如bash,csh,ksh),不同shell类型中支持的内部命令可能有些区别。
在本文中,我们使用的是最常用的bash。
而外部命令实际对应操作系统中的一个可执行程序,外部命令对应的程序文件通常位于/bin,/usr/sbin,/sbin,/usr/sbin这些目录中。
比如ps就是一个外部命令,对于外部命令,可以使用which和type命令找到它对应的程序文件位置。
$ which ps
/usr/bin/ps
$ type -a ps
ps 是 /usr/bin/ps
$ ls -l /usr/bin/ps
-rwxr-xr-x. 1 root root 100048 2月 17 2016 /usr/bin/ps
上面举例中的which命令是用于查找程序的物流位置,type显示命令的分类,可以看出ps对应一个外部的程序,利用ls命令查看程序文件的详细信息。
对于内部命令,因为不是独立的程序,所以用which命令查不到值,用type命令会显示时内部命令。如下面例子:
$ which eval
/usr/bin/which: no eval in ......
$ type -a eval
eval 是 shell 内嵌
$ which exit
/usr/bin/which: no exit in ......
$ type -a exit
exit 是 shell 内嵌
从上面例子的运行结果可以看出,eval和exit命令都是内部命令,which命令找不到对应程序文件。type命令结果明确显示是内部命令。
需要说明的是,linux中的许多内部命令,同时也有对应的外部命令。比如echo,pwd命令。
$ which echo
/usr/bin/echo
$ type -a echo
echo 是 shell 内嵌
echo 是 /usr/bin/echo
$ which pwd
/usr/bin/pwd
$ type -a pwd
pwd 是 shell 内嵌
pwd 是 /usr/bin/pwd
从上面例子可以看出,echo和pwd即是内部命令,也有对应的外部命令。对于这种命令,正常调用时,默认执行的是内部命令。如果希望执行外部命令,需要指定具体的外部程序(即全路径)来调用。
内部命令和外部命令还有一个重要的区别是,因为外部命令对应一个独立的程序,在调用外部命令时,实际会创建一个子进程(即linux中的forking)。比如:
$ ps -f
PID PPID C STIME TTY TIME CMD
3461 3375 0 09:54 pts/0 00:00:00 -bash
6901 3461 0 13:14 pts/0 00:00:00 ps -f
从上面输出可看出,ps是一个独立的进程,它的父进程(PPID)就是当前的shell进程(-bash)。
不过在实际的应用中,我们一般不需要关心一个命令是内部命令还是外部命令,它们的调用方式都一样。
下面来介绍一些常见的命令。
二、文件操作
(一)基本操作
目录和文件移动、拷贝和删除操作
- mkdir 创建目录
- mv 移动
- rm 删除
- cp 复制
- ls目录和文件的查看
当前目录操作
- pwd 查看当前目录
- cd xx 切换当前目录到指定目录
- cd 或 cd ~ 切换当前目录为用户的主目录,其中~代表用户的主目录
(二)文件访问权限
Linux系统的访问权限有两种方式,一是传统的权限控制,二是ACL(Access Control List,访问控制列表)方式的权限控制。使用ACL需要额外的操作,用的最多的还是传统的方式,下面我们介绍的是传统的权限控制。
文件访问权限有两个层面的意思:
第一,哪些用户可以有权限访问文件?
第二,用户可以怎样访问文件(分只读、可写、可执行)
可访问文件的用户分为三类:文件所有者(owner)、与文件相关联的组的成员(group)、其他用户(other)。
用户访问文件由三种方式:读取、写入、执行文件
在linux中,任何文件或目录都属于特定的用户,该用户就是文件所有者(owner)。每个文件或目录都有一个关联的用户组(group)。
我们先来看下如何查看文件的权限信息,这利用ls -l命令就可以查看。如下面例子:
$ ls -l hello.txt test.sh
-rw-rw-r-- 1 hadoop hadoop 18 4月 16 09:52 hello.txt
-rwxrwxr-x 1 hadoop hadoop 37 4月 16 14:43 test.sh
上面ls命令显示了hello.txt和test.sh两个文件的详细信息。
第一列值 -rw-rw-r-- 信息表示权限,后面解释。
第二列值 1 表示文件的链接数目,这和权限无关,我们先不管。
第三列值 代表文件的所有者,这里表示文件的所有者是用户hadoop。
第四列值 代表文件关联的用户组的名称,这里的用户组是hadoop。
我们再看第一列,可以看出一共有10个字符,其含义是:
第一个字符表示文件的类型,如果为-,表示是文件;如果是字母d,表示是目录,这里都是-,说明test.txt和test.sh都是文件。
后面9个字符的 前3个字符表示的是文件的所有者对该文件的权限,其中第1个位置代表是否有读的权限,如果是r表示有读的权限,如果是-表示无读的权限;第2个位置代表是否有写的权限,如果是w代表有写的权限,如果是-表示无写的权限;第3个位置代表是否有执行文件的权限,如果是x代表有执行的权限,如果是-表示无执行的权限。
对照这个规则,可以看出test.txt文件的所有者hadoop对该文件有读和写的权限,但没有执行的权限;test.sh文件的所有者hadoop对该文件有读、写、执行全部的三种权限。
中间的3个字符代表了组成员对该文件的权限,最后的3个字符代表了其他成员对该文件的权限,规则同上。
拥有执行权限和文件是否能被执行是两回事,如果文件本身不是可执行程序,即使用户对它有执行权限,该文件也没法被执行。另外,对于shell脚本,因为是脚本文件,执行时需要读取文件中的内容,因此对于shell脚本具有执行权限的前提是要有读取权限。但对于二进制可执行文件,可直接执行而无需读取,因此只需执行权限。
通过ls命令可以查看文件的访问权限,使用chmod命令可以改变文件的权限。
文件的拥有者(owner)使用chmod命令可以控制谁有权限访问文件以及如何访问文件。下面通过例子说明:
$ ls -l test.txt
-rw-r--r-- 1 hadoop hadoop 7 4月 16 09:59 test.txt
$ chmod a+w test.txt
$ ls -l test.txt
-rw-rw-rw- 1 hadoop hadoop 7 4月 16 09:59 test.txt
通过chmod a+w test.txt让所有用户对test.txt文件有写的权限,其中a表示所有用户,+表示增加,w是写的权限。
接着上面操作继续如下操作,如:
$ chmod o-rw test.txt
$ ls -l test.txt
-rw-rw---- 1 hadoop hadoop 7 4月 16 09:59 test.txt
上面chmod的参数中,o表示对其它用户,-表示减少权限,rw就是读和写的权限,整个命令含义是让其他用户对test.txt文件无读和写的权限,从执行后ls的结果可以看出。
chmod命令的参数中,u代表所有者,g代表组用户,o代表其它用户,a代表所有用户,+代表增加权限,-代表减少权限,r代表可读权限,w代表可写权限,x代表可执行权限。
执行chmod命令对一个文件修改访问权限,当前用户必须是文件的所有者或root用户,如果一个非文件所有者用户想执行chmod命令,则需要使用sudo命令(当前前提是该用户有sudo的权限)。如下面例子:
$ ls -l who
-rwxr-xr-x. 1 root root 49832 2月 16 2016 who
$ chmod o+w who
chmod: 更改"who" 的权限: 不允许的操作
$ sudo chmod o+w who
[sudo] password for hadoop:
$ ls -l who
-rwxr-xrwx. 1 root root 49832 2月 16 2016 who
上面例子中,who文件的所有者是root用户,其他用户对该文件只有读的权限,我们先在当前用户(非root用户)下执行chmod命令,会无权限的错误。然后我们使用sudo来执行,就可以了。wen
下面我们来介绍使用chown命令来改变文件的所有者和群组。有如下几种方式:
1、chown 新所有者 文件列表
上面命令格式的含义是将指定文件列表中的各文件的所有者改为指定的用户。
2、chown 新所有者:新群组 文件列表
上面命令的含义是将所有者和群组改为指定的所有者和群组。
3、chown 新所有者: 文件列表
上面命令的含义是是改变所有者,并改变群组为新的所有者所在的群组。
4、chown :新群组 文件列表
上面命令只改变群组,不改变所有者。
说明文件列表可以用通配符,如*,表示改变目录中的所有文件。
如果指定的文件是目录,想对目录及目录下所有的子目录和文件全部改变,可使用 -R 参数。
三、用户管理
1、先用命令 cat /etc/passwd 查看一下所有的用户 可以看到片你需要删除的用户名
2、用命令 who 查询当前登录的用户
3、用命令 ps -u 用户名 查看该用户的pid
4、用命令 kill pid 杀掉他的sshd或者是shell进程
5、再用命令 userdel -r 用户名 删除用户
在linux系统中,任何文件和目录都属于特定的用户,每个用户可以属于一个或多个组。每个用户和组都有唯一的ID和名称,用户名的ID称为UID,组的ID称为GID。
在linux控制台下执行如下操作:
创建用户,使用useradd命令,格式如:
useradd 用户名
例如:useradd hadoop
上面命令创建了一个hadoop用户,不带参数不会自动创建用户的主目录。
useradd -m hadoop
带-m参数会自动在/home目录下创建该用户的主目录
运行passwd命令,为用户设置密码,格式如:
passwd 用户名
例如:passwd hadoop
执行上面命令,会让输入新的密码。
注意,创建用户需要root用户权限。
如果希望从普通用户切换为root用户,使用su命令,操作如下:
[hadoop@localhost ~]$ su
密码:
[root@localhost hadoop]#
执行su命令,提升输入密码(指root用户密码),密码正确后当前用户切换为root用户。从上面例子可看出,普通用户和root用户界面显示是不一样的,首先[后面跟着的用户名不同,其次输入提示符不同,普通用户是$,root用户是#。如果要从root用户返回原普通用户,执行exit命令即可。如:
[root@localhost hadoop]# exit
exit
[hadoop@localhost ~]$
从上面例子可看出,执行exit后,当前用户从root用户变回原用户了。
因为root用户是超级用户,具有对系统的全部权限,在Linux系统的操作中,我们一般不直接使用root用户来登陆操作,而是通过普通用户使用sudo命令来来执行root用户的权限才能执行的命令。前提是该用户拥有sudo的权限。
要给普通用户(如上面创建的hadoop用户)增加sudo权限,可以这么操作。先在/etc/sudoers文件中找到下面两句
#User privilege specification
root ALL=(ALL:ALL) ALL
在下面添加一行
hadoop ALL=(ALL:ALL) ALL
这样hadoop用户就可以拥有sudo权限,然后就可以使用root用户的权限来执行命令了。如下面例子:
$ sudo ps -ef
[sudo] password for hadoop:
在要执行的命令前加上sudo,如果该用户有执行sudo的权限,则会提示输入密码(注意不是root用户的密码,而是该用户自己的密码)。这样就以root用户的权限来执行sudo后面跟着的命令了。
说明下,在linux下,不同权限的用户,即使都有权限执行相同的命令,但因为权限不同,输出的结果可能不同。
四、输入输出
(一)输出到屏幕
将信息输出到屏幕,最基本的方式使用shell命令 echo,这个我们在上面的例子中已经多次用到。
另外一个就是printf命令,该命令类似c语言中的printf函数,可以格式化输出信息。如下面的例子:
$ printf "hello\nworld\n"
hello
world
$ printf "name is %s age is %s\n" tom 12
name is tom age is 12
(二)从键盘获取用户输入信息
使用shell命令read命令可以读取用户在键盘输入的信息,并赋值给变量。
先看一个简单例子:
$ read -p ">" v1 v2
>hello world
$ echo $v1 $v2
hello world
上面例子中,read命令的-p参数跟的信息时用户输入提示符,上面例子是>。 后面跟着的是1个或多个变量名,上面例子有两个变量名,分别是v1和v2。
执行read命令后,会出现提示符,等待用户输入。用户输入信息后,按回车键。read命令会把该行信息中的各单词按顺序赋值给变量。
read命令还支持超时,即如果在指定的时间内用户不输入信息,则不再等待用户输入,read命令会结束。超时使用-t参数,如下面例子:
$ read -t 5 -p ">" v1 v2
>$ echo $?
142
上面例子中的-t 5表示设置超时时间为5秒,执行该命令后,如果5秒内用户不输入信息,则命令会结束,这时我们查询$?值,发现是非零(142),如果read命令是正常结束,查询$?的值为0。
如果我们希望用户在输入信息时,输入的信息不被显示,比如在输入密码等信息时,可以使用-s参数。如下面例子:
$ read -s -p ">" password
>$ echo $password
123456
上面例子的read命令加上了-s参数,运行命令时输入的123456不显示,但变量password的值就是123456,说明只是信息在输入时不显示,但输入的信息有效。
(三)从文件读取数据
bash提供了很多命令可以读取文本文件中的内容。
1、最常见的是cat命令,用于获取文件中所有的信息。
2、如果文件内容较多,希望分屏显示,可以用more命令,执行后会输出部分内容,按空格或回车键继续输出,每次只输出部分,多次后输出完毕,并且每次显示后会有已输出的进度提示。
如果我们只希望显示文件中指定的行的内容,bash提供了相应的命令支持。
1、tail -n -数字 文件名
表示查看文件的最后几行。如:
tail -n -5 derby.log
上面命令输出derby.log文件中的最后5行。
2、tail -n +数字 文件名
用于查看文件的某一行到最后一行数据。
3、head -n 数字 文件名
用于查看文件的前几行
4、sed -n "开始行,结束行p" 文件名
用于查看文件的开始行到结束行的内容。
(四)管道符
管道符号|是bash的一个重要特点,它可以轻易的连接两个毫不相关的程序(或命令),把一个程序的结果交给另一个来处理,而且可以连接超过2个程序的多个程序。
我们先看一个常见的例子:
cat test.txt | grep data
其中cat命令是输出指定文件中的内容,grep命令是查询文本中带有某关键字的行,并输出所有满足条件的行。上面例子利用管道符号|将两个命令连接起来,功能就是查找test.txt文件中每行文本包含data字符串的文本行。
再看一个例子:
ps –ef |grep ssh
其中ps -ef命令是用于进程查看,其中-e为显示所有进程,-f为全格式显示。上面例子的作用是查看ssh服务是否启动。
(五)重定向
默认情况下,shell命令从终端(控制台)获取输入,并将产生的信息输出到终端(控制台)。如我们前面例子中看到的echo, read命令。
linux的重定向功能,就是利用一些特殊的符号可以改变命令的输入、输出来源。
最常见的操作,我们可以把本该输出到控制台的信息输出到文件中。
如下面例子:
$ echo hello world > hello.txt
$ cat hello.txt
hello world
利用特殊符号 > 可以将输出到控制台的信息输出到文件中。上面例子中我们将echo命令的输出信息重定向到文件hello.txt中。如果指定的文件不存在,则会新建文件,如果存在,则会覆盖文件内容。
我们在上面命令执行的基础上继续如下命令执行:
$ echo data1 > hello.txt
$ cat hello.txt
data1
从cat命令的输出可以看出,hello.txt文件中的原有内容被echo命令输出的内容覆盖了。
如果我们希望不覆盖文件中原内容,而是追加到文件的后面,采用符号>>,如下面例子:
$ echo data2 >> hello.txt
$ echo data3 >> hello.txt
$ cat hello.txt
data1
data2
data3
可以看出,使用>>后,输出的信息被追加到文件的后面,而不是覆盖。
上面介绍了输出重定向,我们再看下输入重定向,比如可以将本该从键盘读取的信息改为重文件读取,输入重定向使用<符号。
如下面例子:
$ echo tom 21 > test.txt
$ cat test.txt
tom 21
$ read name age < test.txt
$ echo $name $age
tom 21
上面例子,我们先用输出重定向>将信息输出到文件中,然后用输入重定向将文件中的第一行文本输入给read命令。
我们再看一个例子:
$ wc -l hello.txt
3 hello.txt
上面的wc -l 命令用于统计文件中的行数,但是输出信息除行数外,还多了一个文件名。如果我们希望只输出行数,可以利用输入重定向,如:
$ wc -l < hello.txt
3
可以看出,只输出了行数,这是因为使用输入重定向后,wc命令仅知道从标准输入读取信息。
我们还可以将输入、输出重定向结合在一起使用。如下面例子:
$ wc -l < hello.txt > count.txt
$ cat count.txt
3
上面例子我们先利用输入重定向统计看了hello.txt文件内容的行数,然后将结果输出重定向到count.txt文件中。
Linux的重定向功能非常强大,再结合上节的管道符号,可以实现各种强大的操作,本文只是做下简单的介绍。
五、网络操作
netstat -nlp|grep :10001
上述命令可以列出当前侦听10001端口的进程信息。
ssh localhost
使用ssh连接到指定的linux服务器,上面的localhost表示连接到本机
nc命令是一个任意的TCP和UDP连接和监听工具,比如
nc -l 1234
上述命令可以在本机建立一个socket服务器,侦听端口是1234.
nc lcoalhost 1234
上述命令可以创建一个socket客户端,连接到本地的1234端口。
当我们需要一个简单的socket客户端或服务器进行测试时,nc命令就很方便。当然nc命令的功能很强大,上面只是应用之一。
六、vim
vi是linux中最基本的文本编辑器程序,vim是其增强版。vi/vim虽然简单,但很强大,不过习惯了windows下的文本编辑方式,开始使用会有些不习惯,但一旦熟悉了就觉得很好。本章节简单介绍下vim的使用,只介绍最基本的功能。
启动vim,在shell提示符下执行 vim 文件名,就可以打开指定的文本文件,如果文件不存在,则会打开一个空文件。这时就可以开始编辑文件了。
vim运行后,有两种模式,一是命令模式,二是插入模式,只有在插入模式下才能插入新的字符。启动后,默认是命令模式。这时可以通过键盘上的上下左右4个键把光标移动到想插入字符的位置。
1、按下键盘上的i键或a键,进入插入模式,如果按的是i键,则在光标前开始插入,如果按的是a键,则再光标后开始插入。这时就可以在光标处输入信息,在插入的过程中,也可随时移动光标到新的位置。按enter键可以换行。
2、按esc键,退出插入模式,切换到命令模式。
3、在命令模式下,按shift加冒号(:)键,会出现一个:提示符,这时输入wq,按回车,则会保存修改的文件,退出vim。如果不保存退出,则输入q!,按回车。如果文件没被修改想退出,输入q,按回车。
4、在插入模式下,按backspace或delete键可以删除字符。在命令模式下,按x字母键可以删除字符。
5、如果想删除整行文本,在命令模式下,连续按两次d字母键即可。
6、插入新行。在插入模式下,光标移至行尾,回车,则会在下一行出现新行,光标也移到新行,可直接输入;光标移至行首,回车,则会在上一行出现新行,光标也移到新行,可直接输入。在命令模式下,按小些的o字母键,则会当前行的的下一行出现新行,光标也移到新行,可直接输入;按大写O字母键,则会当前行的的上一行出现新行,光标也移到新行,可直接输入。
七、其它
tar –zxvf hadoop-2.7.6.tar.gz
上面命令是解压压缩文件。
kill 进程号
杀死进程,让进程退出。
ps
ps命令用户查看系统中的进程信息。
本文只是对linux shell的一些单个命令进行了介绍,其实Linux shell本身也是一种脚本编程语言,可以编写程序,详细信息可参见《Linux Shell编程学习笔记》。