运维15道

请使用Linux系统命令统计出establish状态链接数
netstat -an |grep ESTABLISHED |wc -l

补充:

netstat    查看网络状态

常用参数: -lntup  / -an

-a (all)显示所有选项,默认不显示LISTEN相关
-n 拒绝显示别名,能显示数字的全部转化成数字

-l 仅列出有在 Listen (监听) 的服务状态
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-p 显示建立相关链接的程序名

-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令

提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
查询file1里面空行所在的行号
grep -n "^$" file1

补充:

grep  "关键字"    过滤(三剑客的老三 )

常用参数:

不加参数         过滤,显示包含关键字的那一行
-v 排除,排除包含关键字的那一行,显示其他行
-E 指定多个关键字,关键字之间用 | 隔开(grep -E==egrep )
-i 不区分大小写
-n 显示行号
--color=auto 让过滤出来的关键字携带颜色

-B1 连带前1行一同过滤出来(before)
-A1 连带后1行一同过滤出来(after)
-C1 连带前后1行一同过滤出来(context:上下文)

-w 精确匹配关键字(也可以使用Linux中的正则表达式实现)

-q grep使用静默模式
静默模式下grep不会输出任何信息,无论是否匹配到指定的字符串,都不会输出任何信息
所以,我们需要配合”echo $?”命令,查看命令的执行状态
如果返回值为0,证明上一条grep命令匹配到了指定的字符串
如果返回值为非0,则证明上一条grep命令没有匹配到指定的字符串
在写脚本时
可能只是想要利用grep判断文本中是否存在某个字符串,只关心有,或者没有
这时,我们可以使用grep的静默模式,但是需要配合”echo $?”命令查看执行状态

示例:

[root@test1 tmp]# grep -C1 "年龄:18" testgrep 
姓名:张三
年龄:18
爱好:K歌,跳舞
--
姓名:李四
年龄:18
爱好:打麻将
[root@test1 tmp]# grep "zyc" testgrep 
zyc test
zyc TEST
zyc123
123zyc123
zyc123zyc
[root@test1 tmp]# grep -w "zyc" testgrep
zyc test
zyc TEST
[root@test1 tmp]# cat testgrep 
zyc test
zyc TEST
zyc123
123zyc123
zyc123zyc
姓名:张三
年龄:18
爱好:K歌,跳舞

姓名:赵六
年龄:25
爱好:喝酒

姓名:李四
年龄:18
爱好:打麻将

[root@test1 tmp]# grep -q "test" testgrep
echo $?
0

[root@test1 tmp]# grep -q "ttttt" testgrep
echo $?
1
查询file1以abc结尾的行
grep "abc$" file1
Crontab在11月份内,每天的早上6点到12点中,每隔2小时执行一次/usr/bin/httpd.sh
0 6-12/2 * 11 * /bin/sh /usr/bin/httpd.sh >/dev/null 2>&1

补充:

Crontab定时任务

格式:

* * * * * /bin/sh /usr/bin/httpd.sh >/dev/null 2>&1

python运维开发面试题_面试题

通过 crontab -e 编辑定时任务,来将定时任务写到 /var/spool/cron/用户名

(定时任务的配置文件)下

通过 crontab -l 查看定时任务

注:写定时任务前写好注释

写一个脚本查找创建时间是3天前,后缀是*log的文件并删除
#/bin/bash    
# filename: del_log.sh

find / -name "*.log" -mtime 3 | xargs rm -fr

#/bin/bash
# filename: del_log.sh

find / -name "*.log" -mtime 3 -exec rm -fr {} \;

#/bin/bash
# filename: del_log.sh

find / -name "*.log" -mtime 3 -ok rm -fr {} \;

补充:

Linux中的3个时间戳

atime(访问时间)

读一次文件的内容,这个时间就会更新,比如more,cat等命令

mtime(修改时间)

修改时间是文件最后一次被修改的时间,比如:vim操作后保存文件

ctime(状态改动时间)

是该文件的inode节点最后一次被修改的时间,通过chmod、chown命令修改文件属性,这个时间就会更新

使用 stat 命令可以查看

用shell在/usr/local下建立20个子目录xunlei1-xunlei20,再在这个子目录下分别建255个子目录dir1-dir255,再在255个子目录下创建10000个文件xunlei1.html-xunlei10000.html
mkdir -p /usr/local/xunlie{1..20}/dir{1..255}/
touch /usr/loca/xunlie{1..20}/dir{1..255}/xunlei{1..10000}.html
通过Nginx访问日志access.log统计IP和每个地址访问的次数,按访问量列出前10名,日志格式样例如下 :
192.168.1.247  -  -[02/Jul/2010:23:44:59 +0800] -GET /HTTP/1.1” 200 19
cat access_log | awk ‘{print $1}’ | uniq -c|sort -rn|head -10

补充:

uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。

常用参数:

不加参数         剔除重复的行
-u 显示未重复的行
-c 统计重复行的数量
-i 忽略大小写
-d 显示重复的行

示例:

[root@test1 tmp]# cat test.txt
hello, wuhs is a man
hello, wuhs is a man
Hello, wuhs is a man
hello, sunru is a woman
hello, sunru is a woman
hello, sunru is a woman
hello, bulesky is a children
hi, bulesky is a children
[root@test1 tmp]# uniq test.txt
hello, wuhs is a man
Hello, wuhs is a man
hello, sunru is a woman
hello, bulesky is a children
hi, bulesky is a children
[root@test1 tmp]# uniq -u test.txt
Hello, wuhs is a man
hello, bulesky is a children
hi, bulesky is a children
[root@test1 tmp]# uniq -c test.txt
2 hello, wuhs is a man
1 Hello, wuhs is a man
3 hello, sunru is a woman
1 hello, bulesky is a children
1 hi, bulesky is a children
[root@test1 tmp]# uniq -ci test.txt
3 hello, wuhs is a man
3 hello, sunru is a woman
1 hello, bulesky is a children
1 hi, bulesky is a children
[root@test1 tmp]# uniq -d test.txt
hello, wuhs is a man
hello, sunru is a woman

sort 命令用于将文本文件内容按行排序。                                                  比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按一定的顺序进行输出。                                                                                       sort命令经常可以与ls、cat等命令结合使用,将查询到的结果按照我们要求进行排序。

常用参数:

不加参数      按照字母排序
-n 按照数字大小排序
-u 剔除重复行后排序
-r 降序排序
-t 指定分隔符排序
-k1 按照指定的第一列排序

示例:

[root@test1 ~]# cat word.txt
one
two
two
three
four
[root@test1 ~]# sort word.txt
four
one
three
two
two
[root@test1 ~]# cat num.txt
10
8
20
100
4
[root@test1 ~]# sort -n num.txt
4
8
10
20
100
[root@test1 ~]# sort -u word.txt
four
one
three
two
[root@test1 ~]# sort -ur word.txt
two
three
one
four

python运维开发面试题_面试题_02

企业案例:处理一下文件内容,将域名取出并根据域名进行计数排序处理(百度和sohu面试题)

1

2

3

4

5

6

7

[root@web01 ~]# cat access.log 

http://www.etiantian.org/index.html

http://www.etiantian.org/1.html

​http://post.etiantian.org/index.html​​ 

http://mp3.etiantian.org/index.html

http://www.etiantian.org/3.html

http://post.etiantian.org/2.html

解答:

分析:此类问题是运维工作中最常见的问题。可以演变成分析日志,查看TCP各个状态连接数,查看单IP连接数排名等等。

1

2

3

4

      awk -F '[/]+' '{print $2}' access.log|sort|uniq -c|sort -k1 -rn

      3 www.etiantian.org

      2 post.etiantian.org

      1 mp3.etiantian.org

[root@localhost tmp]# awk -F '[/]+' '{print $2}' access.log|sort|uniq -c|sort -k1 -rn
3 www.etiantian.org
2 post.etiantian.org
1 mp3.etiantian.org
[root@localhost tmp]# awk -F '[/]+' '{print $2}' access.log
www.etiantian.org
www.etiantian.org
post.etiantian.org
mp3.etiantian.org
www.etiantian.org
post.etiantian.org
[root@localhost tmp]# awk -F '[/]+' '{print $2}' access.log|uniq -c
2 www.etiantian.org
1 post.etiantian.org
1 mp3.etiantian.org
1 www.etiantian.org
1 post.etiantian.org

这种情况,显然不合要求,所以在 uniq -c 前先 sort

[root@localhost tmp]# awk -F '[/]+' '{print $2}' access.log|sort
mp3.etiantian.org
post.etiantian.org
post.etiantian.org
www.etiantian.org
www.etiantian.org
www.etiantian.org
[root@localhost tmp]# awk -F '[/]+' '{print $2}' access.log|sort|uniq -c
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
杀死以A开头的所有进程
ps -ef|grep A|grep -v grep|cut -c 9-15|xargs kill-9

说明:

管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入
ps -efww 查看所有进程
grep -v grep 在列出的进程中排除含有关键字“grep”的进程
cut -c 9-15 截取第9个字符到第15个字符,而这正好是进程号PID
kill -9 强行杀掉指定进程

补充:

在Linux平台上后台运行4个vim进程,使用如下命令即可同时结束掉4个vim进程

ps -efww|grep vim |grep -v grep|cut -c 9-15|xargs kill -9

如何查看占用端口8080的进程

方法1:使用lsof命令

使用IPv4协议的局域网:

执行命令:  lsof -Pnl +M -i4|grep 8080

输出结果:java   1419   1401   10u  IPv4  6793357       TCP *:8080 (LISTEN)

补充:

lsof(list open files)是一个列出当前系统打开的文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件,一般root用户才能执行lsof命令

在终端下输入 lsof 即可显示系统打开的文件

python运维开发面试题_运维_03

每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件

lsof输出各列信息的意义如下:

COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开的文件的确切名称

用法:

lsof 文件名               查看谁正在使用这个文件
lsof 目录名 查看谁正在使用这个目录
lsof -i :22 查看22端口被哪个进程占用
lsof -c abc 显示abc进程现在打开的文件
lsof -g gid 显示归属gid的进程情况
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -p 12 查看进程号为12的进程打开了哪些文件
lsof -u username 查看用户打开哪些文件
lsof -i @192.168.1.111 查看远程已打开的网络连接(连接到192.168.1.111)

lsof -i 用以显示符合条件的进程情况

语法: lsof -i[46] [protocol][@hostname|hostaddr][:service|port]

46 -> IPv4 or IPv6
protocol -> TCP or UDP
hostname -> Internet host name
hostaddr -> IPv4位置
service -> /etc/service中的 service name (可以不只一个)
port -> 端口号 (可以不只一个)

查找哪个IP端口访问了哪个IP端口,这个在源主机还是目的主机都可以用,下面我想查的是当前这个机器的哪个程序访问了112那个主机

lsof -Pnl +M -i4

python运维开发面试题_运维_04

方法2:先使用 netstat命令,再用 ps命令

执行命令: netstat -anp|grep 8080  (查看占用8080端口的进程)

输出结果: tcp        0      0 :::8080              :::*          LISTEN      12006/java

执行命令: ps -ef | grep 12006  (查看12006进程的详细信息)

输出结果:

root     12886 12851  0 Dec09 ?        00:01:14

/home/bjca/bea/jdk160_05/bin/java -client -Xms256m -Xmx512m

-XX:CompileThreshold=8000 -XX:PermSize=48m -XX:MaxPermSize=128m......

服务器免密登录如何实现

https://blog.csdn.net/simongeek/article/details/53501629

Shell中$#,$$,$?,$0分别代表什么

$#     是传递给该shell脚本的参数个数

$$     Shell本身的PID(ProcessID)

$?     最后运行的命令的结束代码(返回值)

$0     Shell本身的文件名

补充:

shell中的变量说明:

$$
Shell本身的PID(ProcessID)
$!
Shell最后运行的后台Process的PID
$?
最后运行的命令的结束代码(返回值)
$-
使用Set命令设定的Flag一览
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2$n"的形式输出所有参数。
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2""$n" 的形式输出所有参数。
$#
是传递给该shell脚本的参数个数
$0
Shell本身的文件名
$1$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…

脚本举例

# vi variable

脚本内容如下:
#!/bin/sh

echo "number:$#"

echo "scname:$0"

echo "first :$1"

echo "second:$2"

echo "argume:$@"

保存退出

赋予脚本执行权限

# chmod +x variable

执行脚本

# ./variable aa bb

number:2

scname:./variable

first: aa

second:bb

argume:aa bb

通过显示结果可以看到:

$# 是传给脚本的参数个数

$0 是脚本本身的名字

$1是传递给该shell脚本的第一个参数

$2是传递给该shell脚本的第二个参数

$@ 是传给该shell脚本的所有参数的列表

Nginx算法

详见:

​https://blog.csdn.net/gzh0222/article/details/8095994​

编写一个Nginx的access模块,要求准许192.168.3.29/24的机器访问,准许10.1.20.6/16这个网段的所有机器访问,准许34.26.157.0/24这个网段访问,除此之外的机器不准许访问
location/{
access 192.168.3.29/24;
access 10.1.20.6/16;
access 34.26.157.0/24;
deny all;
}

补充:

防火墙是层层深入的,可以从硬件上用acl(访问控制列表)实现,如果没有钱买一个防火墙,那么还可以在linux上设置iptables,如果iptables不设置,还可以在nginx上设置。

详见:

​http://www.it610.com/article/4921101.htm​

Nginx优化方面有哪些

详见:

​https://blog.csdn.net/hanjinjuan/article/details/119744168​

请写出一段Python代码实现删除一个list里面的重复元素

#!/usr/bin/python

#coding=utf-8

List1=[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7]

List1=list(set(List1))

print(List1)

补充:

set(),set是定义集合的,无序,非重复

list(),转换为列表

本文转自:​​https://www.cnblogs.com/huangtiandi001/p/9197270.html​