其他命令
其他命令
apt-get Ubuntu 系统软件包管理器
apt-get
命令是 Debian Linux
发行版中的 APT
软件包管理工具。所有基于 Debian
的发行都使用这个包管理系统。
apt-get install xxx #安装软件
apt-get remove xxx ##删除软件
apt-get purge xxx #删除软件并删除配置文件
apt-get autoremove xxx #自动删除未使用的软件
apt-get update #检查软件并升级
apt-get upgrade #升级软件
apt-get clean #清理所有软件缓存
apt-get autoclean #清理旧版本的软件缓存
apt-cahe search xxx #搜索可安装的软件
apt-config dump #打印 apt-get 配置
apt 命令
Ubuntu 16.04 新添加的命令,将 apt-get
apt-cache
apt-config
命令常用的选项合并到一起,以下的新增的命令
apt list #查看已安装的软件
apt edit-sources #快速编辑 apt 源
补充:部分系统需要具有 root
权限的普通用户才能执行,在命令前加 sudo
即可。
yum CentOS 系统软件包管理器
yum
命令是在 Fedora
和 Red Hat
以及 SUSE
中基于 rpm
的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载 RPM
包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
yum install xxx #安装软件
yum erase xxx #删除软件
yum info xxx #查看软件信息
yum list #列出软件列表
yum reinstall xxx #重新安装软件
yum search xxx #搜索软件
yum update #升级所有软件
补充:部分系统需要具有 root
权限的普通用户才能执行,在命令前加 sudo
即可。
cat 显示文件内容
cat demo.php #在屏幕上显示 demo.php 文件的内容
cat git.md composer.md #查看多个文件的内容
cat -n demo.php #查看文件内容并从 1 开始添加序号
less 分屏显示文件内容
less demo.php #显示 demo.php 文件,退出按 q 键
补充:Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)
more 和 less 命令类似,也是分屏显示文件内容
more -10 demo.php #指定没屏显示 10 行内容
morw +50 demo.php #指定从第 50 行开始显示
补充:Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)
tail 显示文件尾部的内容
tail demo.php #默认显示文件尾部 10 行
tail -2 demo.php #显示文件尾部 2 行
head 显示文件头部内容
head demo.php #显示文件内容,默认显示 10 行
head -5 demo.php #显示文件头部 5 行内容
nl 命令
nl demo.php #查看文件内容并加行号显示
cd 命令 change dirname 的缩写形式,进入指定目录
cd /usr/local #进入 /usr/local 目录
cd / #进入 / 目录
cd ~ #进入当前用户家目录
cd - #进入执行上一条命令所在目录
cd ../ #进入当前目录的上一级目录
补充:.
代表当前目录,..
代表上一级目录,~
代表当前用户的家目录,/
代表根目录,根目录的上一级目录指向的还是根目录。
ls 命令 以列表的形式显示文件
ls 显示当前目录的文件和目录,不包含隐藏文件
ls -a 显示所有文件和目录,包含隐藏文件
ls -l #显示文件和文件夹的详细信息
ll #ls -l 命令的简写
ls -A #只显示隐藏的文件和目录,不显示 . 和 ..
ls -R dirname #递归显示目录的所有内容
ls -t #按修改时间排序显示
ls -lS #按文件从大到小排序
ls -lh #将文件大小转成 b kb mb g 的形式
ls -al #以长格式显示目录和文件的内容列表,包含隐藏文件。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等
crontab 命令
Linux下的任务调度分为两类:系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在 /etc
目录下有一个 crontab
文件,这个就是系统任务调度的配置文件。
系统任务调度存放的目录
- /etc/cron.hourly 小时
- /etc/cron.daily 每天
- /etc/cron.weekly 每周
- /etc/cron.monthly 每月
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。
/etc/cron.deny
该文件中配置用户不允许使用 crontab
命令,亲测 Ubuntu16.04
默认不存在,CentOS7.2
存在,如果要禁止某个用户不能使用 crontab
,在此文件写入用户名即可,仅对普通用户生效,root
用户无效。
/etc/cron.allow
该文件中配置用户允许使用 crontab
命令,亲测 Ubuntu16.04
、CentOS7.2
默认不存在。
系统读取顺序为先读取 /etc/cron.deny 文件,再读取 /etc/cron.allow 文件,建议保留任意一个文件即可,内容为一个用户名称一行。
/var/spool/cron/
所有用户 crontab
文件存放的目录,以用户名命名,CentOS
系统。
crontab -l #显示定时任务列表
crontab -e #编辑定时任务
crontab -r #删除定时任务
sudo crontab -u root -e #指定 root 用户编辑,每个用户对应有一个 crontab 文件
crontab 文件内容说明
Minute Hour Day Month Week command
| | | | | |
| | | | | |
分 时 天 月 周 命令或文件或url
取值范围
分(0-59)
时(0-23)
天(1-31)
月(1-12)
周(0-7)0 和 7 都代表星期天
* 代表所有可能的值,
/ 代表每,
- 代表从某个数字到某个数字,
, 分开几个指定的数字
第一次执行 crontab -e 会出现一些内容,选择编辑器,建议选 3,vim 编辑器
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
例子
*/1 * * * * ~/http.sh #每1分钟执行一次 ~/http.sh shell 文件
01 * 2 * * ~/http.sh #每月2号第一分钟执行一次 ~/http.sh shell 文件
* 2,3 * * * ~/http.sh #每天凌晨2点,3点 执行一次 ~/http.sh shell 文件
10 * * * 1-5 root /usr/local/bin/php /home/ubuntu/demo.php #周一到周五第10分钟以 root 用户 php 命令去执行一次 demo.php 文件
*/1 * * * * run-parts /home/nick/sh/ #每分钟执行 /home/nick/sh/ 目录内的脚本,CentOS 系统生效,Ubuntu 系统不生效,原因暂时未知,请教了运维,不建议这样操作。
crontab
文件里面指定的命令建议写绝对路径,文件相对路径和绝对路径都可以。run-parts
可以指定任意目录执行,路径可以为相对路径也可以为绝对路径, CentOS
系统该命令位置 /usr/bin/run-parts
,Ubuntu
系统该命令位置 /bin/run-parts
。
crontab 日志
CentOS7.2 crontab 日志路径为 /var/log/cron
CentOS 系统 crontab 执行成功日志会出现以下内容
May 5 11:48:01 10-13-41-254 CROND[10770]: (nick) CMD (run-parts /home/nick/sh)
May 5 11:48:01 10-13-41-254 run-parts(/home/nick/sh)[10770]: starting 1.sh
May 5 11:48:01 10-13-41-254 run-parts(/home/nick/sh)[10777]: finished 1.sh
May 5 11:48:01 10-13-41-254 run-parts(/home/nick/sh)[10770]: starting 2.sh
May 5 11:48:01 10-13-41-254 run-parts(/home/nick/sh)[10783]: finished 2.sh
Ubuntu16.04 crontab 日志路径为 /var/log/cron.log
Ubuntu16.04 默认不生成 crontab 日志,需要更改配置,方法如下
sudo vim /etc/rsyslog.d/50-default.conf
cron.* /var/log/cron.log #将cron前面的 # 注释符去掉
sudo service rsyslog restart
Ubuntu 系统 crontab 执行成功日志会出现以下内容
May 5 11:37:01 localhost CRON[26565]: (root) CMD (/root/sh/1.sh)
May 5 11:38:01 localhost CRON[26677]: (root) CMD (/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &)
检测 Web 服务器
新建文件 vim ~/http.sh
写入以下内容
#!/bin/bash
ip=xxxxxx #自定义
port=$(nmap -sT $ip | grep tcp | grep http | grep 80 | awk '{print $2}')
if [ "$port" == "" ]; then
systemctl restart nginx
echo "http error $(date +%Y-%m-%d' '%H:%M:%S)" >> ~/http_logs_error.log
fi
设置定时任务
*/10 * * * * ~/http.sh #10分钟执行一次
检测指定服务是否正常运行
新建文件写入以下内容
#!/usr/bin/env bash
read name
pgrep $name > /dev/null
if [ $? -gt 0 ];then
echo "`date` $name is stop" >> ~/mysql_listen.log
systemctl $name mysql
else
echo "`date` $name running" >> ~/mysql_listen.log
fi
给脚本添加执行权限后运行,输入服务名称即可
备份数据库
新建文件 vim ~/mysqldump.sh
写入以下内容
#!/bin/bash
dir=~/data_bak #自定义
filename=demo #自定义
username=nick #自定义
password=xxx #自定义
database=demo #自定义
if [ -d $dir ]; then
mysqldump -u$username -p$password $database | gzip > $dir/$filename\_$(date +%Y%m%d).sql.gz
else
mkdir $dir
mysqldump -u$username -p$password $database | gzip > $dir/$filename\_$(date +%Y%m%d).sql.gz
fi
设置定时任务
1 3 * * 0 ~/mysqldump.sh # 每周日凌晨3点1分执行
补充:新建的 shell
脚本默认没有执行权限,需要自己添加
获取文件名
#!/bin/bash
file_jpg="sample.jpg"
name=${file_jpg%.*}
echo File name is: $name
获取文件扩展名
#!/bin/bash
file="sample.png.text"
echo ${file##*.} #贪婪模式,匹配到最后一个 .
重命名文件
#!/bin/bash
count=1;
for file in $(find . -maxdepth 1 -type f -iname '*.html')
do
new_file=filename-$count.${file##*.}
echo "Renaming $file to $new_file"
mv "$file" "$new_file"
let count++
done
rsync 命令
rsync -avz /etc/ ~/etc.bak #将目录同步到另一个目录,目录后有 / 代表只同步目录内的数据,没有 / 代表包括目录本身
rsync -avz source_dir username@host:PATH #同步数据到其他服务器
rsync -av username@host:PATH destination #将远程主机的数据同步到本地
dump 命令
dump -0uj -f /home/vda1.bak.bz2 /dev/vda1/ #增量备份分区,将 /dev/vda1/ 备份到 /home 目录下,使用 gzip2 压缩,备份层级为 0 并在 /etc/dumpdates 中记录相关信息
cat /etc/dumpdates #查看备份信息
dump -1uj -f /home/vda1.bak.bz2 /dev/vda1/ #增量备份分区,仅备份新添加的数据
dump -W #查看备份级别
dump -0j -f /home/etc.bak.bz2 /etc #备份目录,备份目录级别只能为 0 不能增量备份
补充:备份的级别有 0-9
,-u
代表添加备份记录,-j
代表使用 gzip2
压缩, -f
代表备份后的文件名,-W
代表查看需要备份的文件及其最后一次备份的层级、时间与日期
restore 命令
restore -tf /home/etc.bak.bz2 #查看备份数据内容
restore -C -f /home/etc.bak.bz2 #对比备份的数据和原有数据的变化
restore -rf /home/etc.bak.bz2 #恢复数据,增量备份需要把所有增量数据恢复,建议新建空目录,把恢复的数据保存在空目录中,在复制到指定目录
补充:-C
对比备份数据和原有数据的变化,-f
指定备份的文件名,-r
还原数据,-t
查看备份数据的内容
touch 命令
touch index.html #新建空文件
mkdir 命令
mkdir demo #创建目录
mkdir -p ~/php/laravel #递归创建目录
mkdir -m 755 www #创建目录并指定权限
rmdir 命令
rmdir demo #删除空目录,如果目录有文件无法删除
cp 命令
cp index.php php #复制 index.php 文件到当前 php 目录下
cp -a index.php php #复制 index.php 文件到当前 php 目录下,保留文件的属性、权限、软连接自动指向目标文件
cp index.php ~/app.php #复制文件到指定目录下并修改文件名
cp -R php app #递归复制 php 目录下所有文件到 app 目录
mv 命令
mv index.php app.php #将 index.php 名称更改为 app.php
mv ~/php /home #将家目录下 php 目录移动到根目录 home 目录下
rm 命令
rm index.php #删除文件
rm -i index.php #执行删除询问 y 代表删除 n 代表取消
rm -r test #递归删除目录
rm -f test #强制删除目录
rm -rf php #强制递归删除目录
unlink
unlink demo.php #删除文件,与 rm 类似,但只能删除文件
tree 命令
tree ~ #以树状图列出指定目录的内容
tree -d laravel #以树状图列出指定目录的内容,不包括文件
tree ~/test -H '目录结构' -o out.html --nolinks #将内容以树状形式写入到 HTML 文件中,不包含链接
file 命令
file demo.php #查看文件格式类型
Linux 的文件类型
普通文件,符号为
-
目录,符号为
d
字符设备,符号为
c
块设备,符号为
b
套接字文件,符号为
s
软链接文件,类似
Windows
系统的快捷方式,删除了并不会影响源文件,符号为l
管道文件,符号为
p
补充:常见的文件类型为 -
d
l
Linux 的 3 种权限
r
代表read
读权限,数字代表为4
w
代表wirte
写权限,数字代表为2
x
代表execute
执行权限,数字代表为1
Linux 的 3 种用户
拥有者(owner)
用户组(group)
其它人(others)
解读
-rw-rw-r-- 1 nick nick 0 May 12 16:05 demo.php
- 第 1 列代表文件类型
rw- 第 2-4 列代表所属用户的权限
rw- 第 5-7 列代表所属用户组的权限
r-- 第 8-11 其他用户所属权限
1 第 11 列代表文件被引用的次数
nick 第 12 列代表文件所属用户名称
nick 第 13 列代表文件所属用户组名称
0 第 14 列代表文件大小
May 12 16:05 第 15-17 列代表文件最后的修改时间
demo.php 第 18 列代表文件名称
stat 命令
stat filename #查看文件的详细信息,文件的访问时间、修改时间、改变时间,linux 文件没有创建时间
chmod 命令
chmod 755 filename #将文件权限修改为 755 ,即拥有者有读写执行权限,用户组有读执行权限,其他人有读执行权限
chmod -R 755 dirname #递归修改目录的权限
chown 命令
chown nick index.php #将文件拥有者改为 nick
chown :nick index.php #将文件用户组修改为 nick
chown nick:nick index.php #将文件拥有者和用户组修改为 nick
chown nick php #将目录拥有者修改为 nick
chown :nick php #将目录用户组修改为 nick
chown nick:nick php #将目录拥有者和用户组修改为 nick
chown -R nick:nick php #递归将目录拥有者和用户组修改为 nick
chgrp 命令
chgrp nick demo #改变目录的所属用户组
chgrp nick test.php #改变文件的所属用户组
chgrp -R nick demo #递归改变目录的所属用户组
umask 命令
默认的补码为 022 ,补码越小权限越大,补码的计算规则为 rwx 读写执行即 777 减补码是权限数字
root 的 umask 为 022 ,创建的目录或文件为 755 rwxr-xr-x 权限
普通用户的 umask 为 002 ,创建的目录或文件为 775 rwxrwxr-x 权限
最大权限减 umask 等于默认权限,结果为奇数,则奇数位 +1
umask #查看权限补码
umask -S #查看当前用户权限补码
chattr 命令
chattr +i index.php #设置文件不允许修改、删除、移动、复制,root 用户也生效
chattr -i index.php #取消文件属性设置
chattr +i demo #设置目录属性,目录内的文件目录只能修改,不能新建与修改,子目录的文件目录不生效,目录层级只有一层
lsattr 命令
lsattr filename #查看文件属性
lsattr -d demo #查看目录属性
lsattr -R demo #递归查看目录属性
lsattr -a demo #查看所有目录文件隐藏文件
find 命令
sudo find /usr/local/nginx -name nginx.conf #在 /usr/local/nginx 下查找 nginx.conf 文件
sudo find /usr/local/nginx -iname nginx.conf #在 /usr/local/nginx 下查找 nginx.conf 文件,忽略文件名称大小写
sudo find /home/ ! -name "*.gz" #查找不是 .gz 后缀的文件
sudo find /home/ -iname "demo.*" #查找名称为 demo 开头的文件,不区分文件名称大小写
sudo find . -type f #查找文件类型为文件
sudo find . -maxdepth 1 -type f #查找文件类型为文件,向下最大深度限制为1
sudo find . -type d #查找文件类型为目录
sudo find . -type f -atime -7 #查找7天之内访问过的文件
sudo find . -type f -atime +7 #查找超过7天的访问文件
sudo find . -type f -atime 7 #查找7天前的访问文件
sudo find . -type f -amin -10 #查找10分钟之内的访问文件
sudo find . -type f -amin 10 #查找超过10分钟的访问文件
sudo find . -type f -amin +10 #查找超过10分钟的访问文件
补充:+
意思为大于,-
意思为小于,没有符合是等于。
- 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
- 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
- 变化时间(-ctime/天,-cmin/分钟):文件数据(包括权限等)最后一次修改时间。
which 命令
which php #查找 php 命令的绝对路径,可用于判断某个系统命令是否存在
whereis 命令
whereis php #查找 php 命令的位置
locate 命令
locate /etc/*.conf #查找 /etc 命令下所有 .conf 后缀的文件,此命令比 find 快
grep 命令
sudo grep -c '500' fielename.log #查找文件包含500的行数
sudo cat index.html | grep -o 'js' #只输出文件中匹配到的部分
ps -aux | grep sshd #查找指定访问
ps -aux | grep 80 #查找指定端口
echo hello world | grep -i "HELLO" #查找指定内容忽略大小写
grep "sudo git pull" ~/test -R -n #递归查找指定目录下文件内容,如果找到返回文件名称,行号,查找到的内容
grep "sudo git pull" . -r --exclude "gitbook.sh" #递归查找指定目录下文件内容,并忽略指定文件
grep "sudo git pull" . -r --exclude-dir "test" #递归查找指定目录下文件内容,并忽略指定目录
sed 命令
sed -i '$d' root.sh #删除文件最后一行
sed '/^$/d' root.sh #打印文件内容删除掉空行
sed -n '-p' demo.php #查看文件第 2 行
sed '2d' demo.php #打印文件内容不显示第 2 行
sed '2,5d' demo.php #打印文件内容不显示第 2 行到第 5 行内容
sed '2,$d' demo.php #打印文件内容不显示 2 行到最后一行
sed '2a hello' demo.php #打印文件内容并在第 2 行后面追加内容
sed '2i hello' demo.php #打印文件内容并在第 2 行前面插入内容
sed 's/text/html/g' demo.php #打印并将文件内容 text 替换成 html
sed -e 's/text//g' demo.php #打印并将文件内容 text 替换为空
补充:sed
命令不会修改原文件内容,除非使用 -i
选项
awk 命令
awk '{print $9}' filename.log | grep 500 | wc -l #统计日志 500 状态码的数量
awk '{print $1}' filename.log | grep 'ip' | wc -l #统计指定 IP 的访问次数
awk '{a[b[$1]++]}END{for(i=length(a);i>0;i--)for(j in b)if(b[j]==i){c++;if(c<=10)print j,i}}' filename.log #统计访问前 10 的 IP 并输出访问数量
awk '{print $7}' filename.log | grep 'url' | wc -l #统计指定 url 的访问次数
sed "/Baiduspider/d;/Googlebot/d;/Sogou web spider/d;" filename.log | awk -F' ' '{print $7}' | sort | uniq -c | sort -k1,2 -nr #统计所有 url 访问次数,过滤搜索引擎的信息
补充:$1 代表第一列,默认从 1 开始
Linux 是什么
Linux
是一个开源系统内核,1991年由托瓦兹 (Linus Torvalds) 开发出来的,我们平时讲的 Liunx
系统其实并不是很准确,Ubuntu
CentOS
这些才是系统,Linux
是参考 Unix
系统开发出来的。
现实生活中有哪些软件或系统是基于 Linux
开发出来的呢? 嵌入式
程序开发 Android
手机系统,我们经常浏览的网站服务器,基本都是运行 Linux
系统之上。
Linux
是一个支持多用户、多任务的系统。
Linux
系统上一切都是以文件的形式存在,文件和目录名称都区分大小写的。所有文件命名要体现文件的格式或内容,demo.php
代表这是一个 php
文件,demo.txt
代表 txt
文件,demo.tar.gz
代表以 gzip
压缩的打包文件。还有一种特殊文件,有文件也有目录,文件名称以 .
开头的隐藏文件,例如: .vim
默认是不显示的,一般都是软件的配置文件。
无论是源码编译安装还是通过包管理器 yum
或 apt-get
安装的软件,默认都是需要设置开机自启动,单纯的启动服务,如果服务器有重启的话,程序无法运行,还要登录服务器排查原因,费事费力。
Linux
与 Windows
最大的区别
- 名称区分大小写
- 系统路径
- 文件权限
- 一切皆文件
关于 Linux 命令的几个分类
内置命令
- 例如
cd
ls
这些命令,默认系统内置无需安装
- 例如
外置命令
- 例如
ccat
wget
,如果执行命令提示 command not found ,通常都是需要用户自己使用apt-get
或yum
软件包管理器安装
- 例如
程序或软件命令
- 例如
nginx
php
或者自己写的程序编译出来的命令,这种命令与外置命令类似,但是会有配置等其他文件,外置命令一般安装之后只有一个二进制可执行文件
- 例如
Linux 的优势
- 跨平台
- 安全
- 多用户多任务
- 占用系统资源少
- 网络功能强大
- 稳定
Linux 的运行级别
- 0 停机,关机
- 1 单用户,无网络连接,不运行守护进程,仅 root 用户可以登录
- 2 多用户,无网络连接,不运行守护进程
- 3 多用户,正常启动系统
- 4 用户自定义
- 5 多用户,带图形界面
- 6 重启
Linux 的启动流程
- 加载内核
- 启动初始化进程
- 确定运行级别
- 加载开机启动程序
- 用户登录
- 进入 login shell
- 打开 non-login shell
Linux 的目录结构
Ubuntu 16.04
/bin #用户二进制文件
/boot #启动核心文件
/dev #设备文件
/etc #配置文件
/home #用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的
/lib #系统库
/lib64 #系统库
/lost+found #这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件
/media #可移动媒体设备
/mnt #挂载目录
/opt #用户安装的软件目录
/proc #进程信息
/root #该目录为系统管理员,也称作超级权限者的用户主目录
/run #存放进程的I
/sbin #s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序
/tmp #系统临时文件
/srv #srv是service的缩写,该目录存放一些服务启动之后需要提取的数据
/sys #这个目录跟/proc 非常类似,也是一个虚拟的文件系统,主要也是记录与内核相关的信息。
/usr #注意 usr 并不是 user 的缩写,而是Unix Software Resource的缩写,即 Unix 操作系统软件资源放在该目录,而不是用户的数据。
/var #软件运行所产生的文件
补充:其他 Linux
系统的发行版目录大致也是一样的。
iptables 命令
防火墙分为__硬件防火墙__和__软件防火墙__
防火墙策略一般分为两种:开放__和__屏蔽
iptables 是
Linux
上常用的__防火墙软件__iptables 一共有__四张表__和__五条链__
iptables (选项)[表名] (选项)[链名规则] (选项)[动作]
表:
- Raw 负责连接跟踪
- Mangle 负责包处理
- Nat 负责地址转换
- Filter 负责包过滤
链名规则:
- PREROUTING 数据包作路由选择之前
- INPUT 接收数据包
- FORWARD 在内核空间中,从一个网络接口进入,到另一个网络接口去。转发过滤
- OUTPUT 输出数据包
- POSTROUTING 数据包作路由选择之后
动作:
- accept:接收数据包。
- DROP:丢弃数据包。
- REDIRECT:重定向、映射、透明代理。
- SNAT:源地址转换。
- DNAT:目标地址转换。
- MASQUERADE:IP伪装(NAT),用于ADSL。
- LOG:日志记录。
例子
iptables -I INPUT -s ip -j DROP #屏蔽指定 ip 访问
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT #允许 2222 端口访问
iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP #屏蔽 icmp 协议,即关闭 ping 服务
iptables -L -n --line-numbers #查看已添加的规则并以序号显示
iptables -D INPUT 8 #删除序号为 8 的规则
补充:-A
代表追加,-I
代表插入,-D
代表删掉,-R
代表替换,-L
代表列表,-p
代表协议, -s
代表源地址,必须是 IP ,-j
代表动作,-d
代表目标地址,-i
网卡进入是数据,-o
代表网卡输出的数据。
uptime 命令
uptime #显示信息依次为:当前时间、系统运行时间、目前登录用户、系统在 1 分钟、5 分钟和 15 分钟内的负载。
free 命令
free -m #以 mb 统计系统内存
free -k #以 kb 统计系统内存
补充:total
总内存,used
已使用内存,free
空闲的内存,shared
当前已经废弃不用,buff/cache
缓存内存,available
可用内存
du 命令
du /usr #统计指定目录或文件的大小
du -h /usr #统计指定目录或分区大小并以K,M,G 为单位,提高信息的可读性
du -s /usr #统计目录的总大小
du -sh /usr #统计并 K,M,G 为单位显示
df 命令
df / #统计指定分区的大小,默认以千字节显示
df -h /usr #统计指定文件大小并以 K,M,G 为单位,提高信息的可读性
补充:df
和 du
的区别,df
是统计文件系统,包括文件、目录、程序、命令占用的空间;du
是统计文件和目录的占用空间。统计系统占用硬盘占用大小以 df
为准,一般建议一段时间重启服务器释放被进程和已经删除文件目录占用的空间。
lsb_release 命令
lsb_release -a #查看系统版本信息
top 命令
top #查看资源占用比
第一行:系统当前时间 系统持续时间 登录用户1,5,15分钟之前的平均负载
第二行:进程总数
第三行:CPU占用率 %id 空闲百分比
第四行:内存使用: 总共 使用 空闲 缓存
第五行:swap使用
top -p 6297 #查看指定 pid 信息
top -u root #查看指定用户的进程
netstat 命令
netstat -tuln #查看本机所有监听端口
netstat -an #查看所有网络连接
补充:t
代表 tcp
, u
代表 udp
,l
代表监听,n
代表以 IP 和端口号显示。
ps 命令
ps -aux #查看系统所有进程,以 BSD 系统格式显示
补充:a
代表显示前台所有进程,u
显示用户名,x
显示后台进程。
pstree 命令
pstree #查看系统进程以树状显示
pstree -p #显示 PID 的进程树
lsof 命令
lsof -i:22 #查看 22 端口打开的进程文件
kill 命令
kill -9 2845 #强制杀死 pid 为 2845 的进程
killall 命令
killall -9 nginx #强制杀死 nginx 进程
pkill 命令
pkill -9 5679 #强制杀死 pid 为 5679 的进程
pkill -9 -t pts/1 #强制踢远程终端用户下线
补充:超级管理员可以踢任何人,普通用户只能踢自己。
ip 命令
以后补充
ifconfig 命令
ifconfig #查看网卡信息
route 命令
route #查看路由
route -n #查看网关
env 命令
env #查看当前用户的系统环境变量信息
systemctl 命令
systemctl start nginx #开启 nginx 服务
systemctl stop nginx #关闭 nginx 服务
systemctl restart nginx #重启 nginx 服务
systemctl reload nginx #重新加载 nginx 服务
systemctl status nginx #查看 nginx 服务
systemctl enable nginx #设置开启自启动
systemctl disable nginx #关闭开机自启动
systemctl list-units --type=service #查看已启动的服务
service 命令
service mysqld start #开启 mysql 服务
service mysqld stop #关闭 mysql 服务
service mysqld restart #重启 mysql 服务
service mysqld reload #重新加载 mysql 服务
service mysqld force-reload #强制加载 mysql 服务
service mysqld status #查看 mysql 服务
chkconfig 命令
chkconfig --list #查看所有的系统服务
chkconfig --list xxx #查看某个服务的设置信息
chkconfig --add xxx #添加系统服务
chkconfig --del xxx #删除系统服务
chkconfig xxx on #设置开机自启动
uname 命令
uname #打印内核名称
uname -n #打印主机名称
uname -r #打印系统版本号
uname -m #查看系统位数
unmae -a #打印全部内核信息
reboot 命令
reboot #重启系统
halt 命令
halt #关机
shutdown 命令
shutdown -h now #立刻关机
shutdown -r now #立刻重启
shutdown -r 11:26 #指定时间重启,时间按 24 小时制
shutdown -r 20180517 11:30 #指定日期时间重启
shutdown -c #取消指定时间的关机或重启
dd 命令
以后补充
ssh 命令
ssh username@ip #远程登录服务器
ssh username@ip 'pwd' #连接服务器并执行命令将结果返回给本地
ssh -p 2222 username@ip #指定端口登录远程服务器
ping 命令
ping ip or domain name #使用 ICMP 协议测试服务器是否正常运行
ping -c 2 ip #测试并设置返回的数据次数
dig 命令
dig baidu.com #查看域名 dns 信息
host 命令
host baidu.com #查看域名的ip
whois 命令
whois baidu.com #查看域名信息
hostname 命令
hostname #查看主机名称
hostname -i #查看主机 IP
hostname –d #查看主机域名
runlevel 命令
runlevel #查看系统运行级别
telnet 命令
telnet ip 端口 #测试指定 ip 的端口是否开放
jobs 命令
jobs -l #查看任务列表
jobs -r #查看正在运行的任务列表
jobs -s #查看停止运行的任务列表
jobs -p #查看任务的进程号
补充:输出信息的第一列为任务编号,第二列为任务的进程号,第三列任务的运行状态,第四列为启动任务的命令
bg 命令
bg 1 #将任务编号为 1 调到后台运行
fg 命令
fg 1 #将任务编号为 1 调到前台运行
pgrep 命令
pgrep nginx #查看 nginx 进程
pgrep -l nginx #查看 nginx 进程名称
wc 命令,用于统计
wc index.php #依次输出 行数 字数 字节数 文件名
wc -l index.php #统计文件行数
wc -w index.php #统计文件字数
wc -c index.php #统计字节数
last 命令
last #显示最近登录的用户列表
last -6 #显示最近登录的 6 条登录信息
last -u nick #显示指定用户 nick 的登录信息
lastlog 命令
lastlog #显示最后登录的用户信息,内容为 用户名 终端 ip地址 登录时间,如果没有登录信息登录时间为 **Never logged in**
内容如下
tss **Never logged in**
postfix **Never logged in**
sshd **Never logged in**
ntp **Never logged in**
tcpdump **Never logged in**
nscd **Never logged in**
nick pts/0 x.x.x.x Sun May 6 16:06:39 +0800 2018
lastlog -t 2 #指定 2 天内的登录信息
lastlog -u nick #指定 nick 用户的登录信息
lastb 命令
sudo lastb #显示最近登录失败的用户,需要 root 权限
lastb -2 #显示 2 天内登录失败的用户
date 命令
date #输出系统时间与日期,世界标准时间(UTC)格式 Sun May 6 16:19:05 CST 2018
date +"%Y-%m-%d" #输出年月日
date +"%Y-%m-%d %H:%M.%S" #输出年月日时分秒
history 命令
history #显示执行过的命令,以列表显示
history 5 #只显示最近执行过的 5 条命令
history -c #清除执行过的命令
fc 命令
fc -l #显示执行过的命令
fc -l 2 #显示最近执行的 2 条命令
fc -ln #显示执行过的命令,不显示编号
fc 588 #默认使用 vim 打开,编辑编号为 588 的命令,如果有修改,保存退出之后自动执行
echo 命令
echo hello linux #输出字符串
echo $my_name #输出变量值
time 命令
time ls #统计执行命令的时间
real 0m0.002s #命令执行开始到结束的时间
user 0m0.002s #进程花费在用户模式中的时间
sys 0m0.000s #在内核模式中的时间
/usr/bin/time -o output.log ls #将执行时间写入文件日志
/usr/bin/time -ao outfile.txt ls #以追加的形式将执行时间写入日志文件
补充:-a
选项必须在 -o
前面,否则执行不成功
login 命令
login nick #当前用户切换到 nick 登录
logout 命令
logout #以当前用户退出登录
exit 命令
exit #退出登录或登录当前 shell 脚本
clear 命令
clear #清除屏幕内容
alias 命令
alias gs="git status" #给 git status 起别名为 gs,仅在当前环境生效,关闭终端或退出登录以后无效,一般配置在当前 shell 的配置文件中
unalias 命令
unadlias gs #取消命令别名
type 命令
type pwd #查看命令的类型
w 命令
w #查看当前登录系统的用户
mesg 命令
mesg y #允许终端接收信息
mesg n #禁止终端接收信息
write 命令
write root #向 root 用户发送消息,实时的。输入信息之后需要回车换行按 control + d 进行发送
wall 命令
wall #向所有在线的用户发送消息,输入信息之后需要回车换行按 control + d 发送
补充:write
wall
命令发送消息,用户收到消息需要符合两个条件:1、用户必须登录服务器状态,2、 mesg
设置为 y
sort 命令
ls /usr | sort #排序
nohup 命令
nohup node app.js & #将执行的结果不显示并在后台运行,默认会在执行命令当前目录创建 nohup.out ,如果 nohup.out 文件没有写入权限,会在 ~ 目录下新建
nohup node app.js > demo.txt 2>&1 & #同上,指定写入文件名
tree 命令
tree /usr/local #以树状形式显示指定路径的目录和文件内容
tree -d /usr/local #以树状形式显示指定路径目录内容
ln 命令
ln -s 目标文件 软连接
ln -s /usr/local/php/bin/php /usr/local/bin/php #创建软连接,软连接被删除并不会影响源文件,源文件被删除软连接失效,只有文件才可以设置软连接,类似 Windows 系统的快捷方式
scp 命令
scp demo.php username@ip:path #将本地文件复制在远程服务器
scp -r dirname username@ip:path #将本地命令复制到远程服务器
scp [-P 端口号] xxx username@ip:path #指定端口号
scp username@ip:path/filename ./ #将远程服务器上的文件复制到本地
scp -r username@ip:path/dirname ./ #将远程服务器上的目录复制到本地
scp [-P 端口号] [-r] username@ip:path/ ./
示例:
scp -P 2222 /www/wwwroot.zip root@xxx.xx.xx.x:/www/flie
补充:-P
指定端口,-r
递归
source 命令
source .zshrc #加载配置
source demo.sh #运行 shell 脚本,在 shell 脚本中代表引入文件
ab 命令
ab -c 100 -n 200 'url' #压力测试
补充:c
代表并发数量 n
代表请求数量
yes 命令
yes #不指定输出内容默认输出 y
yes xxx #不断输出指定内容
chsh 命令
chsh -l #查看系统 shell ,相当于 cat /etc/shells
chsh -s /bin/zsh #更改当前用户的 shell ,更改完之后要重新登录才生效
补充:Ubuntu
系统没 -l
选项
tee 命令
ls ~ | tee test.txt #查看指定目录的内容并写入文件
ls /usr/local/nginx | tee -a test.txt #查看并以追加的形式写入内容
nmap 命令
nmap ip #查看开放端口
nmap ip -p 端口 #查看指定端口是否开启
nmap -sS -P0 -sV -O ip #查看主机系统信息
sqlmap 命令
readonly 命令
readonly name=demo #声明变量并将变量设置为只读,不允许修改删除
address=china #声明变量
readonly address #设置已存在的变量为只读
readonly -p #查看只读变量列表
readonly -a arr=(1,e,5) #数组类型的只读变量
enable 命令
enable #查看内置 shell 命令,只有列表内的命令可以设置禁用
enable -n type #禁用 type 命令,设置之后执行 type 命令会提示命令不存在
enable -pn #查看禁用的命令列表
enable -a type #解除禁用
visudo 命令
visudo #打开编辑 /etc/sudoers 文件
stty 命令
stty -echo #禁止将输入信息显示在终端
stty echo #允许输入信息显示在终端,默认显示
tput 命令
tput clear #清空终端
tput civis #光标不可见
tput cnorm #光标可见
read 命令
read name #读取终端输入的值并赋值给 name 变量
echo $name #输出变量值
read username age #读取终端输入的 2 个值,并赋值
echo $username $age #输出值
read -s passwdord #读取输入的信息赋值给 password 变量,输入的信息不显示在终端
read -p "Enter input:" var #设置输入时显示提示语
read -sp "Enter input:" var #设置输入时显示提示语,输入信息不显示在终端
read -t 10 name #设置指定时间内输入,超时主动退出
export 命令
export demo=11111 #声明变量赋值并设置为环境变量
host_name=ubuntu #声明变量
export host_name #将已声明的变量设置为环境变量
typeset 命令
typeset -x nickname=1111 #设置变量为自定义环境变量
typeset +x nickname #删除自定义环境变量
typeset -r demo=aaa #设置变量在当前 shell 下为只读
declare 命令
declare -x username=abc #设置变量为自定义环境变量
declare +x username #删除自定义环境变量
declare -r test=bbb #设置变量在当前 shell 下为只读
set 命令
set -u #设置变量不存在会报错停止往下执行
set -x #将脚本的执行过程输出方便调试
set -e #设置命令执行不成功停止执行
set -a my_env #将变量设置为环境变量
unset 命令
unset name #删除普通变量
unset -v test #删除环境变量
unset -f fun1 #删除函数
sh 命令
sh xx.sh #执行脚本
sh -n xxx.sh #检查语法
sh -i xxx.sh #交互式运行脚本
sh -x xxx.sh #显示脚本执行的顺序
xargs 命令
cat demo.sh | xargs #将内容转成单行显示
cat demo.sh | xargs -n 3 #将内容转成多行显示,每行 3 列
echo "splitXsplitXsplitXsplit" | xargs -d X #指定 X 符号作为分隔符
echo "splitXsplitXsplitXsplit" | xargs -d X -n 2 #指定 X 符号作为分隔符,每行 2 列
cecho.sh 文件内容
#!/bin/bash
echo $*'#'
cat args.txt | xargs -I {} ./cecho.sh -p {} -l #使用 -I 的时候,命令以循环的方式执行。如果有 3 个参数,那么命令就会连 同 {} 一起被执行 3 次。在每一次执行中 {} 都会被替换为相应的参数
tr 命令
echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z' #将大写字母转换成小写
echo "Hello " | tr -d 'H' #删除指定内容
tar 打包压缩命令
tar -cf php.tar php-7.2.6 #打包目录不压缩
tar -xf php.tar #解压目录
tar -czvf filename.tar.gz test #打包 test 目录并使用 gzip 压缩并显示文件信息
tar -xzvf filename.tar.gz #解压 gzip 文件并输出文件信息
tar -cjvf filename.tar.bz2 test #打包 test 目录并使用 gzip2 压缩并显示文件信息
tar -xjvf filename.tar.bz2 #解压使用 gzip2 压缩并显示文件信息
补充:-v
为显示信息
zip 压缩命令,文件后缀.zip
zip html.zip ./html #压缩当前目录下 html 目录或文件
unzip html.zip #解压在当前目录或文件
zip -qr html.zip ./html #将当前 html 目录递归压缩保存文件名为 html.zip
unzip html.zip #解压在当前目录
unzip -o html.zip -d /usr/local/ #解压 html.zip 文件到 /usr/local/ 下
zip -qr html.zip ./html #将当前html目录递归压缩为 html.zip
gzip 压缩命令,文件后缀.gz
gzip index.php #压缩 index.php 文件,文件名为 index.php.gz ,不会保留原文件
gunzip index.php.gz #解压文件
gzip -d index.php.gz #解压文件
bzip2 压缩命令,文件后缀.bz2
bzip2 index.php #压缩 index.php 文件,文件名为 index.php.bz2 ,不会保留原文件
bunzip2 index.php.bz2 #解压文件
bzip2 -d index.php.bz2 #解压文件
xz 压缩命令,文件后缀.xz
xz -z index.php #压缩文件
xz -d index.php.xz #解压文件
wget 命令
wget url #下载文件
wget -O demo.html url #下载文件并改为指定名称
wget -c url #断点续传
wget -i url url url #下载多个文件
wget -t 5 url #网络不好时重试 5 次
wget -t 0 url #不断重试
wget --limit-rate 20k url #限速下载
wget -Q 100m url #设置下载最大额度
wget --mirror --convert-links url #递归复制其他网站作为镜像,类似爬虫
wget --user username --password pass url #认证
补充:wget
命令适用于下载。
curl 命令
curl ifconfig.me #查看外网 IP
curl www.baidu.com #请求指定网址并显示出来
curl -o demo.html https://www.baidu.com/index.php #下载指定文件并重命名为 demo.html
curl -v www.baidu.com #显示请求的过程信息
curl url --silent #不显示下载进度信息
curl url -o index.html --progress #显示下载进度信息
curl --referer Referer_URL target_URL #设置 referer
curl url --cookie "user=username;pass=password" #设置 cookie
curl url --user-agent "Mozilla/5.0 ..." #设置 User-Agent
curl url --limit-rate 20k #限速
curl url --max-filesize bytes #设置下载最大额度
curl url -H 'HOST: 1.1.1.1' -H 'X-Real-IP: 2.2.2.2' #设置 http header
curl -X GET www.baidu.com #指定请求方法,请求方法必须大写
curl -C url #断点续传,适用网络不顺畅时下载大文件,无须重新下载
curl --connect-timeout 20 https://wp.hellocode.name/?p=701 #指定 url 并限制连接时间
补充:curl
命令适用于上传与请求。
查找并删除某个目录下的某个文件
find /path -name '*.url' -type f -print -exec rm -rf {} ; 文件
find /path -name '文件夹' -type d -print -exec rm -rf {} ; 文件夹
find 全路径 -mtime 10 -name '*.url' -type f -print -exec rm -rf {} ;
遵循find语法
find --linux 的查找命令,用户查找指定条件的文件
/xxx -- . 想要进行清理的任意目录
-mtime -- 标准语句写法
-maxdepth -- <目录层级>:设置最大目录层级;
+ 10 -- 查找 10 天前的文件,这里用数字代表天数
"*.*" -- 希望查找的数据类型, "*" 表示查找所有文件
-type -- f文件 d目录
-exec -- 固定写法
-size +100M -- 指定大小
rm -rf -- 强制删除文件,包括目录
{} \; -- 固定写法,一对大括号 + 空格 +\
查找并移动某个目录下的文件
find /path -name '*.pdf' -type f -print -exec mv {} /path ;