#Linux/7 --- [TOC] ## 常用快捷键 ``` lsof -i:8000 查看端口占用的进程 netstat -lntp | grep 8000 查看端口 ss -plat | grep 8000 查看端口 kill -9 pid 值 强制删除进程 pkill httpd killall httpd ps -ef|grep client.php |grep -v grep|awk '{print $2}'|xargs kill -9 删除包含 client.php d 进程 find oneinstack/ -name *.sh | xargs chmod +x 给所有 sh 后缀结尾的文件添加可执行权限 Ctrl+z/ 切到后台 jobs 查看 fg [jobs对应id] 如fg 1 切换到前台 commad ; commad 多条命令之间用 ; 连接 tail -f /data/www/run.log/ 不断刷新日志输入 px aux | grep redis 查看进程是否存在 vim `which phpize` 输出 反引号的数据 systemctl stop firewalld.service systemctl disable firewalld.service grep abc my.conf 搜索文件下的字符 grep abc ./* 搜索当前目录下的所有文件是否有 abc sudo -u kingbase /etc/rc.d/init.d/kingbase8d start 临时切换用户,并执行命令 ctrl + w 删除你键入的最后一个单词 /*===命令行i移动操作===*/ Alt + f :按单词前移(右向) Alt + b :按单词后移(左向) Ctrl + u :从光标处删除至命令行首 Ctrl + k :从光标处删除至命令行尾 Ctrl + w :从光标处删除至字首 Alt + d :从光标处删除至字尾 ``` ## 查看系统日志 `var /var/log/messages` ## 常用别名命令 vi ~/.bashrc ``` alias ll='ls -lht' #按修改时间逆序列出文件 alias la='ls -lhta' #按修改时间逆序列出所有文件 alias size='f(){ du -sh $1* | sort -hr; }; f' # size ,size / alias sekc='f(){ find ./ -name $1; }; f' # 在当前找文件 , sek myfile alias portopen='f(){ /sbin/iptables -I INPUT -p tcp --dport $1 -j ACCEPT; }; f' # 打开端口 portopen 8080 alias portclose='f(){ /sbin/iptables -I INPUT -p tcp --dport $1 -j DROP; }; f' #关闭端口 alias www='f(){ python -m SimpleHTTPServer $1; }; f' #开启文件服务 www 8080 alias auto='systemctl list-unit-files --type=service | grep enabled | more' # 查看开机启动项 alias untar='tar xvf ' # untar a.tar.gz alias ipe='curl ipinfo.io/ip' ``` ## 设置别名 [alias] - 设置临时别名 ``` alias www='cd /var/www' ``` - 永久别名 > 更改~/.bashrc或/etc/bashrc,前者是针对单用户,后者针对全局用户 ``` vim ~/.bashrc #内容 alias h='history' 生效 source ~/.bashrc ``` ## 进程相关 ### 杀掉进程 ``` [root@localhost www]# ps PID TTY TIME CMD 2928 pts/0 00:00:00 sudo 2929 pts/0 00:00:00 su 2930 pts/0 00:00:00 bash 3848 pts/0 00:00:00 ps [root@localhost www]# kill 2929 ``` ### 查看某个pid 是否运行 ``` [root@localhost www]# ps -p 104101 PID TTY TIME CMD 104101 ? 00:00:02 UpPushServer ``` 看第二行是否存在 ## 用户操作 ``` 添加用户:useradd -m 用户名 设置密码 passwd 用户名 删除用户:userdel -r 用户名 ``` ## 文件处理 ``` mkdir -p 递归创建目录 cp -a 复制 -r 复制目录 -p 连带文件属性复制 -d 若源文件是链接文件.则复制链接属性 -a 相当于 -pdr(前三个相加) ln -s 创建链接 s 创建软链接 相当于windows的快捷方式 ``` ## 历史命令:history >提示 alias h='history' ``` history [n] 显示前n 条的历史 history [-c] 清空历史 !n 执行第n条的指令 ``` ## 开关机操作 ``` shutdown -k : 不要真的关机,只是发送警告讯息出去! -r : 在将系统的服务停掉之后就重新开机(常用) -h : 将系统的服务停掉后,立即关机。(常用) -c : 取消已经在进行的shutdown 指令内容。 shutdown -h now shutdown -h 20:25 shutdown -h +10 shutdown -r now reboot 关机 ``` ## 欢迎界面 ``` vim /etc/motd 欢迎使用本服务器,连接后自动展示此段文字 ``` ## 文件/文件夹权限 ### chgrp 改变组 ``` -rw-rw-r--. 1 vagrant vagrant 15 Aug 17 08:34 test [root@localhost vagrant]# chgrp root test.php -rw-rw-r--. 1 vagrant root 15 Aug 17 08:34 test ``` ### chown 改变档案拥有者和组 ``` -rw-rw-r--. 1 vagrant vagrant 15 Aug 17 08:34 test [root@localhost vagrant]# chown root:sftp test -rw-rw-r--. 1 root sftp 15 Aug 17 08:34 test ``` ### chmod 改变权限 `r`可读 `w`可写 `w`可执行( 对目录而言是**能否进入该目录**) r:4 w:2 x:1 owner = rwx = 4+2+1 = 7 group = rwx = 4+2+1 = 7 others= --- = 0+0+0 = 0 ``` -rw-r--r--. 1 root root 26 Aug 16 06:10 test.php [root@localhost vagrant]# chmod 755 test.php -rwxr-xr-x. 1 root root 26 Aug 16 06:10 test.php ``` chmod u=rwx,g=rx,o=r test.php chmod a+w test.php -a all 所有分组 所有组加上可写权限 ## 目录 ### 根目录 |目录|说明| |---|---| |/bin|可执行文件| |/boot|放置开机会使用到的档案| |/dev|周边设备,以文件形式放置在此目录| |/etc|系统设置文件,其他权限可看,root可写| |/lib|/lib放置的则是在开机时会用到的函式库| |/media|放置的就是可移除的装置啦| |/mnt|暂时挂载某些额外的装置| |/opt|给第三方软体放置的目录| |/run|规定系统开机后所产生的各项信息| |/sbin|为开机过程中所需要的,开机、修复、还原系统所需要的指令| |/srv|『service』的缩写,如WWW, FTP| |/tmp|程序暂时放置档案的地方| |/usr|看下表| |/home|用户目录| |/lib|用来存放与/lib 不同的格式的二进位函式库| |/root|系统管理员(root)的家目录| ### /usr (Unix Software Resource的缩写) |目录|说明| |---|---| |/usr/bin/|/bin为此快捷目录| |/usr/lib/|/lib为此快捷目录| |/usr/local/|自行安装的软件| |/usr/sbin/|/sbin为此快捷目录| |/usr/games/|与游戏相关的文档| |/usr/include/|c/c++等程式语言的档头(header)与包含档(include)放置处| |/usr/libexec/|不被一般使用者惯用的执行档或脚本(script)| |/usr/lib<qual>/|与/lib<qual>/功能相同,因此目前/lib<qual> 就是连结到此目录中| |/usr/src/|一般原始码建议放置到这里| ### /var |目录|说明| |---|---| |/usr/cache/|程序运行时产生的一些暂存档| |/usr/lib/|程式本身执行的过程中,需要使用到的资料档案放置的目录,如MySQL资料库放置在/var/lib/mysql/| |/usr/lock/|些装置或者是档案资源一次只能被一个应用程式所使用,如刻录机| |/usr/mail/|放置个人电子邮件信箱的目录| |/usr/run/|/run 为此快捷键| |/usr/spool/|排队等待其他程式使用的资料,如系统收到新邮件| |/usr/log/|软件或系统的日志| |/usr/log/|软件或系统的日志| |/usr/log/|软件或系统的日志| ## 目录 ``` cd [空] 进入当前登录者的home pwd 显示当前的目录 (Print Working Directory) mkdir 新建目录 mkdir -p test1/test2/test3/test4 递归建立目录 mkdir -m 711 test2 建立权限为711的存档 rmdir 删除空目录 rmdir -p test1/test2/test3/test4 递归删除目录 ``` ## 路径 ``` [root@localhost tmp]# PATH="${PATH}:/root" 添加路径 /root 路径 [root@localhost tmp]# echo $PATH /sbin:/bin:/usr/sbin:/usr/bin:/root ``` ## 复制、删除与移动:cp,rm,mv ### 复制 ``` cp [option] source1 source2 -a 档案的属性,权限,时间一起复制(常用于备份) -i 若目标已经存在,则进行询问 -r 可以复制目录(可能会改变文件属性,可用-a 代替) -u 目标文档与源文档有差异复制(常用于备份) ``` ### 删除 ``` rm [-fir]档案或目录 -f 忽略不存在的档案,不会出现警告讯息 -i 在删除前会询问 (y/n) -r 递归删除 ``` ### 移动(重命名) ``` mv [options] source1 source2 source3 .... directory -f 如果目标档案已经存在,不会询问而直接覆盖 -i 如果目标已经存在,就会询问是否覆盖 (y/n) -u 若目标档案已经存在,且source 比较新,才会更新 ``` ## 档案内容查阅 ``` cat 由第一行开始显示档案内容 tac 从最后一行开始显示,可以看出tac 是cat 的倒着写! nl 显示的时候,顺道输出行号! more 一页一页的显示档案内容 less 与more 类似,但是比more 更好的是,他可以往前翻页! head 只看头几行 tail 只看尾巴几行 od 以二进位的方式读取档案内容! ``` ## 修改档案时间或建置新档 - modification time (mtime): 文档内容变更时变化 - status time (ctime): 文档权限与属性改变时变化 - access time (atime): 读取该文档时,变化 ``` touch [-acdmt]档案 -a 仅修订access time -c 仅修改档案的时间,若该档案不存在则不建立新档案; -d 后面可以接欲修订的日期而不用目前的日期 -m 仅修改mtime ; -t 后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm] ``` ``` touch -d "2 days ago" test.php 变更ctime ``` ## 档案预设权限:umask ** 查看当前属性** ``` [root@study ~]# umask 0022 [root@study ~]# umask -S u=rwx,g=rx,o=rx ``` *注1:0222 先只需要考虑后三位022 , 删掉什么权限就写什么数,如需要删掉写的权限(r=4,w=2,x=1) 则删除2* *注2:若使用者建立为『档案』则预设『没有可执行( x )权限』,亦即只有rw这两个项目,也就是最大为666* **预设** 之后新创建的文件和目录会按照新设置的权限 ``` //设置权限 [root@study ~]# umask 002 //新创建的文件为 -rw-rw-r-- //新创建的目录为 drwxrwxr-x ``` ## 设定隐藏属性 ``` chattr [+-=][ASacdistu]档案或目录名称 + :增加某一个特殊参数,其他原本存在参数则不动。 - :移除某一个特殊参数,其他原本存在参数则不动。 = :设定一定,且仅有后面接的参数 ``` |参数|说明| |---|---| |A|当设定了A 这个属性时,若你有存取此档案(或目录)时,他的存取时间atime 将不会被修改,可避免I/O 较慢的机器过度的存取磁碟。(目前建议使用档案系统挂载参数处理这个项目)| |S|一般档案是非同步写入磁碟的(原理请参考前一章sync的说明),如果加上S这个属性时, 当你进行任何档案的修改,该更动会『同步』写入磁碟中。| |a|当设定a 之后,这个档案将只能增加资料,而不能删除也不能修改资料,只有root 才能设定这属性| |c|这个属性设定之后,将会自动的将此档案『压缩』,在读取的时候将会自动解压缩, 但是在储存的时候,将会先进行压缩后再储存(看来对于大档案似乎蛮有用的!)| |d|当dump 程序被执行的时候,设定d 属性将可使该档案(或目录)不会被dump 备份| |i|这个i 可就很厉害了!他可以让一个档案『不能被删除、改名、设定连结也无法写入或新增资料!』 对于系统安全性有相当大的助益!只有root 能设定此属性| |s|当档案设定了s 属性时,如果这个档案被删除,他将会被完全的移除出这个硬碟空间,所以如果误删了,完全无法救回来了喔!| |u|与s 相反的,当使用u 来设定档案时,如果该档案被删除了,则资料内容其实还存在磁碟中,可以使用来救援该档案喔!| *注1:属性设定常见的是**a** 与 **i** 的设定值,而且很多设定值必须要身为root 才能设定* 例子: ``` [root@study tmp]# touch attrtest [root@study tmp]# chattr +i attrtest [root@study tmp] # rm attrtest rm: remove regular empty file `attrtest'? y rm: cannot remove `attrtest': Operation not permitted //即使root用户也无法删除 //取消i属性 [root@study tmp]# chattr -i attrtest ``` ### 显示隐藏属性 ``` lsattr [-adR]档案或目录 -a :将隐藏档的属性也秀出来; -d :如果接的是目录,仅列出目录本身的属性而非目录内的档名; -R :连同子目录的资料也一并列出来! ``` ``` [root@study tmp]# lsattr passwd ----ia---------- passwd ``` ## SUID/SGID/SBIT 权限设定 ``` 4 为SUID 2 为SGID 1 为SBIT [root@study tmp]# chmod 6755 test; //赋值 ``` ## file 观察档案类型 ``` file /usr/bin/passwd ``` ## 指令档名的搜寻 ### which ``` [vagrant@localhost ~]$ which ifconfig 搜索命令 /usr/sbin/ifconfig ``` ### whereis ``` root@study ~]# whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz ``` ### find #### 时间相关搜索 ``` find [PATH] [option] [action] -mtime n :n 为数字,意义为在n 天之前的『一天之内』被更动过内容的档案; -mtime +n :列出在n 天之前(不含n 天本身)被更动过内容的档案档名; -mtime -n :列出在n 天之内(含n 天本身)被更动过内容的档案档名。 -newer file :file 为一个存在的档案,列出比file 还要新的档案档名 例子 find / -mtime 0 将过去系统上面24小时内有更动过内容(mtime)的档案列出 find /etc -newer /etc/passwd 寻找/etc底下的档案,如果档案日期比/etc/passwd新就列出 find -name 搜索文件 ``` ![find 相关的时间参数意义](http://linux.vbird.org/linux_basic/0220filemanager/find_time.gif) #### 使用者或群组名称有关的参数 ``` -uid n :n为数字,这个数字是使用者的帐号ID,亦即UID ,这个UID 是记录在 -gid n :n 为数字,这个数字是群组名称的ID,亦即GID,这个GID 记录在 -user name :name 为使用者帐号名称喔!例如dmtsai -group name :name 为群组名称喔,例如users ; -nouser :寻找档案的拥有者不存在/etc/passwd 的人! -nogroup :寻找档案的拥有群组不存在于/etc/group 的档案! 当你自行安装软体时,很可能该软体的属性当中并没有档案拥有者, 这是可能的!在这个时候,就可以使用-nouser 与-nogroup 搜寻。 例子: [root@study ~]# find /home -user dmtsai 搜寻/home底下属于dmtsai的档案 ``` #### 与档案权限及名称有关的参数 ``` -name filename:搜寻档案名称为filename 的档案; -size [+-]SIZE:搜寻比SIZE 还要大(+)或小(-)的档案。这个SIZE 的规格有: c: 代表byte, k: 代表1024bytes。所以,要找比50KB 还要大的档案,就是『 -size +50k 』 -type TYPE :搜寻档案的类型为TYPE 的,类型主要有:一般正规档案(f), 装置档案(b, c), 目录(d), 连结档(l), socket (s), 及FIFO (p) 等属性。 例子: [root@study ~]# find /etc -name passwd 找出passwd文档 [root@study ~]# find / -name "*passwd*" 找出档名包含了passwd这个关键字的档案(记得加引号) [root@study ~]# find / -size +1M 找出大于1M的 ``` #### 額外可進行的動作 ``` -exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。 -print :将结果列印到萤幕上,这个动作是预设动作! 例子; [root@localhost home]# find / -name passwd -exec ls -l {} \; total 0 -r--r--r--. 1 root root 0 Aug 29 02:22 index dr-xr-xr-x. 2 root root 0 Aug 29 02:22 perms -rw-r--r--. 1 root root 1398 Aug 3 09:04 /etc/passwd -rw-r--r--. 1 root root 188 Jun 10 2014 /etc/pam.d/passwd 注释:{}代表的是由find找到的内容 -exec 一直到\; 中间就是需要插入的命令 `;` 在bash 环境下是有特殊意义的,因此利用反斜线来跳脱。 ``` ## 列出系统上的所有磁碟列表 ``` [root@study ~]# lsblk [-dfimpt] [device] 选项与参数: -d :仅列出磁碟本身,并不会列出该磁碟的分割资料 -f :同时列出该磁碟内的档案系统名称 -i :使用ASCII 的线段输出,不要使用复杂的编码(再某些环境下很有用) -m :同时输出该装置在/dev 底下的权限资料(rwx 的资料) -p :列出该装置的完整档名!而不是仅列出最后的名字而已。 -t :列出该磁碟装置的详细资料,包括磁碟伫列机制、预读写的资料量大小等 [root@localhost vagrant]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 40G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 1G 0 part /boot └─sda3 8:3 0 39G 0 part ├─VolGroup00-LogVol00 253:0 0 37.5G 0 lvm / └─VolGroup00-LogVol01 253:1 0 1.5G 0 lvm [SWAP] 注释: NAME:就是装置的档名啰!会省略/dev 等前导目录! MAJ:MIN:其实核心认识的装置都是透过这两个代码来熟悉的!分别是主要:次要装置代码! RM:是否为可卸载装置(removable device),如光碟、USB 磁碟等等 SIZE:当然就是容量啰! RO:是否为唯读装置的意思 TYPE:是磁碟(disk)、分割槽(partition) 还是唯读记忆体(rom) 等输出 MOUTPOINT:就是前一章谈到的挂载点! ``` ## 列出磁碟的分割表类型与分割资讯 ``` [root@study ~]# parted device_name print 例子: [root@localhost vagrant]# parted /dev/sda print Model: ATA VBOX HARDDISK (scsi) #磁碟的模组名称(厂商) Disk /dev/sda: 42.9GB #磁碟的总容量 Sector size (logical/physical): 512B/512B #磁碟的每个逻辑/物理磁区容量 Partition Table: msdos #分割表的格式(MSDOS(MBR)/GPT) Disk Flags: Number Start End Size Type File system Flags 1 1049kB 2097kB 1049kB primary 2 2097kB 1076MB 1074MB primary xfs boot 3 1076MB 42.9GB 41.9GB primary lvm ``` ## 磁碟分割 MBR分割表请使用fdisk分割, GPT分割表请使用gdisk分割! ## gdisk ``` [root@localhost dev]# fdisk /dev/sda Command (m for help): p Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000a5130 Device Boot Start End Blocks Id System /dev/sda1 2048 4095 1024 83 Linux /dev/sda2 * 4096 2101247 1048576 83 Linux /dev/sda3 2101248 83886079 40892416 8e Linux LVM Command (m for help): q #离开 不保存操作 ``` ## 用fdisk 新增分割槽 ``` [root@study ~]# gdisk /dev/vda Command (? for help): p Number Start (sector) End (sector) Size Code Name 1 2048 6143 2.0 MiB EF02 2 6144 2103295 1024.0 MiB 0700 3 2103296 65026047 30.0 GiB 8E00 #找出最后一个sector的号码是很重要的! Command (? for help): ? #查一下增加分割的指令为何 Command (? for help): n #就是这个!所以开始新增的行为! Partition number (4-128, default 4): 4 #预设就是4号,所以也能enter即可! First sector (34-83886046, default = 65026048 ) or {+-}size{KMGTP}: 65026048 #也能enter Last sector (65026048-83886046, default = 83886046 ) or {+-}size{KMGTP}: +1G #决不要enter #这个地方可有趣了!我们不需要自己去计算磁区号码,透过+容量的这个方式, # 就可以让gdisk 主动去帮你算出最接近你需要的容量的磁区号码喔! Current type is ' Linux filesystem ' Hex code or GUID (L to show codes, Enter = 8300 ): #使用预设值即可~直接enter下去! #这里在让你选择未来这个分割槽预计使用的档案系统!预设都是Linux档案系统的8300啰! Command (? for help): p Number Start (sector) End (sector) Size Code Name 1 2048 6143 2.0 MiB EF02 2 6144 2103295 1024.0 MiB 0700 3 2103296 65026047 30.0 GiB 8E00 4 65026048 67123199 1024.0 MiB 8300 Linux filesystem ``` ## 压缩 ``` *.Z compress 程式壓縮的檔案; *.zip zip 程式壓縮的檔案; *.gz gzip 程式壓縮的檔案; *.bz2 bzip2 程式壓縮的檔案; *.xz xz 程式壓縮的檔案; *.tar tar 程式打包的資料,並沒有壓縮過; *.tar.gz tar 程式打包的檔案,其中並且經過 gzip 的壓縮 解压 tar -zxvf *.tar.bz2 tar 程式打包的檔案,其中並且經過 bzip2 的壓縮 *.tar.xz tar 程式打包的檔案,其中並且經過 xz 的壓縮 ``` ### 针对单一档案 #### gzip ``` #压缩 gzip test2.txt.gz #加压缩 gzip -d test2.txt.gz ``` #### bash,xz ```bash bzip2 ,xz 等命令 压缩参数相同 #压缩效率比 xz>bzip2>gzip #压缩时间比 xz<bzip2<gzip ``` ### 打包指令: tar ```shell -c :建立打包档案,可搭配-v 来察看过程中被打包的档名(filename) -t :察看打包档案的内容含有哪些档名,重点在察看『档名』就是了; -x :解打包或解压缩的功能,可以搭配-C (大写) 在特定目录解开 特别留意的是, -c, -t, -x 不可同时出现在一串指令列中。 -z :透过gzip 的支援进行压缩/解压缩:此时档名最好为*.tar.gz -j :透过bzip2 的支援进行压缩/解压缩:此时档名最好为*.tar.bz2 -J :透过xz 的支援进行压缩/解压缩:此时档名最好为*.tar.xz 特别留意, -z, -j, -J 不可以同时出现在一串指令列中 -v :在压缩/解压缩的过程中,将正在处理的档名显示出来! -f filename:-f 后面要立刻接要被处理的档名!建议-f 单独写一个选项啰!(比较不会忘记) -C 目录:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。 其他后续练习会使用到的选项介绍: -p(小写) :保留备份资料的原本权限与属性,常用于备份(-c)重要的设定档 -P(大写) :保留绝对路径,亦即允许备份资料中含有根目录存在之意; --exclude=FILE:在压缩的过程中,不要将FILE 打包! 压缩:tar -jcv -f filename.tar.bz2 要被压缩的档案或目录名称 查询:tar -jtv -f filename.tar.bz2 解压缩:tar -jxv -f filename.tar.bz2 -C欲解压缩的目录 #如果使用 -z tar -zcv -f filename.tar.bz2 #demo 压缩etc目录,加time 可以显示压缩时间 time tar -zpcv -f /root/etc.tar.gz /etc 查看压缩的文件 tar -ztv -f /root/etc.tar.gz 压缩到指定目录 tar -jxv -f /root/etc.tar.bz2 -C /tmp ``` >注意:文件名得自己取,压缩查看都得配合 > `-z`对应 ` tar.gz`后缀 > `-j` 对应 `bz2`后缀 > `-J` 对应 `.tar.xz`后缀