欢迎光临
我们一直在努力

Linux技巧

Linux下6种优秀的邮件传输代理

阅读(259)评论(0)

邮件客户端向邮件服务器发送邮件然后将消息路由到正确的目的地(其他客户)其中邮件服务器使用一个网络应用程序称为邮件传输代理(MTA)。

自动草稿

最好的Linux邮件传输代理(MTAs)

邮件传输代理(MTA)是什么?

MTA是一个应用程序,该应用程序路由和传输电子邮件从一个节点到另一个网络,它使用一个被称为SMTP(简单邮件传输协议)的协议来执行其任务。

在网络节点上,存在一个电子邮件客户端,用于发送和接收消息的邮件服务器,电子邮件客户机也使得使用SMTP协议的,但未必是MTA。

MTA被安装在邮件服务器上,和一些电子邮件客户端中,如(Mozilla Thunderbird)雷鸟,(Evolution),微软的Outlook和Apple mail都安装了邮件客户端。

在本文中,我们将介绍几个Linux下常用的邮件服务器,它们都使用了MTA。

1. Sendmail

Sendmail 现在被称为 proofpoint(after Proofpoint, Inc acquired Sendmail, Inc)是迄今为止在Linux服务器平台上最受欢迎和最古老的 MTA。Sendmail 相对于现在一些MTAs有很多限制。由于其复杂的配置步骤和要求,和薄弱的安全机制,许多新的 MTA 开始替代 Sendmail。

sendmail安装

#检查软件是否安装

rpm -qa | egrep "sendmail|dovecot|cyrus"

#安装邮件服务器

yum -y install sendmail sendmail-cf

#安装pop3/imap服务

yum -y install dovecot

#安装用户认证软件

yum -y install cyrus-sasl cryus-sasl-md5 cryus-sasl-plain cyrus-sasl-lib

官方网站: http://www.sendmail.com

自动草稿

2. Postfix

Postfix 是一个跨平台的、流行的MTA,被当时在IBM研究部门的Wietse Zweitze Venema开发和设计用于公司的邮件服务器。
它开发主要目的为了替代公众的,流行的Sendmail MTA。 Postfix运行在Linux,Mac OSX,Solaris和其他几个类Unix操作系统上。
它借用了很多Sendmail的外在属性,但它有一个完全不同内部操作。此外,它的优势在于方便配置和安全机制的功能性模块,并具有以下主要特点:

  1. 垃圾邮件控制
  2. 支持多种协议Supports multiple protocols
  3. 支持数据库
  4. 支持Mailbox
  5. 支持地址操作,更多功能参考官方文档

postfix安装

rpm -qa | egrep “postfix|mailx“
yum -y install mailx postfix
service postfix start && chkconfig postfix on

官网地址:http://www.postfix.org

 

3. Exim

Exim 是一个免费的MTA,开发用于类Unix操作系统,如Linux、Mac OSX,Solaris等其他操作系统。Exim提供了很大的灵活性,用于网络上的邮件路由,同时包括良好的机制和接受邮件监控的设置。

其显着特点包括但不限于:

  1. 不支持POP和IMAP 协议
  2. 支持的协议,如RFC2821 SMTP和RFC2033 LMTP电子邮件传输
  3. 配置其中包括访问控制列表,内容扫描,加密,路由控制
  4. 优秀的文档
  5. 它具有实用程序,如Lemonade是各种各样的SMTP和IMAP扩展

Exim安装

#安装最新的epel源

rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm

# 安装exim

yum -y install exim-mysql mailx
service posftix stop && chkconfig postfix off
chkconfig exim on && service exim start

# 测试邮件

echo “this is test from exim” | mial -s “exim”
tailf /var/log/exim/mainlog

官方网站:http://www.exim.org/

自动草稿

4. Qmail

Qmail 是另一种免费的,开源的,现代的Linux MTA,相比其他MTA,它简单,可靠,高效,从而提供了广泛的安全功能,安全的MTA包。

它很小但是功能丰富,一些特性包括:

  1. 运行在多种类Unix操作系统之上,如FreeBSD, Solaris, Mac OSX plus 等更多
  2. 安装简单快捷
  3. 自动配置每个主机
  4. 地址,文件和程序之间的分隔明确
  5. 全面支持地址组
  6. 让每个用户管理自己的邮件列表
  7. 支持一个简单的方法来建立邮件列表
  8. 支持VERPs
  9. 支持自动防止邮件列表的循环
  10. 支持ezmlm的邮件列表管理器

#Qmail 安装

wget http://infobase.ibase.com.hk/qmail/netqmail-1.06.tar.gz -p /usr/local/src
tar xpf netqmail-1.06.tar.gz && cd netqmail-1.06 && ./collate.sh
make setup check && ./config

更多Qmial安装的详细信息请移步到其官网wiki:http://lifewithqmail.org/LWQ-CN.html#download,文中不过多赘述

官方网站: http://www.qmail.org

自动草稿

5. Mutt命令行邮件客户端

Mutt 是一个基于类Unix操作系统,小而强大的电子邮件客户端。

作为一个基于文本的电子邮件客户端,它有一些令人振奋的功能,显著特点包括:

  1. 邮件主题
  2. 支持IMAP和POP3协议
  3. 支持多个邮箱格式,如MBOX,MH,Maildir,MMDF
  4. 支持传送状态
  5. 多个邮件标记
  6. 支持PGP/MIME (RFC2015)
  7. 各种功能以支持邮件清单,其中包括列表回复
  8. 撰写期间邮件头的完全控制
  9. 安装容易
  10. 活跃的社区开发

官方网站: http://www.mutt.org/

自动草稿

6. Alpine

Alpine 是Linux的一个快速且易于使用的基于终端的电子邮件客户端,它是基于Pine邮件系统。它非常适合初学者和电力用户,用户可以轻松地学习如何通过上下文相关帮助使用它。

重要的是,它可以通过Alpine命令进行高度定制。

# Alpine 安装

wget ftp://ftp.cac.washington.edu/alpine/alpine.tar.gz
tar zxvf alpine.tar.gz && cd alpine && ./configure && make && make install

注:更多Apline安装的详细信息请参考:https://www.washington.edu/alpine/tech-notes/installation.html(自行翻墙)

官方网址:https://www.washington.edu/alpine/

自动草稿

总结

文中简要的介绍了邮件是如何从邮件客户端,通过网络传到邮件服务器上,并通过邮件路由发送到指定客户端,更重要的是对MTA的工作方式有了一些了解,如果你需要搭建一台邮件服务器的话,上面几个MTA是很好的选择。

Linux下使用TCP封装器来加强网络服务安全

阅读(430)评论(0)

在这篇文章中,我们将会讲述什么是 TCP 封装器(TCP wrappers)以及如何在一台 Linux 服务器上配置他们来限制网络服务的权限。在开始之前,我们必须澄清 TCP 封装器并不能消除对于正确配置防火墙的需要。

Linux下使用TCP封装器来加强网络服务安全

就这一点而言,你可以把这个工具看作是一个基于主机的访问控制列表,而且并不能作为你的系统的终极安全措施。通过使用一个防火墙和 TCP 封装器,而不是只偏爱其中的一个,你将会确保你的服务不会被出现单点故障。

正确理解 hosts.allow 和 hosts.deny 文件

当一个网络请求到达你的主机的时候,TCP 封装器会使用 hosts.allow 和 hosts.deny (按照这样的顺序)来决定客户端是否应该被允许使用一个提供的服务。.
在默认情况下,这些文件内容是空的,或者被注释掉,或者根本不存在。所以,任何请求都会被允许通过 TCP 过滤器而且你的系统被置于依靠防火墙来提供所有的保护。因为这并不是我们想要的。由于在一开始我们就介绍过的原因,清确保下面两个文件都存在:

# ls -l /etc/hosts.allow /etc/hosts.deny

两个文件的编写语法规则是一样的:

<services> : <clients> [: <option1> : <option2> : ...]

在文件中,
1. services 指当前规则对应的服务,是一个逗号分割的列表。
2. clients 指被规则影响的主机名或者 IP 地址,逗号分割的。下面的通配符也可以接受:

1).ALL 表示所有事物,应用于clients和services。

2).LOCAL 表示匹配在正式域名中没有完全限定主机名(FQDN)的机器,例如 localhost。

3).KNOWN 表示主机名,主机地址,或者用户是已知的(即可以通过 DNS 或其它服务解析到)。

4).UNKNOWN 和 KNOWN 相反。

5).PARANOID 如果进行反向 DNS 查找彼此返回了不同的地址,那么连接就会被断开(首先根据 IP 去解析主机名,然后根据主机名去获得 IP 地址)。

3. 最后,一个冒号分割的动作列表表示了当一个规则被触发的时候会采取什么操作。

你应该记住 /etc/hosts.allow 文件中允许一个服务接入的规则要优先于 /etc/hosts.deny 中的规则。另外还有,如果两个规则应用于同一个服务,只有第一个规则会被纳入考虑。不幸的是,不是所有的网络服务都支持 TCP 过滤器,为了查看一个给定的服务是否支持他们,可以执行以下命令:

# ldd /path/to/binary | grep libwrap

如果以上命令执行以后得到了以下结果,那么它就可以支持 TCP 过滤器,sshd 和 vsftpd 作为例子,输出如下所示。
Linux下使用TCP封装器来加强网络服务安全

如何使用 TCP 过滤器来限制服务的权限

当你编辑 /etc/hosts.allow 和 /etc/hosts.deny 的时候,确保你在最后一个非空行后面通过回车键来添加一个新的行。
为了使得 SSH 和 FTP 服务只允许 localhost 和 192.168.0.102 并且拒绝所有其他用户,在 /etc/hosts.deny 添加如下内容:

sshd,vsftpd : ALL 
ALL : ALL

而且在 /etc/hosts.allow 文件中添加如下内容:

sshd,vsftpd : 192.168.0.102,LOCAL

这些更改会立刻生效并且不需要重新启动。
在下图中你会看到,在最后一行中删掉 LOCAL 后,FTP 服务器会对于 localhost 不可用。在我们添加了通配符以后,服务又变得可用了。
Linux下使用TCP封装器来加强网络服务安全
为了允许所有服务对于主机名中含有 example.com 都可用,在 hosts.allow 中添加如下一行:

ALL : .example.com

而为了禁止 10.0.1.0/24 的机器访问 vsftpd 服务,在 hosts.deny 文件中添加如下一行:

vsftpd : 10.0.1.

在最后的两个例子中,注意到客户端列表每行开头和结尾的点。这是用来表示 “所有名字或者 IP 中含有那个字符串的主机或客户端”

Centos 分割卷组

阅读(323)评论(0)

LVM 可以创建和管理“逻辑”卷,而不是直接使用物理硬盘。可以让管理员弹性的管理逻辑卷的扩大缩小,操作简单,而不损坏已存储的数据。可以随意将新的硬盘添加到LVM,以直接扩展已经存在的逻辑卷。LVM并不需要重启就可以让内核知道分区的存在。本篇Centos 7 将 lvm 的分割成两个卷组,将 Centos 卷组的大小由49G减少到40G,然后新建一个10G的 cinder-volumes 卷组。
1、首先查看卷组:
vgdisplay

Centos 分割卷组
Centos 分割卷组

2、将 Centos lvm 减少10G空间:
lvreduce -L -10G -n centos /dev/mapper/centos-root

Centos 分割卷组
Centos 分割卷组

现在已经有10G空间剩余了,查看centos 卷组详情:
Centos 分割卷组

从上图获取到LV Path:/dev/centos/root。

3、新建一个Cinder-volumes卷组:
lvcreate -L 10G --name cinder-volumes /dev/centos/root

Centos 分割卷组

报错。。

lvcreate -L +10G -n cinder-volumes centos

Centos 分割卷组

其中最后面的centos为上述vgdisplay想要分割分区的卷组名。

lvdisplay

Centos 分割卷组

df -h

Centos 分割卷组

没有找见刚刚创建的cinder-volumes卷组,而且/dev/mapper/centos-root大小没有改变。
Centos 分割卷组

4、格式化挂在使用逻辑卷:
mkfs.ext4 /dev/centos/cinder-volumes

Centos 分割卷组

5、新建一个挂载目录:
mkdir /mymount
6、挂载
mount /dev/centos/cinder-volumes /mymount/
df -h

Centos 分割卷组
Centos 分割卷组

7、测试使用下逻辑卷组:

Centos 分割卷组

一切正常!

Linux文件查找命令之locate与find

阅读(307)评论(0)

locate与find是经常使用的Linux 命令,刚接触Linux时对这两个命令的使用傻傻的分不清。现在我们来对比一下两个命令到底有哪些区别。
locate

locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了。在一般的 distribution 之中,数据库的建立都被放在 crontab 中自动执行。

1. 命令格式:
Locate [选择参数] [样式]
2.命令功能:

locate命令可以在搜寻数据库时快速找到档案,locate为模糊查找,数据库由updatedb程序来更新,updatedb是由cron daemon周期性建立的,locate命令在搜寻数据库时比由整个由硬盘资料来搜寻资料来得快,但较差劲的是locate所找到的档案若是最近才建立或 刚更名的,可能会找不到,在内定值中,updatedb每天会跑一次,可以由修改crontab来更新设定值。(etc/crontab)

locate指定用在搜寻符合条件的档案,它会去储存档案与目录名称的数据库内,locate查询文件时,会去搜索/var/lib/mlocate/mlocage.db,寻找合乎范本样式条件的档案或目录录,可以使用特殊字元(如”*” 或”?”等)来指定范本样式,如指定范本为kcpa*ner, locate会找出所有起始字串为kcpa且结尾为ner的档案或目录,如名称为kcpartner若目录录名称为kcpa_ner则会列出该目录下包括 子目录在内的所有档案。

locate指令和find找寻档案的功能类似,但locate是透过update程序将硬盘中的所有档案和目录资料先建立一个索引数据库,在 执行loacte时直接找该索引,查询速度会较快,索引数据库一般是由操作系统管理,但也可以直接下达update强迫系统立即修改索引数据库。

3.命令参数:

-e 将排除在寻找的范围之外。

-1 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的权限资料。

-f 将特定的档案系统排除在外,例如我们没有到理要把 proc 档案系统中的档案 放在资料库中。

-q 安静模式,不会显示任何错误讯息。

-n 至多显示 n个输出。

-r 使用正规运算式 做寻找的条件。

-o 指定资料库存的名称。

-d 指定资料库的路径

-h 显示辅助讯息

-V 显示程式的版本讯息

4.使用实例:

实例1:搜索etc目录下所有以sh开头的文件

[root@CentOS7 ~#]locate /etc/sh       
/etc/shadow
/etc/shadow-
/etc/shells
[root@centos7 ~#]locate -r "/etc/\sh "  # 正则,锚定词首
/etc/shadow
/etc/shadow-
/etc/shells
[root@centos7 ~#]

实例2:忽略大小写

[root@centos7 ~#]locate -i ~/d
/root/Desktop/root/Documents/root/Downloads
/root/d1
/root/dd
/var/lib/pcp/pmdas/root/domain.h
[root@centos7 ~#]

实例3:更新数据库

[root@centos7 ~#]locate ~/a
/root/anaconda-ks.cfg
[root@centos7 ~#]updatedb
[root@centos7 ~#]locate ~/a
/root/a.sh
/root/anaconda-ks.cfg
[root@centos7 ~#]
find
1. 主要用途:

find命令是一个实时查找工具,通过遍历指定路径而完成对文件的查找;在使用该命令时,如果不选定参数,则在当前目录下查找子目录与文件并显示之;另外,任何位于参数之前的字符串,都将视为欲查找的目录名。由于是实时遍历查找,find有如下特性:精确实时查找,速度慢可能只搜索用户具备读取和执行权限的目录。

2.find语法:

find [OPTION]... [查找路径] [查找条件] [处理动作]

查找路径:指定具体目标路径,默认为当前目录

查找条件:指定的查找标准,可以是文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件

处理动作:对符合条件的文件做操作,默认输出至屏幕

3.查找条件:
1. 根据文件名和inode查找
2. 根据属主、属组查找
3. 根据文件类型查找
4. 根据逻辑组合条件查找
5. 根据文件大小来查找
6. 根据时间戳来查找
7. 根据权限来查找
4.处理动作:
1. -print: 默认动作,显示至屏幕
2. -ls: 类似于对查找到的文件执行 ls -l 命令
3. -delete: 删除查找到的文件
4. -fls file: 查找到的所有长格式的信息保存至指定文件中
5. -ok COMMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,且都会交互式要求用户确认
6. -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;
7. {}: 用于引用查找至的文件名称自身
8. find 传递查找到的文件至后面指定的命令时,查找到所有符号条件的文件一次性传递给后面的命令
9. 有些命令不能接受过多的参数,此时命令执行可能会失败,用 xargs 来规避此问题
find |xargs COMMAND
5.常用参数:

 

文件名和inode类:

    -name "文件名称": 支持使用glob, *, ?, [], [^]

    -iname "文件名称": 不区分字母大小写

    -inum n: 按inode号查找

    -somefile name: 相同的inode号文件

    -links n: 链接数为n的文件

    -regex "PATTERN": 以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

属主属组类:

    -user USERNAME: 查找属主为指定用户(UID)的文件

    -group GROUPNAME: 查找属组为指定组(GID)的文件

    -uid UserID: 查找属主为指定的UID号的文件

    -gid GroupID: 查找属组为指定的GID号的文件

    -nouser: 查找没有属主的文件

    -nogroup: 查找没有属组的文件

文件类型类:

b      block (buffered) special

c      character (unbuffered) special

d      directory

p      named pipe (FIFO)f      regular file

l      symbolic  link

s      socket

逻辑组合条件类:

组合条件:

与:-a
或:-o
非:-not, !

摩根定律:

(非P) 或(非Q) = 非(P且Q)
(非P) 且 (非Q) = 非(P或Q)

自动草稿
自动草稿

文件大小类:

-size [+|-]#UNIT
    常用单位:k,M,G 
#UNIT: (#-1,#]
    如:5M 表示 (4M,5M]
-#UNIT: [0,#-1]
    如:-5M 表示 [0,5M]
+#UNIT: (#,oo)
    如:+5M 表示 (6M,oo)

关于文件大小类的解释:为什么-size 5M 还是找精确的5M而是表示(4M,5M], 试想文件的大小指什么?是指文件数据的大小还是包括了元数据后的大小,那你找元数据的大小有意义吗?但文件的大小肯定是包含元数据大小的,而我们一般以文件大小找文件时往往考虑的是文件数据的大小;另外,精确查找一定大小的文件意义不大;所以这里的大小会有1个单位的浮动。

时间戳类:

以”天”为单位:
    -atime [+|-]#        
        #: [#,#+1)
        +#: [#+1,oo)        
        -#: [0,#)
    -mtime    
    -ctime

以“分钟”为单位:
    -amin    
    -mmin    
    -cmin

自动草稿

关于时间戳类的解释:为什么-atime 3 表示的是 [3,4),这个就很好解释了,我们这儿所说的时间是指时间段而非时刻,一“天”与一“分钟”都是指一个时间段,只有[3,4)这个半闭半开的区间才能完整地表示第三天。

权限类:

-perm [/|-]MODE
    MODE: 精确匹配权限
    /MODE: 任何一类(u,g,o)对象的权限中只要能一位匹配即可,属于或关系。以前用'+',CentOS 7以'/'替代之
    -MODE: 每一类对象都必须同时拥有指定权限,属于与关系 
    0:表示不关注

示例:

find -perm 644 表示要严格匹配644的文件
find -perm +222 表示u,g,o任何一类用户有写权限即匹配
find -perm -222 表示仅严格匹配写权限,即每个用户必须要有写权限
find -perm -002 表示仅严格匹配other用户的写权限
6.使用示例:

实例1:将配置文件备份到指定目录下并添加扩展名.org

[root@localhost ~]# find . -name "*.conf" -exec cp -r {} /testdir/{}.org \; 
[root@localhost ~]# cd /testdir/
[root@localhost testdir]# ls
a.conf.org  b.conf.org
[root@localhost testdir]#

实例2:.提示删除存在时间超过3天以上的属主为young的临时文件

[root@localhost ~]# find /tmp -ctime +3 -user young -exec rm -fr {} \;
[root@localhost ~]#

实例3:在主目录中查找可被其它用户写入的文件

[root@localhost ~]# find ~ -perm -002
/root/num
[root@localhost ~]# find ~ -perm -002 -exec chmod o-w {} \;
[root@localhost ~]# ll num
--w--w---- 1 root root 35 Jan 21 05:55 num

实例4:查找/var目录下属主为root,且属组为mail的所有文件

    [root@localhost ~]# find /var -user root  -group mail -ls #默认关系就是与
1179652    4 drwxrwxr-x   2 root     mail         4096 Jan 23 11:04 /var/spool/mail

实例5:查找/var目录下不属于root、lp、gdm的所有文件

[root@localhost ~]# find /var ! -user root ! -user lp ! -user gdm

实例6:查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件

    [root@localhost ~]# find /var/ -mtime -7 ! -user root ! -user postfix -ls
1179676    4 drwx------   3 daemon   daemon       4096 Jan 23 11:04 /var/spool/at
524399    4 drwx------   2 nginx    nginx        4096 Jan 23 03:16 /var/log/nginx
524413    0 -rw-r--r--   1 nginx    root            0 Jan 23 03:16 /var/log/nginx/access.log
524391    0 -rw-r--r--   1 nginx    root            0 Jan 21 03:44 /var/log/nginx/error.log
132174    4 drwx------   3 nginx    nginx        4096 Jan 21 03:44 /var/lib/nginx
132175    4 drwx------   7 nginx    nginx        4096 Jan 21 03:44 /var/lib/nginx/tmp
132173    4 drwx------   2 nginx    root         4096 Jan 21 03:44 /var/lib/nginx/tmp/client_body
132219    4 drwx------   2 nginx    root         4096 Jan 21 03:44 /var/lib/nginx/tmp/proxy
132221    4 drwx------   2 nginx    root         4096 Jan 21 03:44 /var/lib/nginx/tmp/uwsgi
132222    4 drwx------   2 nginx    root         4096 Jan 21 03:44 /var/lib/nginx/tmp/scgi
132220    4 drwx------   2 nginx    root         4096 Jan 21 03:44 /var/lib/nginx/tmp/fastcgi

实例7:查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件

[root@bash ~]# find / -nouser -o -nogroup -a -atime -7

实例8:查找/etc目录下大于1M且类型为普通文件的所有文件

[root@bash ~]# find /etc/ -size +1M -type f
/etc/selinux/targeted/policy/policy.29
/etc/udev/hwdb.bin

实例9:查找/etc目录下所有用户都没有写权限的文件

[root@bash ~]# find /etc/ ! -perm /222
/etc/pki/ca-trust/extracted/java/cacerts
/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
/etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem
/etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
/etc/lvm/profile/cache-mq.profile
/etc/lvm/profile/cache-smq.profile
/etc/lvm/profile/command_profile_template.profile
/etc/lvm/profile/metadata_profile_template.profile
/etc/lvm/profile/thin-generic.profile
/etc/lvm/profile/thin-performance.profile
/etc/openldap/certs/password
/etc/gshadow
/etc/dbus-1/system.d/cups.conf
/etc/shadow
/etc/gshadow-
/etc/ld.so.conf.d/kernel-3.10.0-327.el7.x86_64.conf
/etc/shadow-
/etc/udev/hwdb.bin
/etc/machine-id
/etc/pam.d/cups
/etc/sudoers

实例10:查找/etc目录下至少有一类用户没有执行权限的文件

[root@bash ~]# find /etc/ ! -perm -111 # 至少有一类用户没有就是所有用户都没有

实例11:.查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件

[root@bash ~]# find /etc/init.d -perm -113
/etc/init.d

或者

[root@bash ~]# find /etc/init.d -perm -111 -perm -002
/etc/init.d

实例12:摩根定律找出/tmp目录下,属主不是root,且文件名不以f开头的文件

[root@centos7 ~]#find /tmp \( -not -user root -a -not -name 'f*' \) -ls
即
[root@centos7 ~]#find /tmp -not \( -user root -o -name 'f*' \) -ls

实例13:查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件

[root@bash ~]# find /etc -path '/etc/sane.d' -prune -o -name '*.conf'

实例14:匹配文件路径或文件

[root@bash ~]# find /usr/ -path '*local'
/usr/bin/abrt-action-analyze-ccpp-local
/usr/share/doc/postfix-2.10.1/examples/qmail-local
/usr/share/aclocal
/usr/libexec/postfix/local
/usr/local

实例15:基于正则表达式匹配文件路径

[root@bash ~]# find . -regex ".*txt$"              
./.mozilla/firefox/4dqu966q.default/revocations.txt
./vimrc/spf13-vim/LICENSE.txt
./a.txt

什么是Yum,常用命令有哪些?它与rpm有什么区别?

阅读(228)评论(0)

Yum(全称为 Yellow dogUpdater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。

RPM的缺点:RPM无法解决软件包的依赖关系。

Yum是rpm的前端程序,yum主要目的是设计用来自动解决rpm的依赖关系。

yum和rpm安装方式本质都是基于RPM包来安装软件。

yum源(repo):本地yum源是将yum用到的安装包放在局域网内,方便包管理,这样不用连接外网即可在语句网内的机器上安装软件包。具体的配置文件在/etc/yum.repos.d/下。虚拟机镜像制作过程就会去配置repo,即yum源。

2、常用命令

yum list :查询所有可安装软件,后可以加上你想查找的软件包的名字

  • yum list *mysql* :列出所有包名称中包含mysql的
  • 或yum list | grep mysql
  • yum search mysql

yum list installed :列出所有已安装的软件包

yum install java-1.8.0-openjdk-demo :安装java-1.8.0-openjdk-demo

yum -y install httpd :也是安装。如果不加 -y他会问你要不要安装。如果你想自己来控制有些包是否安装,这里不要加-y,如果你想自动安装,不进行交互,这里加入-y。

yum remove httpd :卸载httpd

yum info installed :列出所有已安裝的软件包信息 ,没什么意义

yum search 关键字(mysql):搜索服务器上所有和关键字相关的包。和上面的yum list | grep mysql 的作用一样
yum check-update:检查可更新的rpm包
yum update:升级系统中所有的软件包,包括Linux内核,慎用!
yum update kernel kernel-source:更新指定的rpm包,如更新kernel和kernel source

Linux中yum与rpm区别

什么是Yum,常用命令有哪些?它与rpm有什么区别?

3、如何查看yum源里面的包是否是自己想要的版本?

yum info 包名
如:yum info openssl-devel.x86_64
什么是Yum,常用命令有哪些?它与rpm有什么区别?

Linux中优秀Wifi渗透工具TOP

阅读(245)评论(0)

1. Aircrack-ng

Aircrack是目前WEP/WPA/WPA2破解领域中最热门的工具,Aircrack-ng套件包含的工具能够捕捉数据包和握手包,生成通信数据,或进行暴力破解攻击以及字典攻击。Aircrack-ng是一款多合一整合套件,该套件大致包含下列几种工具:-Aircrack-ng:无线密码破解 -Aireplay:生成网络数据,去客户端验证 -Airodump-ng:数据包捕捉 -Airbase-ng:配置伪造的接入点Aircrack-ng可以在Linux、Windows和macOS上运行,并且KaliLinux默认自带了该套件。如果你准备使用这款工具,那么你还需要确保自己的无线网卡具备数据包注入功能。

Linux中优秀Wifi渗透工具TOP
添加图片注释,不超过 140 字(可选)

2. Reaver

排名第二的是Reaver,Reaver也是目前流行的无线网络攻击工具,它主要针对的是WPS漏洞。Reaver会对WiFi保护设置(WPS)的注册PIN码进行暴力破解攻击,并尝试恢复出WPA/WPA2密码。由于很多路由器制造商和ISP会默认开启WPS功能,因此市面上的很多路由器都无法抵御这种攻击。在使用Reaver时,无线路由器的信号一定要足够强。平均来说,Reaver可以在4-10个小时之内破解目标路由器的密码,具体破解时长还要根据接入点类型、信号强度和PIN码本身来判断。从概率论和统计学的角度来看,你有50%的机会只需要花一半时间就能够破解出目标路由器的PIN码。

Linux中优秀Wifi渗透工具TOP
添加图片注释,不超过 140 字(可选)

3. Pixiewps

PixieWPS是Kali Linux新加入的一款专门针对WPS漏洞的渗透工具。PixieWPS使用C语言开发,可以用来离线爆破WPS PIN码。它所使用的技术名叫pixie dust攻击,需要注意的是,PixieWPS需要一个修改版的Reaver或Wifite才能正常运行。由于这款工具在短时间内就变得非常受欢迎了,因此它在我们的排行榜上排到了第三名。

4. Wifite

Wifite是一款能够攻击多种无线加密方式(WEP/WPA/WPA2和WPS)的自动化工具, Wifite在运行之前需要提供几个参数,而Wifite将会自动帮我们完成所有的任务。它可以捕获WPA握手包,自动化去客户端验证,进行MAC地址欺骗,以及破解WiFi密码。

Linux中优秀Wifi渗透工具TOP
添加图片注释,不超过 140 字(可选)

5. Wireshark

Wireshark算得上是目前最好的网络协议分析工具了,在Wireshark的帮助下,你能够深入地分析一个网络,并获取到尽可能多的信息。Wireshark能够实时捕获网络数据包、对上百种协议进行深入分析、以及浏览和过滤数据包。需要注意的是,Wireshark是一款跨平台工具。KaliLinux默认自带了Wireshark,不过Windows和macOS用户都可以使用它。如果你想使用Wireshark的某些特殊功能,那么你需要一款支持监听模式的WiFi适配器。

Linux中优秀Wifi渗透工具TOP
添加图片注释,不超过 140 字(可选)

6. oclHashcat

oclHashcat并不是一款专用的WiFi入侵工具,而且它也不是Kali Linux的自带工具,但它能够对捕捉到的握手包进行高速爆破攻击和字典攻击(使用GPU跑字典)。在使用了Aircrack-ng或其他工具捕捉到了握手包之后,我们就可以使用GPU和oclHashcat来破解WiFi密码了,而且GPU+oclHashcat的破解速度要比CPU+Aircrack-ng的速度快得多。oclHashcat适用于Windows和Linux,并且还有专门针对AMD和Nvidia显卡的版本。

Linux中优秀Wifi渗透工具TOP
添加图片注释,不超过 140 字(可选)

7. Fern Wifi Cracker

Fern Wifi Cracker是一款针对无线网络的安全审计工具和攻击工具,该工具采用Python编写,它也是这十大无线攻击工具中唯一一款具有图形用户界面的工具。Fern Wifi Cracker能够破解WEP、WPA和WPS密钥,并且还包含有能够执行MiTM(中间人攻击)攻击的组件。

8. Wash

当攻击者在对WPS PIN码进行暴力破解攻击时,很多接入点会将自己锁定以保证路由器的安全性。而Wash就是一款能够确定目标接入点是否开启了WPS的工具,在使用Reaver进行了多次尝试之后,你可以用Wash来检查接入点是否锁定了WPS。

Linux中优秀Wifi渗透工具TOP
添加图片注释,不超过 140 字(可选)

9. Crunch

Crunch可以用来生成自定义字典,而生成的字典可以用于字典攻击。由于字典攻击的成功率依赖于所使用字典的质量,因此我们总是不可避免地要根据自己的需要来生成字典。

Linux中优秀Wifi渗透工具TOP
添加图片注释,不超过 140 字(可选)

10. Macchanger

实际上,Macchanger是一款能够将你设备的MAC地址改成随机值的小工具,当然了,你也可以将其修改为你想要的数据。为了避免目标设备采用了MAC地址过滤,所以对于WiFi攻击来说,MAC地址修改就显得非常重要了。

Linux中优秀Wifi渗透工具TOP
添加图片注释,不超过 140 字(可选)

总结

希望本文总结出的十大热门WiFi攻击工具能够给大家提供一定的帮助,就目前的情况来看,无线网络的安全性仍然有很大的提升空间,而这种安全性的提升需要整个社区贡献自己的力量。

Ubuntu上Grafana 监控 Docker的技巧

阅读(181)评论(0)

Grafana 是一个有着丰富指标的开源控制面板。在可视化大规模测量数据的时候是非常有用的。根据不同的指标数据,它提供了一个强大、优雅的来创建、分享和浏览数据的方式。

它提供了丰富多样、灵活的图形选项。此外,针对数据源,它支持许多不同的存储后端。每个数据源都有针对特定数据源的特性和功能所定制的查询编辑器。Grafana 提供了对下述数据源的正式支持:Graphite、InfluxDB、OpenTSDB、 Prometheus、Elasticsearch 和 Cloudwatch。

每个数据源的查询语言和能力显然是不同的,你可以将来自多个数据源的数据混合到一个单一的仪表盘上,但每个面板被绑定到属于一个特定组织的特定数据源上。它支持验证登录和基于角色的访问控制方案。它是作为一个独立软件部署,使用 Go 和 JavaScript 编写的。

在这篇文章,我将讲解如何在 Ubuntu 16.04 上安装 Grafana 并使用这个软件配置 Docker 监控。

先决条件
  • 安装好 Docker 的服务器
安装 Grafana

我们可以在 Docker 中构建我们的 Grafana。 有一个官方提供的 Grafana Docker 镜像。请运行下述命令来构建Grafana 容器。

root@ubuntu:~# docker run -i -p 3000:3000 grafana/grafana

Unable to find image 'grafana/grafana:latest' locally
latest: Pulling from grafana/grafana
5c90d4a2d1a8: Pull complete
b1a9a0b6158e: Pull complete
acb23b0d58de: Pull complete
Digest: sha256:34ca2f9c7986cb2d115eea373083f7150a2b9b753210546d14477e2276074ae1
Status: Downloaded newer image for grafana/grafana:latest
t=2016-07-27T15:20:19+0000 lvl=info msg="Starting Grafana" logger=main version=3.1.0 commit=v3.1.0 compiled=2016-07-12T06:42:28+0000
t=2016-07-27T15:20:19+0000 lvl=info msg="Config loaded from" logger=settings file=/usr/share/grafana/conf/defaults.ini
t=2016-07-27T15:20:19+0000 lvl=info msg="Config loaded from" logger=settings file=/etc/grafana/grafana.ini
t=2016-07-27T15:20:19+0000 lvl=info msg="Config overriden from command line" logger=settings arg="default.paths.data=/var/lib/grafana"
t=2016-07-27T15:20:19+0000 lvl=info msg="Config overriden from command line" logger=settings arg="default.paths.logs=/var/log/grafana"
t=2016-07-27T15:20:19+0000 lvl=info msg="Config overriden from command line" logger=settings arg="default.paths.plugins=/var/lib/grafana/plugins"
t=2016-07-27T15:20:19+0000 lvl=info msg="Path Home" logger=settings path=/usr/share/grafana
t=2016-07-27T15:20:19+0000 lvl=info msg="Path Data" logger=settings path=/var/lib/grafana
t=2016-07-27T15:20:19+0000 lvl=info msg="Path Logs" logger=settings path=/var/log/grafana
t=2016-07-27T15:20:19+0000 lvl=info msg="Path Plugins" logger=settings path=/var/lib/grafana/plugins
t=2016-07-27T15:20:19+0000 lvl=info msg="Initializing DB" logger=sqlstore dbtype=sqlite3

t=2016-07-27T15:20:20+0000 lvl=info msg="Executing migration" logger=migrator id="create playlist table v2"
t=2016-07-27T15:20:20+0000 lvl=info msg="Executing migration" logger=migrator id="create playlist item table v2"
t=2016-07-27T15:20:20+0000 lvl=info msg="Executing migration" logger=migrator id="drop preferences table v2"
t=2016-07-27T15:20:20+0000 lvl=info msg="Executing migration" logger=migrator id="drop preferences table v3"
t=2016-07-27T15:20:20+0000 lvl=info msg="Executing migration" logger=migrator id="create preferences table v3"
t=2016-07-27T15:20:20+0000 lvl=info msg="Created default admin user: [admin]"
t=2016-07-27T15:20:20+0000 lvl=info msg="Starting plugin search" logger=plugins
t=2016-07-27T15:20:20+0000 lvl=info msg="Server Listening" logger=server address=0.0.0.0:3000 protocol=http subUrl=

我们可以通过运行此命令确认 Grafana 容器的工作状态 "docker ps -a"或通过这个URL访问 http://Docker IP:3000。

所有的 Grafana 配置设置都使用环境变量定义,在使用容器技术时这个是非常有用的。Grafana 配置文件路径为 /etc/grafana/grafana.ini。

理解配置项

Grafana 可以在它的 ini 配置文件中指定几个配置选项,或可以使用前面提到的环境变量来指定。

配置文件位置

通常配置文件路径:

  • 默认配置文件路径 : $WORKING_DIR/conf/defaults.ini
  • 自定义配置文件路径 : $WORKING_DIR/conf/custom.ini

PS:当你使用 deb、rpm 或 docker 镜像安装 Grafana 时,你的配置文件在/etc/grafana/grafana.ini。

理解配置变量

现在我们看一些配置文件中的变量:

  • instance_name:这是 Grafana 服务器实例的名字。默认值从 ${HOSTNAME} 获取,其值是环境变量HOSTNAME,如果该变量为空或不存在,Grafana 将会尝试使用系统调用来获取机器名。
  • [paths]>:这些路径通常都是在 init.d 脚本或 systemd service 文件中通过命令行指定。
    • data:这个是 Grafana 存储 sqlite3 数据库(如果使用)、基于文件的会话(如果使用),和其他数据的路径。
    • logs:这个是 Grafana 存储日志的路径。
  • [server]
    • http_addr:应用监听的 IP 地址,如果为空,则监听所有的接口。
    • http_port:应用监听的端口,默认是 3000,你可以使用下面的命令将你的 80 端口重定向到 3000 端口:$iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
    • root_url : 这个 URL 用于从浏览器访问 Grafana 。
    • cert_file : 证书文件的路径(如果协议是 HTTPS)。
    • cert_key : 证书密钥文件的路径(如果协议是 HTTPS)。
  • [database]:Grafana 使用数据库来存储用户和仪表盘以及其他信息,默认配置为使用内嵌在 Grafana 主二进制文件中的 SQLite3。
    • type:你可以根据你的需求选择 MySQL、Postgres、SQLite3。
    • path:仅用于选择 SQLite3 数据库时,这个是数据库所存储的路径。
    • host:仅适用 MySQL 或者 Postgres。它包括 IP 地址或主机名以及端口。例如,Grafana 和 MySQL 运行在同一台主机上设置如: host = 127.0.0.1:3306。
    • name:Grafana 数据库的名称,把它设置为 Grafana 或其它名称。
    • user:数据库用户(不适用于 SQLite3)。
    • password:数据库用户密码(不适用于 SQLite3)。
    • ssl_mode:对于 Postgres,使用 disable,require,或 verify-full等值。对于 MySQL,使用 true,false,或skip-verify。
    • ca_cert_path:(只适用于 MySQL)CA 证书文件路径,在多数 Linux 系统中,证书可以在 /etc/ssl/certs 找到。
    • client_key_path:(只适用于 MySQL)客户端密钥的路径,只在服务端需要用户端验证时使用。
    • client_cert_path:(只适用于 MySQL)客户端证书的路径,只在服务端需要用户端验证时使用。
    • server_cert_name:(只适用于 MySQL)MySQL 服务端使用的证书的通用名称字段。如果 ssl_mode 设置为 skip-verify时可以不设置。
  • [security]
    • admin_user:这个是 Grafana 默认的管理员用户的用户名,默认设置为 admin。
    • admin_password:这个是 Grafana 默认的管理员用户的密码,在第一次运行时设置,默认为 admin。
    • login_remember_days:保持登录/记住我的持续天数。
    • secret_key:用于保持登录/记住我的 cookies 的签名。
设置监控的重要组件

我们可以使用下面的组件来创建我们的 Docker 监控系统。

  • cAdvisor:它被称为 Container Advisor。它给用户提供了一个资源利用和性能特征的解读。它会收集、聚合、处理、导出运行中的容器的信息。你可以通过这个文档了解更多。
  • InfluxDB:这是一个包含了时间序列、度量和分析数据库。我们使用这个数据源来设置我们的监控。cAdvisor 只展示实时信息,并不保存这些度量信息。Influx Db 帮助保存 cAdvisor 提供的监控数据,以展示非某一时段的数据。
  • Grafana Dashboard:它可以帮助我们在视觉上整合所有的信息。这个强大的仪表盘使我们能够针对 InfluxDB 数据存储进行查询并将他们放在一个布局合理好看的图表中。
Docker 监控的安装

我们需要一步一步的在我们的 Docker 系统中安装以下每一个组件:

安装 InfluxDB

我们可以使用这个命令来拉取 InfluxDB 镜像,并部署了 influxDB 容器。

root@ubuntu:~# docker run -d -p 8083:8083 -p 8086:8086 --expose 8090 --expose 8099 -e PRE_CREATE_DB=cadvisor --name influxsrv tutum/influxdb:0.8.8
Unable to find image 'tutum/influxdb:0.8.8' locally
0.8.8: Pulling from tutum/influxdb
a3ed95caeb02: Already exists
23efb549476f: Already exists
aa2f8df21433: Already exists
ef072d3c9b41: Already exists
c9f371853f28: Already exists
a248b0871c3c: Already exists
749db6d368d0: Already exists
7d7c7d923e63: Pull complete
e47cc7808961: Pull complete
1743b6eeb23f: Pull complete
Digest: sha256:8494b31289b4dbc1d5b444e344ab1dda3e18b07f80517c3f9aae7d18133c0c42
Status: Downloaded newer image for tutum/influxdb:0.8.8
d3b6f7789e0d1d01fa4e0aacdb636c221421107d1df96808ecbe8e241ceb1823

    -p 8083:8083 : user interface, log in with username-admin, pass-admin
    -p 8086:8086 : interaction with other application
    --name influxsrv : container have name influxsrv, use to cAdvisor link it.

你可以测试 InfluxDB 是否安装好,通过访问这个 URL http://你的 IP 地址:8083,用户名和密码都是 ”root“。

自动草稿

我们可以在这个界面上创建我们所需的数据库。

自动草稿

安装 cAdvisor

我们的下一个步骤是安装 cAdvisor 容器,并将其链接到 InfluxDB 容器。你可以使用此命令来创建它。

root@ubuntu:~# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --link influxsrv:influxsrv --name=cadvisor google/cadvisor:latest -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
Unable to find image 'google/cadvisor:latest' locally
latest: Pulling from google/cadvisor
09d0220f4043: Pull complete
151807d34af9: Pull complete
14cd28dce332: Pull complete
Digest: sha256:8364c7ab7f56a087b757a304f9376c3527c8c60c848f82b66dd728980222bd2f
Status: Downloaded newer image for google/cadvisor:latest
3bfdf7fdc83872485acb06666a686719983a1172ac49895cd2a260deb1cdde29
root@ubuntu:~#

    --publish=8080:8080 : user interface
    --link=influxsrv:influxsrv: link to container influxsrv
    -storage_driver=influxdb: set the storage driver as InfluxDB
    Specify what InfluxDB instance to push data to:
    -storage_driver_host=influxsrv:8086: The ip:port of the database. Default is ‘localhost:8086’
    -storage_driver_db=cadvisor: database name. Uses db ‘cadvisor’ by default

你可以通过访问这个地址来测试安装 cAdvisor 是否正常 http://你的 IP 地址:8080。 这将为你的 Docker 主机和容器提供统计信息。

自动草稿

安装 Grafana 控制面板

最后,我们需要安装 Grafana 仪表板并连接到 InfluxDB,你可以执行下面的命令来设置它。

root@ubuntu:~# docker run -d -p 3000:3000 -e INFLUXDB_HOST=localhost -e INFLUXDB_PORT=8086 -e INFLUXDB_NAME=cadvisor -e INFLUXDB_USER=root -e INFLUXDB_PASS=root --link influxsrv:influxsrv --name grafana grafana/grafana
f3b7598529202b110e4e6b998dca6b6e60e8608d75dcfe0d2b09ae408f43684a

现在我们可以登录 Grafana 来配置数据源. 访问 http://你的 IP 地址:3000 或http://你的 IP 地址(如果你在前面做了端口映射的话):

  • 用户名 - admin
  • 密码 - admin

一旦我们安装好了 Grafana,我们可以连接 InfluxDB。登录到仪表盘并且点击面板左上方角落的 Grafana 图标(那个火球)。点击数据源来配置。

自动草稿

现在你可以添加新的图形到我们默认的数据源 InfluxDB。

自动草稿

我们可以通过在测量页面编辑和调整我们的查询以调整我们的图形。

自动草稿

自动草稿

关于 Docker 监控,你可用从此了解更多信息。 感谢你的阅读。我希望你可以留下有价值的建议和评论。希望你有个美好的一天。

CentOS显示内存与实际硬件内存大小不一致

阅读(283)评论(0)

购买的服务器写的内存是 2GB,但是从宝塔看只用 1800 多 MB...

先用free看一下:

  1. total used free shared buff/cache available
  2. Mem: 1882000 422140 682784 776 777076 1283632
  3. Swap: 1049596 40448 1009148
  4.  

查看内核预留内存:dmesg | grep -i memory

  1. [ 0.000000] Base memory trampoline at [ffff9eb200099000] 99000 size 24576
  2. [ 0.000000] Reserving 161MB of memory at 688MB for crashkernel (System RAM: 2047MB)
  3. [ 0.000000] Early memory node ranges
  4. [ 0.000000] PM: Registered nosave memory: [mem 0x0009f000-0x0009ffff]
  5. [ 0.000000] PM: Registered nosave memory: [mem 0x000a0000-0x000effff]
  6. [ 0.000000] PM: Registered nosave memory: [mem 0x000f0000-0x000fffff]
  7. [ 0.000000] Memory: 1858740k/2097008k available (7788k kernel code, 392k absent, 237876k reserved, 5954k data, 1984k init)
  8. [ 0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups
  9. [ 0.331747] Initializing cgroup subsys memory
  10. [ 0.475802] x86/mm: Memory block size: 128MB
  11. [ 1.231809] Freeing initrd memory: 20320k freed
  12. [ 1.349328] Non-volatile memory driver v1.3
  13. [ 1.352113] crash memory driver: version 1.1
  14. [ 1.498955] Freeing unused kernel memory: 1984k freed
  15. [ 1.502904] Freeing unused kernel memory: 392k freed
  16. [ 1.505199] Freeing unused kernel memory: 536k freed
  17. [ 2.262990] [TTM] Zone kernel: Available graphics memory: 941000 kiB

crashkernel保留了161MB的内存,属于kdump服务.

注意:kdump 是在系统崩溃、死锁或者死机的时候用来转储内存运行参数的一个工具和服务。打个比方,如果系统一旦崩溃那么正常的内核就没有办法工作了,在这个时候将由 kdump 产生一个用于 capture 当前运行信息的内核,该内核会将此时的内存中的所有运行状态和数据信息收集到一个 dump core 文件中以便于工程师分析崩溃原因,一旦内存信息收集完成,系统将自动重启。

停止并关闭kdump

  1. systemctl stop kdump
  2. systemctl disable kdump

修改grub文件(宝塔直接在线改就好)

  1. vi /etc/default/grub

crashkernel=auto改为crashkernel=0
如:

  1. GRUB_TIMEOUT=5#请无视本行
  2. GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"#请无视本行
  3. GRUB_DEFAULT=saved#请无视本行
  4. GRUB_DISABLE_SUBMENU=true#请无视本行
  5. GRUB_TERMINAL_OUTPUT="console"#请无视本行
  6. GRUB_CMDLINE_LINUX="crashkernel=0 resume=UUID=XXXX-XXXX-XXXX-XXXX-XXXX" #改动此行
  7. GRUB_DISABLE_RECOVERY="true"#请无视本行
  8. GRUB_ENABLE_BLSCFG=true#请无视本行

更新grub配置文件、重启系统

  1. grub2-mkconfig -o /boot/grub2/grub.cfg
  2. reboot

你就会发现内存变多了..

Go集成GraphQL

阅读(306)评论(0)

# 使用go mod管理依赖
go mod init 项目名称

# 获取gqlgen依赖
go get github.com/99designs/gqlgen

我创建了一个 main 方法demo2-main.go

package main

import "github.com/99designs/gqlgen/cmd"

/*
go run demo2-main.go init
 */
func main() {
    cmd.Execute()
}

然后直接在此 main 方法的目录下执行:

go run demo2-main.go init

之后就会生成这些文件:

自动草稿

文件说明:

├── go.mod
├── go.sum
├── gqlgen.yml               - The gqlgen config file, knobs for controlling the generated code.
├── graph
│   ├── generated            - A package that only contains the generated runtime
│   │   └── generated.go
│   ├── model                - A package for all your graph models, generated or otherwise
│   │   └── models_gen.go
│   ├── resolver.go          - The root graph resolver type. This file wont get regenerated
│   ├── schema.graphqls      - Some schema. You can split the schema into as many graphql files as you like
│   └── schema.resolvers.go  - the resolver implementation for schema.graphql
└── server.go                - The entry point to your app. Customize it however you see fit

上面那些是 init 之后自动生成的,所以需要创建我自己的。

自动草稿

# pojo
type Student {
  id: ID!
  name: String!
  sex: String
  age: Int
  birthDate: String
  provinceCity: String
}

input NewStudent {
  id: ID!
  name: String!
  sex: String
  age: Int
  birthDate: String
  provinceCity: String
}

# 插入
type Mutation {
  createStudent(input: NewStudent!): Student!
}

# 查询
type Query {
  students: [Student!]!
}

自动草稿

// Code generated by github.com/99designs/gqlgen, DO NOT EDIT.

package model

type NewStudent struct {
    ID           string  `json:"id"`
    Name         string  `json:"name"`
    Sex          *string `json:"sex"`
    Age          *int    `json:"age"`
    BirthDate    *string `json:"birthDate"`
    ProvinceCity *string `json:"provinceCity"`
}

type Student struct {
    ID           string  `json:"id"`
    Name         string  `json:"name"`
    Sex          *string `json:"sex"`
    Age          *int    `json:"age"`
    BirthDate    *string `json:"birthDate"`
    ProvinceCity *string `json:"provinceCity"`
}

自动草稿

package graph

import "study-golang/gqlgen/demo2/graph/model"

// This file will not be regenerated automatically.
//
// It serves as dependency injection for your app, add any dependencies you require here.

//type Resolver struct{}

type Resolver struct{
    students []*model.Student
}

完成这些操作之后,初始化我们自定义的 schema,执行:

go run demo2-main.go init

然后会发现 generated 文件夹下的generated.go被重新初始化为我们自定义的 schema 的类型的了,不仅如此,所有的 schema 类型都从 todo 修改为我定义的 schema 类型了。

自动草稿

为了演示,这里简便一点,只写了插入和查询的操作:

自动草稿

func (r *mutationResolver) CreateStudent(ctx context.Context, input model.NewStudent) (*model.Student, error) {
    //panic(fmt.Errorf("not implemented"))
    student := &model.Student{
        ID: input.ID,
        Name: input.Name,
        Sex: input.Sex,
        Age: input.Age,
        BirthDate: input.BirthDate,
        ProvinceCity: input.ProvinceCity,
    }
    r.students = append(r.students, student)
    return student, nil
}

func (r *queryResolver) Students(ctx context.Context) ([]*model.Student, error) {
    //panic(fmt.Errorf("not implemented"))
    return r.students, nil
}

最后启动server.go,访问:http://localhost:8080

createStudent

自动草稿

完整的:

自动草稿

逗号其实也可以不加~

# 执行插入操作
mutation createStudent {
  createStudent(input:{
    id:3,
    name:"lzhpo03",
    sex:"男",
    age:1,
    birthDate:"2019-06-16",
    provinceCity:"江西赣州"}
  )
  {
    id
    name
    sex
    age
    birthDate
    provinceCity
  }
}

我插入 3 条测试数据,然后在下面查询。

自动草稿

# 执行查询操作,需要什么字段,就写什么字段,前提是字段有的情况下
query findStudents {
  students {
    id
    name
    sex
    age
    birthDate
    provinceCity
  }
}

登录

忘记密码 ?