欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux知识补充点

程序员文章站 2022-05-10 11:52:35
...

完成基础知识后,多搜索网络综合文档,整理为我所用

/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 [email protected]
或
ssh remoteserver -l name

说明:server代表远程主机,name为登录远程主机用户名。

连接到远程主机指定的端口:

ssh [email protected] -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 [email protected]:/tmp/test /bak

将本地/bak/1234 文件复制到远程主机的/tmp路径下

scp -p /bak/1234 [email protected]:/tmp

FTP

1. 连接ftp服务器

ftp [hostname| ip-address]

a)在Linux命令行下输入:
ftp 192.168.1.1

b)服务器询问你用户名和密码,分别输入用户名和相应密码,待认证通过即可。

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)

Linux服务器优化