服务器搭建还是需要一些Linux知识的,这节就聊点基础的。

文件权限操作

查看权限

Linux中每个文件对每个用户来说都有对应的权限,在任一路径中输入ll就可以查看这些信息:

root@ip-*** /usr/local # ll
total 32K
drwxr-xr-x 2 root root 4.0K Jan 14 17:00 bin
drwxr-xr-x 2 root root 4.0K Jan 14 17:00 etc
drwxr-xr-x 2 root root 4.0K Jan 14 17:00 games
drwxr-xr-x 2 root root 4.0K Jan 14 17:00 include
drwxr-xr-x 4 root root 4.0K Jan 14 17:08 lib
lrwxrwxrwx 1 root root    9 Jan 14 17:00 man -> share/man
drwxr-xr-x 2 root root 4.0K Jan 14 17:00 sbin
drwxr-xr-x 7 root root 4.0K May 27 14:02 share
drwxr-xr-x 2 root root 4.0K Jan 14 17:00 src

关于权限方面我们主要关注第1、3、4列 我们先来看第一列,第一列表示各用户对该文件/目录的操作权限,我把它断成四个部分, d|rwx|r-x|r-x 分别表示 类型|文件所有者权限|文件所属用户组权限|其他人的权限 。类型我们经常用到的有 d-目录--文件l-连接文件r(4)|w(2)|x(1) 分别对应 读|写|可执行(进入目录) 。 第三列和第四列分别代表文件所有者和文件所属用户组。

改变权限属性

改变文件权限需要用到 chmod 命令,上面我在 rwx 中标注了4、2、1,代表的就是它们的对应值,需要哪些权限把它们相加就是了,来个示例:

root@ip-*** ~ # ll  
total 4.0K
-rw-r--r-- 1 root root 25 Jun  8 02:33 dev.js

计算一下得到文件dev.js对各用户的权限值是644,下面使用chmod命令改变一下: root@ip-*** ~ # chmod 761 dev.js root@ip-*** ~ # ll total 4.0K -rwxrw---x 1 root root 25 Jun 8 02:33 dev.js 这里分别赋予 文件所有者|文件所属用户组|其他用户 的权限是 可读可写可执行|可读可写|可执行


另外,除了更改文件权限之外,还可以更改文件所有者和所在用户组,分别用到的命令是 chownchgrp ,具体使用方式可以使用 man 命令查看。

磁盘

一般在我们购买服务器的时候我们都会选择安装好一个Linux系统,分区啥的都已经配置好了,这方面对入门同学来讲并不需要掌握太多,主要注重查看。 查看磁盘使用 df 命令,加上参数-h使用以人类易读的方式展示。

压缩与打包

Linux中有很多软件是下载一个压缩包让用户自己解压安装的,这就需要我们掌握必要的压缩技能。使用比较广泛的有 gzipbzip2tar

gzip、zcat

gzip 应该说是目前Linux系统中使用最广的压缩命令了。它可以解开 *.z*.zip*.gz 等格式的压缩文件,下面来看它的使用方式:

root@ip-*** ~ # gzip -v dev.js 
dev.js:	 -8.0% -- replaced with dev.js.gz
root@ip-*** ~ # ls
dev.js.gz

这里的 -v 是为了在压缩结束后查看压缩比,当然还有其他参数:

-c 将压缩的数据输出
-d 解压缩
-t 校验压缩文件
-1~-9 设置压缩级别,-1最快,压缩效果也最差,-9最慢,压缩效果最好,默认-6,一般情况下使用默认的就可以了。

so,当我们需要解压缩文件的时候只要加上 -d 参数就可以了。 我们知道 cat 命令可以用来查看纯文本文件,那 zcat 就是用来查看纯文本被压缩后的压缩文件。 另外,需要注意的一点是使用 gzip 压缩后源文件就会被自动删除。

bzip2、bzcat

bzip2 是比 gzip 更优秀的压缩工具,用法跟 gzip 非常近似:

-c 将压缩的数据输出
-d 解压缩
-k 保留原文件
-z 压缩参数
-t 校验压缩文件
-1~-9 设置压缩级别,-1最快,压缩效果也最差,-9最慢,压缩效果最好。

其压缩文件以 *.bz2 格式存在, bzcat 的作用与 zcat 相似,不再赘述。

tar

上面我们讲到了压缩命令,但是这里的压缩都是单文件的,要是我想把多个文件压缩在同一个压缩包中光用上面的命令是做不到的,有的同学会说我们可以压缩一个文件夹啊,想法很好,但是不好意思,你这么做的话会类似这样的提示: * is a directory -- ignored 。所以这里我们要用到另一个工具 tar ,把那些文件打包成一个文件合集再使用压缩工具进行压缩。 值得一提的是, tar 还可以同时在参数中直接使用 gzip/bzip2tar 的命令非常多,介绍几个常用的:

-c 新建打包文件
-j/-z 使用bzip2/gzip压缩,打包文件名通常应该是*.tar.bz2/*.tar.gz
-t 查看打包文件内容,主要用来查看文件名
-x 解压缩,通常搭配 -C 用于解压到目标目录
-v 查看压缩/解压过程中,正在被处理的文件
-C 解压到指定目录,与 -x 一起使用
-f 后面接被处理的文件名

下面是几个常用的组合,一般情况下足以应付大部分使用场景了。

压缩(bzip2):tar -jcv -f target.tar.bz2 待压缩的目录
压缩(gzip):tar -zcv -f target.tar.gz 待压缩的目录
查看包含文件(bzip2):tar -jt -f target.tar.gz/target.tar.bz2
查看包含文件(gzip):tar -zt -f target.tar.gz/target.tar.gz
解压(bzip2):tar -jxv -f target.tar.bz2 -C 解压到某处
解压(gzip):tar -zxv -f target.tar.gz -C 解压到某处

来个实例:

root@ip-*** ~ # ls -a
.                        .config     .zcompdump-ip-172-31-17-254-5.0.2
..                       .oh-my-zsh  .zsh-update
.aptitude                .profile    .zsh_history
.bash_history            .ssh        .zshrc
.bashrc                  .viminfo    dev.js
.cloud-locale-test.skip  .zcompdump  test

root@ip-*** ~ # tar -jcv -f test.tar.bz2 .
...
./.oh-my-zsh/lib/completion.zsh
./.oh-my-zsh/lib/diagnostics.zsh
./.profile
./.zsh_history
./.cloud-locale-test.skip
./.bashrc

root@ip-*** ~ # ls -a
.                        .oh-my-zsh                         .zsh_history
..                       .profile                           .zshrc
.aptitude                .ssh                               dev.js
.bash_history            .viminfo                           test
.bashrc                  .zcompdump                         test.tar.bz2
.cloud-locale-test.skip  .zcompdump-ip-172-31-17-254-5.0.2
.config                  .zsh-update

打包压缩成功后,可以看到最后多了一个 test.tar.bz2 文件。另外,另外两组组合可以自己尝试一下,另外,解压强烈建议加上 -C 命令,以免覆盖原来的文件。

shell脚本

shell脚本是能够在shell环境中执行的程序,它遵从shell语法,有了它,我们可以为一些需要重复操作的系列连续性命令做一个合集,解放劳动力。 下面我先给个常用的git案例:

#!/bin/bash    //声明使用的shell环境
action="none"    //变量赋值
echo "1: commit to dev and update test"    //打印字符串
echo "2: merge branch to master"
read -p "please input number to select next step: " -t 30 action    //读取用户键盘输入并赋给 action 变量,30秒内无输入则跳过

case $action in    //case语句,判断条件为 action 变量
1)
    read -p "please input commit content: " -t 30 commit
    if [ "$commit" == "" ]; then    //if判断语法
        commit="default commit"    //条件符合执行的操作
    fi    //if判断语句结束
    git add .
    git commit -m "$commit"    //引用变量
    git push origin dev
    exit 0    //退出shell
    ;;    //满足 action 为1的条件的语句结束
2)
    echo "1: cyc"
    echo "2: bingqichen"
    echo "3: dev"
    branch[1]="cyc"    //数组赋值
    branch[2]="bingqichen"
    branch[3]="dev"
    read -p "please input number to select the branch: " -t 30 branch_no
    if [ "$branch_no" == "1" ] || [ "$branch_no" == "2" ] || [ "$branch_no" == "3" ]; then    //if条件判断,|| 表示或关系
        git checkout master
        git merge "${branch[$branch_no]}"    //${branch[1]}为数组的引值方法
        git push origin master
        git checkout -
    else    //另外还有 elif ,跟js中的 else if 类似,可以继续添加判断条件
        echo "sorry, this is an undefined branch!"
    fi
    exit 0
    ;;
*)    //action为其他值的操作
    echo "sorry, this is an undefined action!"
    exit 0
    ;;
esac    //case语句结束

这段脚本就是我用来解决git提交和代码合并的问题,大家可以根据自己的使用场景改造。大部分语句还是很简单的,主要有几个需要注意的点,比如条件判断语句: [ "$branch_no" == "1" ] 这里面的每个空格都不可以省略!还有赋值语句不能加空格,慎用单引号等等。

编译安装

Linux中安装软件的方法主要分为使用包管理器安装,和下载源代码自行编译安装,前者相对简单,但是有可能有些最新的软件包未必会有,比如PHP7,这时候就需要我们下载软件源码编译成二进制文件才能使用。 先来看看编译过程: 编译过程 大致过程是这样的,当我们下载到软件源码后,一般会是一个压缩包,解压之后里面会有一个用于建立 Makefile 文件的 config/configure 文件,使用 config/configure 建立 Makefile 后,执行 make 命令将源代码根据 Makefile 文件的配置进行编译,最后执行 make install 命令,将编译好的内容依据 Makefileinstall 选项安装到指定位置完成安装。 这里讲讲为什么要根据 Makefile 进行编译,其实GCC可以直接编译程序文件,但是一个软件不可能只拥有一个程序文件,要是人工一个个去编译每个文件,会非常劳民伤财!所以借助一个 Makefile 我们就可以搞定了。 下面来演示一个PHP7的编译安装:

root@ip-*** ~ # wget http://cn2.php.net/get/php-7.0.0.tar.gz/from/this/mirror    //下载源码
root@ip-*** ~ # ls
mirror
root@ip-*** ~ # mv mirror php.tar.gz    //重命名
root@ip-*** ~ # tar -zxv -f php.tar.gz    //解压缩源码包
root@ip-*** ~ # ls 
php-7.0.0  php.tar.gz
root@ip-*** ~ # cd php-7.0.0    //进入源文件目录
root@ip-*** ~/php-7.0.0 # ls    //里面会有一些手册,可以用来做安装参考
INSTALL            README.md            configure
...
root@ip-*** ~/php-7.0.0 # ./configure    //执行configure建立Makefile
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
...
checking for xml2-config path... 
configure: error: xml2-config not found. Please check your libxml2 installation.

我在编译到这一步报了一个错误,看起来是由于libxml2未安装,在我尝试安装后发现已经存在这个软件,在网上搜寻一片后发现还要安装libxml2-dev,这个我不是很懂。。。再次执行./configure成功并自动建立了Makefile文件,继续:

root@ip-*** ~/php-7.0.0 # make    //这个步骤视软件大小和硬件性能执行时间会有差异
/bin/bash /root/php-7.0.0/libtool --silent --preserve-dup-deps --mode=compile cc -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 -Iext/opcache/ -I/root/php-7.0.0/ext/opcache/ -DPHP_ATOM_INC -I/root/php-7.0.0/include -I/root/php-7.0.0/main -I/root/php-7.0.0 -I/root/php-7.0.0/ext/date/lib -I/usr/include/libxml2 -I/root/php-7.0.0/ext/sqlite3/libsqlite -I/root/php-7.0.0/TSRM -I/root/php-7.0.0/Zend    -I/usr/include -g -O2 -fvisibility=hidden    -c /root/php-7.0.0/ext/opcache/ZendAccelerator.c -o ext/opcache/ZendAccelerator.lo
...
Build complete.
Don't forget to run 'make test'.

编译结束时,应该能看到上面的提示, make test 是非必要的,自行选择,另外要注意的一点,如果你是二次编译的话需要先清理之前的编译出来的文件,即在 make 之前执行一下 make clean 到这里我们只要再执行一下 make install 就可以安装结束了。 这只是最基础的安装,我在这过程中省略了很多配置项,这样安装出来的软件是很“简陋”的,事实上在执行 ./configure 操作时,有很多可选项供我们配置,但是不同软件可以添加的参数是不一样的,怎么看当前的软件可以添加哪些参数呢?在软件源码目录执行 ./configure --help 就可以了:

root@ip-*** ~/php-7.0.0 # ./configure --help
...
Installation directories:
    --prefix=PREFIX         install architecture-independent files in PREFIX
                            [/usr/local]
...
SAPI modules:
    --enable-fpm            Enable building of the fpm SAPI executable
...

这里只列举了两个,一个是目标安装目录,一个是启用fpm,这些选项可以根据需要自行添加。 其实,很多软件通过添加软件源的方式还是可以用包管理器安装的,上面说的PHP7就是这样,不要打我???

其他资料

包管理器

Linux的包管理器有很多种,Cent OS有 yum ,Ubuntu有 apt ,还有别的像 aptitude 之类的,这里有一篇很好的文章供参考点我查看

oh-my-zsh

zsh 也是一个非常强大的 shell 环境,可以用它来代替Linux系统原有的 bash ,这是一组 zsh 的配置,它可以让zsh更加好用,感兴趣的可以看我的另一篇文章oh-my-zsh小记 ###htop 这是一个运行在终端的用于查看系统资源使用情况和管理进程的图形化工具,使用 yum 或者 apt-get 等安装即可,完成后直接输入 htop 就可以使用了,比原生的 top 更强大。