Linux知识补充点
完成基础知识后,多搜索网络综合文档,整理为我所用
/sed
/模式空间
/awk
seq
split
Network
iptables
selinux
watch
crontab
eval
expr
FTP
SSH
/LVM
/Heartbeat
/Keepalived
/linux服务器优化
/负载均衡
/常用脚本、命令
seq
以指定增量打印数字序列。
基本用法
seq [选项]... 尾数
seq [选项]... 首数 尾数
seq [选项]... 首数 增量 尾数
选项:
-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同
例:
- 尽可能显示大整数
seq --format=%1.f 1000000 1000001
显示
1000000
1000001
对比,不使用--format的情况,默认使用%g显示
[plain]
$ seq 1000000 1000001
显示
1e+06
1e+06
- 显示等宽数字,位数不足用前导0补齐
seq -w -s ' ' 0 10
显示
00 01 02 03 04 05 06 07 08 09 10
注:-s用于改变字数间的分隔符,-w用以保证等宽显示。
split
切割文件
split [--help][--version][-<行数>][-b <字节>][-C <字节>][-l <行数>][要切割的文件][输出文件名]
参数:
-<行数>或-l<行数> 指定每多少行就要切成一个小文件。
-b<字节> 指定每多少字就要切成一个小文件。支持单位:m,k
-C<字节> 与-b参数类似,但切割时尽量维持每行的完整性。
--help 显示帮助。
--version 显示版本信息。
[输出文件名] 设置切割后文件的前置文件名,split会自动在前置文件名后再加上编号。
说明:
split可将文件切成较小的文件,预设每1000行会切成一个小文件。
使用例子:
split -b 100m 1111.log (按照字节分隔)
split -l 1000000 1111.log(按照行数分隔)
eval
eval cmd
eval对cmd两遍扫描,如第一遍扫描后,cmdLine是普通命令,则执行;如cmdLine含变量间接引用,则保证间接引用语义。
举例如下:
set 11 22 33 44
如要输出最近一参数,即44,使用:
echo $4
但如我们不知道几个参数,要输出最后一个,使用$#来输出最后一个参数:
echo "\$$#"
结果$4,
非44。
使用eval:
eval echo "\$$#"
结果为44
expr
求表达式变量的值,一般用于整数值,也可用于字符串。
字串长度
# expr length "this is a test"
14
数字求商数
# expr 14 % 9
5
从位置处抓取字串
# expr substr "this is a test" 3 5
is is
数字串only the first character
# expr index "testforthegame" e
2
字串真实重现
# expr quote thisisatestformela
thisisatestformela
selinux
查看SELinux状态:
1、sestatus -v #如果SELinux status参数为enabled即为开启状态
2、getenforce ##也可以用这个命令检查
关闭SELinux:
1、临时关闭(不用重启机器):
setenforce 0 ##设置SELinux 成为permissive模式
##setenforce 1 设置SELinux 成为enforcing模式
2、修改配置文件需要重启机器:
修改/etc/selinux/config,将SELINUX=enforcing改为SELINUX=disabled
重启
watch
命令格式:
watch[参数][命令]
命令功能:
将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令
命令参数:
-n或--interval 缺省每2秒运行一下程序,可用-n或-interval来指定间隔的时间
-d或--differences 高亮显示变化的区域
-d=cumulative 把变动过的地方(不管最近的那次有没有变动)都高亮显示出来
-t 或-no-title 会关闭watch命令在顶部的时间间隔,命令,当前时间的输出
-h, --help 查看帮助文档
使用实例:
实例1:每隔一秒高亮显示网络链接数的变化情况
watch -n 1 -d netstat -ant
其它操作:
切换终端: Ctrl+x
退出watch:Ctrl+g
实例2:每隔一秒高亮显示http链接数的变化情况
watch -n 1 -d 'pstree|grep http'
每隔一秒高亮显示http链接数的变化情况。 后面接的命令若带有管道符,需要加''将命令区域归整。
实例3:实时查看模拟攻击客户机建立起来的连接数
watch 'netstat -an | grep:21 | \ grep<模拟攻击客户机的IP>| wc -l'
实例4:监测当前目录中 scf' 的文件的变化
watch -d 'ls -l|grep scf'
实例5:10秒一次输出系统的平均负载
watch -n 10 'cat /proc/loadavg'
crontab
crontab [-u username] [-l|-e|-r]
选项:
-u :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程;
-e :编辑 crontab 的工作内容
-l :查阅 crontab 的工作内容
-r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑
cron文件语法
crontab -e命令编辑/var/spool/cron对应用户cron文件,也可修改/etc/crontab文件。
具体格式如下:
Minute Hour Day Month Week command
分钟 小时 天 月 星期 命令
0-59 0-23 1-31 1-12 0-6 command
每个字段代表的含义如下:
Minute 每个小时的第几分钟执行该任务
Hour 每天的第几个小时执行该任务
Day 每月的第几天执行该任务
Month 每年的第几个月执行该任务
DayOfWeek 每周的第几天执行该任务,0表示周日
Command 指定要执行的程序 、脚本或命令
Command必须,其它可选。不指定字段,用*填补。
几个特殊符号的含义
*代表取值范围内的数字,
/代表”每”,
-代表从某个数字到某个数字,
,分开几个离散的数字
关于cron配置文件/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
前四行配置 cron 任务运行环境变量:
SHELL--指定shell 环境(默认bash shell)
PATH --执行命令的程序路径
MAILTO--cron任务的输出邮件给变量定义的用户名,空串(MAILTO="")不寄;
HOME --执行命令或脚本的主目录
若cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可被添加到/etc/cron.d目录。
该目录中的所有文件使用和 /etc/crontab 中一样的语法。
编辑完cron设置,在/var/spool/cron生成一与用户同名文件,不可直接编辑,只可用crontab -e 编辑。
cron启动后每一分钟读该文件,检查是否要执行里面的命令。
常见cron示例参考
5 * * * * ls 指定每小时的第5分钟执行一次ls命令
30 5 * * * ls 指定每天的 5:30 执行ls命令
30 7 8 * * ls 指定每月8号的7:30分执行ls命令
30 5 8 6 * ls 指定每年的6月8日5:30执行ls命令
30 6 * * 0 ls 指定每星期日6:30执行ls命令
[注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
30 3 10,20 * * ls 每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
25 8-11 * * * ls 每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]
*/15 * * * * ls 每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
30 6 */10 * * ls 每个月中,每隔10天6:30执行一次ls命令[即每月1、11、21、31日是的6:30执行一次ls命令 ]
每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件
50 7 * * * root run-parts /etc/cron.daily [ 注:run-parts参数表示,执行后面目录中的所有可执行文件
第10、20、30分钟输出到/tmp/cron1.txt:
10,20,30 * * * * echo "第10、20、30分钟输出一次" >> /tmp/cron1.txt
以用户lzw.me的身份每两小时就运行某个程序:
0 */2 * * * lzw.me /usr/bin/somecommand >> /dev/null 2>&1
特别提示
A、cron配置文件路径
#vi /etc/crontab
B、重启cron的方法
#/etc/rc.d/init.d/crond restart
Usage: /etc/rc.d/init.d/crond {start|stop|status|reload|restart|condrestart}
C、将脚本改成可执行
chmod +x filename
SSH
SSH为Secure Shell的缩写,为创建在应用层和传输层基础上的安全协议。
基本功能:
连接到远程主机:
ssh name@remoteserver
或
ssh remoteserver -l name
说明:server代表远程主机,name为登录远程主机用户名。
连接到远程主机指定的端口:
ssh name@remoteserver -p 2222
或
ssh remoteserver -l name –p 2222
说明:
p 参数指定端口号
通常在路由里做端口映射时,我们不会把22端口直接映射出去,而是转换成其他端口号,这时就需要使用-p 端口号命令格式。
通过远程主机1跳到远程主机2:
ssh -t remoteserver1 ssh remoteserver2
说明:
当remoteserver2无法直达,可使用-t参数,然后由remoteserver1跳转到remoteserver2。
通过SSH运行远程shell命令:
ssh -l name remoteserver ‘command’
说明:
连接到远程主机,并执行远程主机的command命令。
例如:查看远程主机的内存使用情况。
修改SSH监听端口
默认SSH监听端口22,攻击者使用端口扫描软件就可以看到主机是否运行有SSH服务.
将SSH端口修改为大于1024的端口是一个明智的选择.
因大多数端口扫描软件(包括nmap)默认情况都不扫描高位端口。打开/etc/ssh/sshd_config文件并查找下面这样的行:
Port 22
去掉该行前面的# 号,然后修改端口号并重新启动SSH服务:
$ /etc/init.d/ssh restart
仅允许SSH协议版本2
两个SSH协议版本,仅使用SSH协议版本2会更安全,SSH协议版本1有安全问题,包括中间人攻击(man-in-the-middle)和注入(insertion)攻击。
编辑/etc/ssh/sshd_config文件并查找下面这样的行:
# Protocol 2,1
修改为:
Protocol 2
禁止root用户登录:
通常情况下,不采用直接用root用户登录到远程主机,由于root用户拥有超级权限,这样会带来安全隐患,所以,一般我们用普通用户登录,当需要管理远程主机时,再切换到root用户下。
打开/etc/ssh/sshd_config文件并查找下面这样的行:
#PermitRootLogin yes
将#号去掉,然后将yes修改成no,重启ssh服务,这样就可以禁止root用户登录。
设置登录时提示信息
首先编辑一个文件,如bannertest.txt,文件内容自行定义。然后打开/etc/ssh/sshd_config文件并查找下面这样的行:
#Banner /some/path
将#号去掉,然后将bannertest.txt文件的全路径替换/some/path,然后保存,重启ssh服务。当客户端登录时,就会看到bannertest.txt文件中的提示信息。
scp命令
在两台服务器之间传送文件。传输过程中仍使用ssh加密。
将远程主机的/tmp/test 文件复制到本地的/bak文件夹下
scp -p root@192.168.1.120:/tmp/test /bak
将本地/bak/1234 文件复制到远程主机的/tmp路径下
scp -p /bak/1234 root@192.168.1.120:/tmp
FTP
1. 连接ftp服务器
ftp [hostname| ip-address]
a)在Linux命令行下输入:
ftp 192.168.1.1b)服务器询问你用户名和密码,分别输入用户名和相应密码,待认证通过即可。
2. 下载文件
get和mget。
get
将文件从远端主机中传送至本地主机中:
get [remote-file] [local-file]
如要获取远程服务器上/usr/your/1.htm,则
ftp> get /usr/your/1.htm 1.htm (回车)
mget
远端主机接收一批文件至本地主机:
mget [remote-files]
如要获取服务器上/usr/your/下的所有文件,则
ftp> cd /usr/your/
ftp> mget *.* (回车)
此时每下载一个文件,都会有提示。如果要除掉提示,则在mget . 命令前先执行:prompt off
注意:文件都下载到了linux主机的当前目录下。比如,在 /usr/my下运行的ftp命令,则文件都下载到了/usr/my下。
3.上传文件
put
将本地一个文件传送至远端主机中
put local-file [remote-file]
如要把本地的1.htm传送到远端主机/usr/your,并改名为2.htm
ftp> put 1.htm /usr/your/2.htm (回车)
mput
将本地主机中一批文件传送至远端主机。
mput local-files
如要把本地当前目录下所有html文件上传到服务器/usr/your/ 下
ftp> cd /usr/your (回车)
ftp> mput *.htm (回车)
注意:上传文件都来自于主机的当前目录下。比如,在 /usr/my下运行的ftp命令,则只有在/usr/my下的文件linux才会上传到服务器/usr/your 下。
4. 断开连接
bye:中断与服务器的连接。
ftp> bye (回车)
模式空间
sed之所以能以行为单位的编辑或修改,原因在于它使用了两个空间:
活动的“模式空间(pattern space)”
起辅助作用的“暂存缓冲区(holdingspace)