Pick:一款 Linux 上的命令行模糊搜索工具

今天,我们要讲的是一款有趣的命令行工具,名叫 Pick。它允许用户通过 ncurses(3X) 界面来从一系列选项中进行选择,而且还支持模糊搜索的功能。当你想要选择某个名字中包含非英文字符的目录或文件时,这款工具就很有用了。你根本都无需学习如何输入非英文字符。借助 Pick,你可以很方便地进行搜索、选择,然后浏览该文件或进入该目录。你甚至无需输入任何字符来过滤文件/目录。这很适合那些有大量目录和文件的人来用。

安装 Pick

对 Arch Linux 及其衍生品来说,Pick 放在 AUR 中。因此 Arch 用户可以使用类似 Pacaur,Packer,以及 Yaourt 等 AUR 辅助工具来安装它。

pacaur -S pick

或者,

packer -S pick

或者,

yaourt -S pick

Debian,Ubuntu,Linux Mint 用户则可以通过运行下面命令来安装 Pick。

sudo apt-get install pick

其他的发行版则可以从这里下载最新的安装包,然后按照下面的步骤来安装。在写本指南时,其最新版为 1.9.0。

wget https://github.com/calleerlandsson/pick/releases/download/v1.9.0/pick-1.9.0.tar.gz
tar -zxvf pick-1.9.0.tar.gz
cd pick-1.9.0/

使用下面命令进行配置:

./configure

最后,构建并安装 Pick:

make
sudo make install

用法

通过将它与其他命令集成能够大幅简化你的工作。我这里会给出一些例子,让你理解它是怎么工作的。

让们先创建一堆目录。

mkdir -p abcd/efgh/ijkl/mnop/qrst/uvwx/yz/

现在,你想进入目录 /ijkl/。你有两种选择。可以使用 cd 命令:

cd abcd/efgh/ijkl/

或者,创建一个快捷方式 或者说别名指向这个目录,这样你可以迅速进入该目录。

但,使用 pick 命令则问题变得简单的多。看下面这个例子。

cd $(find . -type d | pick)

这个命令会列出当前工作目录下的所有目录及其子目录,你可以用上下箭头选择你想进入的目录,然后按下回车就行了。

像这样:

未分类

而且,它还会根据你输入的内容过滤目录和文件。比如,当我输入 “or” 时会显示如下结果。

未分类

这只是一个例子。你也可以将 pick 命令跟其他命令一起混用。

这是另一个例子。

find -type f | pick | xargs less

该命令让你选择当前目录中的某个文件并用 less 来查看它。

未分类

还想看其他例子?还有呢。下面命令让你选择当前目录下的文件或目录,并将之迁移到其他地方去,比如这里我们迁移到 /home/sk/ostechnix。

mv "$(find . -maxdepth 1 |pick)" /home/sk/ostechnix/

未分类

通过上下按钮选择要迁移的文件,然后按下回车就会把它迁移到 /home/sk/ostechnix/ 目录中的。

未分类

从上面的结果中可以看到,我把一个名叫 abcd 的目录移动到 ostechnix 目录中了。

使用方式是无限的。甚至 Vim 编辑器上还有一个叫做 pick.vim 的插件让你在 Vim 中选择更加方便。

要查看详细信息,请参阅它的 man 页。

man pick

我们的讲解至此就结束了。希望这款工具能给你们带来帮助。如果你觉得我们的指南有用的话,请将它分享到您的社交网络上,并向大家推荐我们。

Linux使用crontab运行Java程序定时任务小记

Linux中,crontab的功能是十分强大的,能够方便的调度程序的运行,甚至在很多时候能够替代程序中的定时任务。

它的命令格式和主要参数如下:

命令格式
crontab [-u user] [ -e | -l | -r ]

命令参数
-u user:用来设定某个用户的crontab服务;
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,>crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i:在删除用户的crontab文件时给确认提示。

图片化格式说明:

未分类

本次因为需要推送一批数据,简单起见用Java写了个jar程序,用命令行java -jar push.jar调用完事,但是数据是每天都要推送的,难道每天都要手工去执行一下命令行?这显然不切实际。

为了这么个小程序开发个定时任务也嫌麻烦,后来就想到了Linux系统的crontab,但是在使用过程中还是碰到了几个问题,在此记录一下。

第一步,编写start_pust.sh文件,内容简单如下:

#!/bin/bash
java -jar /home/liyd/push.jar

为了避免路径问题引起的错误,这里使用了绝对路径来保证执行正确。

第二步,编写crontab.txt文件,简单的一行指定执行时间:

34 1 * * * /home/liyd/start_push.sh

每天的1点34分调用push.jar。

最后指定crontab运行:

crontab crontab.txt

到这里设置就都完成了,按照我们的预想每天的1点34分就会执行pust.jar推送数据。

可是事情往往不会按我们预想的发展,我们发现程序根本就没有执行,这是为什么呢?因为在这之前我用命令行直接./start_push.sh都是可以的呀。

只能查查资料了,发现网上也有很多人碰到这个问题,总结起来两点:

一、路径问题

二、环境变量问题

这里我为了避免出错已经使用了绝对路径,那看来就是环境变量的问题了。

原来crontab并不会加载环境变量配置,需要我们在脚本中设置,Java程序没有JDK等环境变量当前不能运行了。

修改前面的start_push.sh脚本,加入profile文件的读取:

#!/bin/bash
. /etc/profile
. ~/.bash_profile
java -jar /home/liyd/push.jar

到这里,程序能够正常运行了,使用ps aux | grep java能够看到执行的进程,但是我的Java程序死活没有日志输出啊,查看我的日志配置:

  <appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
  <param name="file" value="${user.dir}/logs/common-default.log"/>
  <param name="append" value="true"/>
  <param name="encoding" value="UTF-8"/>
  <layout class="org.apache.log4j.PatternLayout">
  <param name="ConversionPattern" value="[%x][%r][%p][%t] %d{HH:mm:ss,SSS} method:%l %m%n"/>
  </layout>
  </appender>

本来应该是输出到当前项目的logs文件夹下的,这里初步估计应该是${user.dir}这个变量又找不到了吧。

再次修改start_pust.sh文件,加入user.dir参数:

#!/bin/bash
. /etc/profile
. ~/.bash_profile
java -Duser.dir="/home/liyd/" -jar /home/liyd/push.jar

到这里,终于一切正常!

Linux系统,Centos7版本下搭建postfix服务器及其相关配置应用

实验报告

一、 实验名称:邮件服务器的搭建和相关使用功能的配置

二、 实验环境与要求:Linux系统 centos7版本

搭建邮件服务器实现发信收信基本功能
实现发信认证功能
搭建好LAMP环境,配置squirrelmail收发邮件

三、 实验内容:

1、 检查版信息,postfix安装情况与支持的功能,启动运行;
2、 搭建与之相关的DNS服务器,配置DNS解析功能;
3、 配置postfix基本发信功能,进行测试;
4、 安装dovecot提供收信服务,进行测试;
5、 客户端利用邮箱软件配置测试服务器功能;
6、 进行发信认证配置;
7、 搭建LAMP环境,配置squirrelmail收发邮件

实验步骤

第一步

cat /etc/redhat-release //检查版本信息

未分类

※安装postfix(版本自带) centos7版本即使用最小化安装仍自带此功能

postconf -a // 验证是否支持cyrus dovecot功能

未分类

启动服务器systemctl start postfix

netstat -anpt | grep 25 //查看监听端口号

未分类

第二步

※搭建与之相关的DNS服务器,配置DNS解析功能

yum install bind //安装服务器程序
vi /etc/named.conf //编辑主配置文件

未分类

未分类

※以下进行区域文件配置:

cd /var/named/ 进入文件目录下

复制配置文件的模板进行修改:

cp -p named.localhost yyf.com.zone
cp -p named.localhost yyf.com.local
vi /var/named/yyf.com.zone 编辑正向区文件

如图:

未分类

vi /var/named/yyf.com.local 编辑反向区文件

如图:

未分类

以上基本配置编辑完成

systemctl start named //启动服务器
netstat -anpu | grep name //检测到UDP 53端口在监听 服务器正常工作。

进行DNS验证

vi /etc/resolv.conf
nameserver 192.168.80.18 //指向DNS服务器地址

rpm -ivh /mnt/Packages/bind-utils-9.9.4-50.el7.x86_64.rpm //安装检测命令nslookup

解析如图:

~nslookup mail.yyf.com //正向解析 

未分类

~nslookup 192.168.80.18 //反向解析

未分类

解析成功!

第三步

—–配置postfix基本发信功能

vi /etc/postfix/main.cf 编辑配置文件 修改项如下:

myhostname = mail.aa.com //本机系统主机名
mydomain = aa.com //主机域名
myorigin = $mydomain //根源、起点
inet_interfaces = 192.168.80.18, 127.0.0.1 //接口地址
inet_protocols = ipv4
mydestination = $myhostname, $mydomain //预定、指定范围
home_mailbox = Maildir/ //信箱家目录

完成后保存退出,用postfix check命令检查是否存在语法错误:

service postfix restart //重启邮件服务器

※要测试发信功能是否生效,我们需要添加用户并加入同一组管理:
—–增加邮件测试账号

groupadd mailusers //增加组账号
useradd -g mailusers -s /sbin/nologin jack //建用户jack 加入mailusers组且不可登陆系统
passwd jack(密码随便设置123)
useradd -g mailusers -s /sbin/nologin tom //建用户tom 加入mailusers组且不可登陆系统
passwd tom(密码随便设置123)

测试准备:安装yum install telnet
开始测试:连接服务器的25端口进行简单发信测试
telnet mail.yyf.com 25

依次输入以下内容:

如图:

未分类

由于目前未安装收件服务,所以只能通过root超级管理员来查看邮件是否发送成功

使用root查看tom用户是否收到测试邮件:

ls -l /home/tom/Maildir/new/ 在此目录下应该会有刚才发的邮件

未分类

可用cat命令查看内容

邮件发送功能测试成功!

第四步

※安装dovecot提供收信服务

yum install dovecot //安装系统程序
vi /etc/dovecot/dovecot.conf //配置程序文件

※修改项如下:

protocols = imap pop3 lmtp
listen = //监听 所有端口
!include conf.d/10-auth.conf //此处* 必须替换

※手动增加以下内容:

ssl = no
disable_plaintext_auth = no
mail_location = maildir:~/Maildir

※以上基本配置完成

service dovecot start //启动服务
netstat -anpt | grep dovecot // 110 143端口需要监听

如图:

未分类

服务启动成功,正常工作

※现在可以用户进行测试收信了(以前是用root,现在可以用账户)
测试开始:telnet mail.yyf.com 110

如图:

未分类

我们来读取第一份邮件看看

显示如图:

未分类

用quit 可以退出
测试结构说明收件系统工作正常

鉴于目前的收信发信方式太不友好,安装MUA软件连接服务器收发邮件

※客户端装测设软件:

未分类

用此软件进行测试,看服务器是否正常工作
基本设置如图所示:

未分类

未分类

登陆后收件:

未分类

邮件接受正常
服务器工作正常

第五步

以下进行发信认证配置

yum install cyrus-sasl* 安装相关软件包

vi /etc/sasl2/smtpd.conf 开始编辑配置文件,内容如下:

pwcheck_method: saslauthd
mech_list: plain login
log_level:3 //设置日志级别为3
vi /etc/sysconfig/saslauthd //编辑认证系统配置文件
MECH=shadow

service saslauthd start //开启认证功能服务器
vi /etc/postfix/main.cf //编辑配置文件
在末尾新增
smtpd_sasl_auth_enable = yes //开启认证
smtpd_sasl_security_options = noanonymous //不允许匿名发信
mynetworks = 127.0.0.0/8 //允许的网段,如果增加本机所在网段就会出现允许 不验证也能向外域发信
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination //允许本地域以及认证成功的发信,拒绝认证失败的发信

postfix check //检查语法
service postfix restart //重启服务器

※测试普通发信

telnet mail.yyf.com 25

如图:

未分类

向未认证区域发件失败说明认证系统是生效的
quit 退出

※下面用系统账户进行发信测试

将用户名与密码生成密文加密:

printf "jack" | openssl base64 //生成密文
amFjaw== (密文)
printf "123" | openssl base64 //生成密文
MTIz (密文)

※开始用字符终端测试认证发信:

telnet mail.aa.com 25

如图:

未分类

未分类

若在真机用邮箱软件测试,只需做如下操作:

未分类

将高级设置中的选项勾选即可验证

第六步

—-以下是配置squirrelmail收发邮件内容
需要搭建好LAMP环境

--------安装LAMP---------
yum install -y 
httpd 
mariadb-server mariadb 
php 
php-mysql 
php-gd 
libjpeg* 
php-ldap 
php-odbc 
php-pear 
php-xml 
php-xmlrpc 

php-mhash 注: 安装相关软件包,其中表示强制换行操作

vi /etc/httpd/conf/httpd.conf //编辑配置文件

需要修改的内容:

ServerName www.aa.com ///服务器名称
DirectoryIndex index.html index.php ///支持静态与动态网页
vi /etc/php.ini //编辑此配置文件
date.timezone = PRC //设置时区

提醒:系统中的防火墙与安全Linux要确认关闭,否则影响实验

systemctl stop firewalld.service
setenforce 0

systemctl start httpd.service 网页系统启动
systemctl start mariadb.service 数据库系统启动

netstat -anpt | grep 80
netstat -anpt | grep 3306 //端口在监听,说明服务器启动正常

未分类

未分类

※mysql_secure_installation 进行安全校验,也可不设置

接下来

vi /var/www/html/index.php 编辑数据库文件

在里面写入脚本如下:

<?php
phpinfo();
?>

用真机浏览器测试:

http://192.168.80.18 将出现如下页面,说明设置成功

未分类

※进入数据库,建立授权账号

mysql -u root -p

进数据库时设置一下密码:123456

CREATE DATABASE bcd; //建立数据库名字bcd
GRANT all ON bcd.* TO 'mail'@'%' IDENTIFIED BY '123456'; 
flush privileges; //刷新一下权限

下面测试数据库工作是否正常

vi /var/www/html/index.php //编辑配置文件,该文件为数据库工作目录

删除以前内容,写入如下内容:

<?php
$link=mysql_connect('192.168.80.18','mail','123456'); //说明地址与密码
if($link) echo "<h1>Success!!</h1>"; //如果连接成功则会显示Success!!
else echo "Fail!!"; //如果连接失败则显示Fail!!
mysql_close();
?>

保存退出

测试:

未分类

连接成功!

到下面网址下载小松鼠包与汉化语言包

http://www.squirrelmail.org/download.php

1、squirrelmail-webmail-1.4.22.tar.gz
2、all_locales-1.4.18-20090526.tar.gz

将安装包上传到Linux系统中进行解压

tar xzvf squirrelmail-webmail-1.4.22.tar.gz
tar xzvf all_locales-1.4.18-20090526.tar.gz -C squirrelmail-webmail-1.4.22 //-C表示将语言包解压到后续包中

cp -rv squirrelmail-webmail-1.4.22 /var/www/html/mail //将解压完成的包拷贝到/var/www/html/mail(网页工作目录)

cd /var/www/html/mail // cd到php工作目录下
mkdir attach //建立附件文件目录
chown -R apache:apache attach/ data/ //修改权限

cd config //到squirrelmail配置文件下
cp config_default.php config.php // 拷贝模板
vi config.php //开始编辑

修改内容如下:

$domain = 'aa.com'; //域名
$imap_server_type = 'dovecot'; //imap服务类型为dovecot
$data_dir = '/var/www/html/mail/data'; //原件存放地址
$attachment_dir = '/var/www/html/mail/attach/'; //附件存放地址
$squirrelmail_default_language = 'zh_CN'; //网页显示语言为中文
$default_charset = 'zh_CN.UTF-8'; //中文字符编码

用真机浏览器登陆测试:

http://192.168.80.181/mail

出现登录界面,如图:

未分类

输入账户登陆:
显示如下:

未分类

成功进入并且可正常操作使用,服务器工作正常。

第七步

※以下设置邮件组

vi /etc/aliases 编辑配置文件

增加组名:student:jack,tom

newaliases //生成hash数据库文件
systemctl restart postfix //重启邮件服务器br/>测试向[email protected]发信的时候jack,tom都会收到。

测试如下:

※用tom向组邮箱发送组邮件

未分类

检查收件情况:

未分类

未分类

测试结果符合要求

※以下设置邮件大小

vi /etc/postfix/main.cf //编辑配置文件

手动写入:

message_size_limit = 5120000 //单位是Byte

保存后退出!

systemctl restart postfix //重启邮件服务器

通过增加大附件测试效果

未分类

未分类

※以下通过配置用户磁盘配额实现限制用户邮箱空间
邮件存放目录在home下,挂载于/dev/sda5盘上

未分类

[root@yyf ~]# umount /home
[root@yyf ~]# mount -o usrquota,grpquota /dev/sda5
[root@yyf ~]# vi /etc/fstab

最后一行加上:

未分类

未分类

开启磁盘配额:

edquota -u jack

配额硬性为20M 如图:

未分类

用户系统中检测磁盘配额是否生效:

未分类

超出配额,已生效。
用客户端软件测试:

发送大小为6.6M的邮件,已成功发送两个(已取消单个邮件不得大于5M的配置)

未分类

第三份发送失败

未分类

查看目录剩余空间,限额20M的情况下,已不足6.6M的空间,故第三份发送必然失败

未分类

所以对jack用户做的磁盘配额生效。

Linux下grep显示前后几行信息

摘要: 标准unix/linux下的grep通过下面參数控制上下文 grep -C 5 foo file 显示file文件里匹配foo字串那行以及上下5行grep -B 5 foo file 显示foo及前5行grep -A 5 foo file 显示foo及后5行 查看grep版本号的方法是grep -V 假设想升级,升级的方法:最新的源代码(google或者百度搜索主页),编译安装到某个地方,比方 /home/aaa/bin/ 那么以后用的时候就用 /home/aaa/bin/grep ,或者把 /home/aaa/bin 加到PATH环境变量就可以。

标准unix/linux下的grep通过下面參数控制上下文

grep -C 5 foo file 显示file文件里匹配foo字串那行以及上下5行

grep -B 5 foo file 显示foo及前5行

grep -A 5 foo file 显示foo及后5行

查看grep版本号的方法是

grep -V

假设想升级,升级的方法:最新的源代码(google或者百度搜索主页),编译安装到某个地方,比方 /home/aaa/bin/ 那么以后用的时候就用 /home/aaa/bin/grep ,或者把 /home/aaa/bin 加到PATH环境变量就可以。 假设你把最新编译好的grep覆盖到你如今grep所在文件夹,则升级自然就完成了。

linux统计文件夹中文件数目

第一种方法:

ls -l|grep "^-"|wc -l

未分类

grep ^- 这里将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是 ^d

wc -l 统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于一行信息对应一个文件,所以也就是文件的个数。

第二种方法:

find ./ -type f|wc -l

未分类

需要说明的是第二种方法会比第一种方法快很多,尤其是也统计子目录时。

Linux下Nginx+Tomcat整合与配置

安装JDK

下载的jdk文件为:jdk-6u45-linux-x64.bin,执行如下命令进行安装:

#./jdk-6u12-linux-i586.bin

安装tomcat

#tar zxvf apache-tomcat-6.0.18.tar.gz
#mv apache-tomcat-6.0.29 tomcat

这里我将解压后的apache-tomcat-6.0.29重命名为了tomcat方便操作。

配置环境变量

编辑/etc下的profile文件,加上如下内容:

JAVA_HOME="/opt/app/jdk1.6.0_45"
CLASS_PATH="$JAVA_HOME/lib:$JAVA_HOME/jre/lib"
PATH=".:$PATH:$JAVA_HOME/bin"
CATALINA_HOME="/opt/app/tomcat"
export JAVA_HOME CATALINA_HOME

执行下面命令使变更生效:

# source /etc/profile

启动tomcat并输入http://domain:8080,如果看到猫的页面即tomcat和jdk安装成功

新建文件目录/home/www为网站存放目录,设置server.xml文件,在Host name=”localhost”处将appBase=的指向路径改为/home/www/web

创建index.jsp至/home/www/web/ROOT,内容为:“hello!” 重新启动tomcat,重新访问,如果看到index.jsp文件内容hello!表示设置成功。

安装Nginx

执行如下命令解压nginx:

# tar zxvf nginx-1.4.4.tar.gz
# mv nginx-1.4.4 nginx

同样重命名了一下。

安装nginx:

# ./configure --prefix=/opt/app/nginx

结果出现了错误:error: C compiler cc is not found,按网上所说安装编译源码所需的工具和库:

#yum install gcc gcc-c++ ncurses-devel perl

再次安装,发现还有错误:the HTTP rewrite module requires the PCRE library.

执行

# yum -y install pcre-devel openssl openssl-devel

终于成功,

# ./configure --prefix=/opt/app/nginx
# make
# make install

nginx安装成功后的安装目录为/opt/app/nginx

在conf文件夹中新建proxy.conf,用于配置一些代理参数,内容如下:

#!nginx (-) 
# proxy.conf 
proxy_redirect          off;
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;  #获取真实ip
#proxy_set_header       X-Forwarded-For   $proxy_add_x_forwarded_for; #获取代理者的真实ip
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size       4k;
proxy_buffers           4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

编辑安装目录下conf文件夹中的nginx.conf,输入如下内容

#运行nginx所在的用户名和用户组
#user  www www; 
#启动进程数
worker_processes 8;
#全局错误日志及PID文件
error_log  /opt/app/nginx/logs/nginx_error.log  crit;
pid        /opt/app/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
#工作模式及连接数上限
events
{
  use epoll;
  worker_connections 65535;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
  #设定mime类型
  include       mime.types;
  default_type  application/octet-stream;
  include /opt/app/nginx/conf/proxy.conf;
  #charset  gb2312;
  #设定请求缓冲    
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
#  client_max_body_size 8m;
  sendfile on;
  tcp_nopush     on;
  keepalive_timeout 60;
  tcp_nodelay on;
#  fastcgi_connect_timeout 300;
#  fastcgi_send_timeout 300;
#  fastcgi_read_timeout 300;
#  fastcgi_buffer_size 64k;
#  fastcgi_buffers 4 64k;
#  fastcgi_busy_buffers_size 128k;
#  fastcgi_temp_file_write_size 128k;
#  gzip on;
#  gzip_min_length  1k;
#  gzip_buffers     4 16k;
#  gzip_http_version 1.0;
#  gzip_comp_level 2;
#  gzip_types       text/plain application/x-javascript text/css application/xml;
#  gzip_vary on;
#limit_zone  crawler  $binary_remote_addr  10m;
###禁止通过ip访问站点
 # server{
#        server_name _;
 #       return 404;
 #       }
  server
  {
    listen       80;
    server_name  localhost;
    index index.html index.jsp;
    root  /opt/www/static;
    #limit_conn   crawler  20;    
    location ~ .*.(jsp|shtml)$ #所有shtml的页面均交由tomcat处理
    {
      index index.jsp;
      proxy_pass http://localhost:8080;#转向tomcat处理
      }
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ #设定访问静态文件直接读取不经过tomcat
    {
      expires      30d;
    }
    location ~ .*.(js|css)?$
    {
      expires      1h;
    }    
   }  
#定义访问日志的写入格式
     log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $http_x_forwarded_for';
    access_log  /opt/app/nginx/logs/localhost.log access;#设定访问日志的存放路径   
}

修改/usr/local/nginx/conf/nginx.conf配置文件后,请执行以下命令检查配置文件是否正确:

#/opt/app/nginx/sbin/nginx -t

如果出现下面两行,说明正确:

the configuration file /opt/app/nginx/conf/nginx.conf syntax is ok
the configuration file /opt/app/nginx/conf/nginx.conf was tested successfully

如果提示unknown host,则可在服务器上执行:ping www.baidu.com如果也是同样提示unknown host则有两种可能:

a、服务器没有设置DNS服务器地址,查看/etc/resolv.conf下是否设置,若无则加上

b、防火墙拦截

启动nginx的命令

#/opt/app/nginx/sbin/nginx

这时,输入以下命令查看Nginx主进程号:

ps -ef | grep "nginx: master process" | grep -v "grep" | awk -F ' ' '{print $2}'

停止nginx的命令

#/opt/app/nginx/sbin/nginx -s stop

在不停止Nginx服务的情况下平滑变更Nginx配置

输入以下命令查看Nginx主进程号:

ps -ef | grep "nginx: master process" | grep -v "grep" | awk -F ' ' '{print $2}'

屏幕显示的即为Nginx主进程号,例如:

6302

这时,执行以下命令即可使修改过的Nginx配置文件生效:

kill -HUP 6302

或者无需这么麻烦,找到Nginx的Pid文件:

kill -HUP `cat /usr/local/nginx/nginx.pid`

Linux下tcpdump的使用

若没有安装,则需要安装 yum install tcpdump*

从所有网卡中捕获数据包

运行下面命令来从所有网卡中捕获数据包:

tcpdump -i any

未分类

从指定网卡中捕获数据包

tcpdump -i eth0

未分类

将捕获的包写入文件

使用 -w 选项将所有捕获的包写入文件:

tcpdump -i eth0 -w packets_file

未分类

读取之前产生的 tcpdump 文件

tcpdump -r packets_file

未分类

获取更多的包信息,并且以可读的形式显示时间戳

tcpdump -ttttnnvvS

未分类

查看整个网络的数据包

tcpdump net 192.168.174.0/24

未分类

根据 IP 地址查看报文

要获取指定 IP 的数据包,不管是作为源地址还是目的地址,使用下面命令:

tcpdump host 192.168.174.2

未分类

要指定 IP 地址是源地址或是目的地址则使用:

tcpdump src 192.168.174.128
tcpdump dst 192.168.174.2

或者tcpdump src 192.168.174.128 || dst 192.168.174.2

未分类

查看某个协议或端口号的数据包

tcpdump 协议

ex:tcpdump icmp

未分类

要捕获某个端口或一个范围的数据包,使用:

tcpdump port 80

tcpdump portrange 22-125

未分类

未分类

一次断开连接和简历连接。

我们也可以与 src 和 dst 选项连用来捕获指定源端口或指定目的端口的报文。

我们还可以使用“与” (and,&&)、“或” (or,|| ) 和“非”(not,!) 来将两个条件组合起来。当我们需要基于某些条件来分析网络报文是非常有用。

使用“与”

可以使用 and 或者符号 && 来将两个或多个条件组合起来。比如:

tcpdump src 192.168.174.128 && port 22 -w ssh_packets

“或”会检查是否匹配命令所列条件中的其中一条,像这样:

tcpdump src 192.168.1.174 or dst 192.168.174.2 && port 22 -w ssh_packets

tcpdump port 443 or 80 -w http_packets

“非” 当我们想表达不匹配某项条件时可以使用“非”,像这样:

tcpdump -i eth0 src port not 22

这会捕获 eth0 上除了 22 号端口的所有通讯。

Linux SSH免密登陆

此处以Ubuntu(我的虚拟机,此处称为:client)登陆到centos(测试服务器,此处称为server)为例。
这里我们使用jiankunking用户来生成rsa公钥和密钥,命令:

ssh-keygen  -t rsa

如图

未分类

这里我们使用server上的tttt用户来登陆,将client上的公钥拷贝到server /home/tttt/.ssh/other_pub_key目录下,other_pub_key(需要设置下权限,为了测试可以设置为chmod 777 other_pub_key)是我新建的,用来存放client的公钥。

sudo scp /home/jiankunking/.ssh/id_rsa.pub [email protected]:/home/tttt/.ssh/other_pub_key

切换到/home/tttt/.ssh/目录下 将client的公钥追加到server的authorized_keys中

cat ./other_pub_key/id_rsa.pub >> ./authorized_keys

未分类

ssh [email protected] 

搞定。

linux的php-fpm的pool、慢执行日志、进程管理及open_basedir介绍

php-fpm的pool

Nignx可以配置多个虚拟主机,php-fpm同样也支持配置多个pool,每一个pool可以监听一个端口,也可以监听一个socket。

php-fpm配置说明:

和LAMP不同的是,在LNMP架构中,php-fpm作为独立的一个服务存在,既然是独立服务,那么它必然有自己的配置文件。php-fpm的配置文件为/usr/local/php-fpm/etc/php-fpm.conf,它同样也支持include语句,类似于nginx.conf里面的include。

1. 编辑配置文件

[root@gary-tao ~]# cd /usr/local/php-fpm/etc/
[root@gary-tao etc]# ls
pear.conf  php-fpm.conf  php-fpm.conf.default  php.ini
[root@gary-tao etc]# cat php-fpm.conf
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
[root@gary-tao etc]# vim php-fpm.conf  

//增加一个以下配置:

include = etc/php-fpm.d/*.conf

//include的这一行比较特殊,请注意等号后面的路径,必须写上etc目录,然后需要创建配置文件目录和子配置文件。

编辑好后把php-fpm.conf配置文件里的www以下pool删除,只留下[global]部分

未分类

2. 创建php-fpm.d目录及目录下文件

[root@gary-tao etc]# mkdir php-fpm.d
[root@gary-tao etc]# cd php-fpm.d
[root@gary-tao php-fpm.d]# vim www.conf
[root@gary-tao php-fpm.d]# vim aming.conf
[root@gary-tao php-fpm.d]# ls
aming.conf  www.conf

//两个文件分别增加内容如下:

[www]
listen = /tmp/php-fcgi.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

[aming.com]
listen = /tmp/aming.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

3. 如何把两个站点隔开

  • 原有站点test.com.conf配置如下:

未分类

  • 增加一个aaa.com.conf站点信息,操作如下:
[root@gary-tao php-fpm.d]# cd /usr/local/nginx/conf/vhost/
[root@gary-tao vhost]# ls
aaa.com.conf  ld.conf  proxy.conf  ssl.conf  test.com.conf
[root@gary-tao vhost]# vim aaa.com.conf 

增加如下配置内容:

location ~ .php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/aming.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;
    }

未分类

4. 测试语法

[root@gary-tao etc]# /usr/local/php-fpm/sbin/php-fpm -t
[09-Jan-2018 16:49:00] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

5. 重启php-fpm

[root@gary-tao etc]# /etc/init.d/php-fpm restart  //或/etc/init.d/php-fpm reload
Gracefully shutting down php-fpm . done
Starting php-fpm  done

6. 查看php-fpm启动状态

输入ps aux |grep php-fpm查看,显示的就有两个pool

未分类

php-fpm慢执行日志

通过php-fpm的慢执行日志,我们可以非常清晰地了解到PHP的脚本哪里执行时间长,它可以定位到具体的行。

1. 编辑配置文件

[root@gary-tao vhost]# vim /usr/local/php-fpm/etc/php-fpm.d/www.conf //针对www文件做一个测试

增加如下内容:

request_slowlog_timeout = 1  //超过一秒中就会记录日志
slowlog = /usr/local/php-fpm/var/log/www-slow.log  //日志存放的路径

1. 测试语法

[root@gary-tao vhost]# /usr/local/php-fpm/sbin/php-fpm -t
[09-Jan-2018 19:15:14] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

2. 重启php-fpm

[root@gary-tao vhost]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done

3. 配置nginx的虚拟主机test.com.conf,把unix:/tmp/php-fcgi.sock改为unix:/tmp/www.sock

4. 编写测试脚本

[root@gary-tao php-fpm.d]# vim /data/wwwroot/test.com/sleep.php

增加如下配置内容:

<?php
echo "test slow log";
sleep(2);
echo "done";
?>

5. 使用curl做测试

[root@gary-tao php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php -I  //访问的时候出现500,说明有语法错误。 
HTTP/1.1 500 Internal Server Error
Server: nginx/1.12.1
Date: Tue, 09 Jan 2018 11:23:17 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.30

报错处理:

  • 进入vim /usr/local/php-fpm/etc/php.ini

  • 找到display_error,改为On,然后访问有错误主就会有输出信息

未分类

  • 记得reload重新加载配置文件

  • 测试出报错信息,因符号问题导致。

[root@gary-tao php-fpm.d]# /etc/init.d/php-fpm reload
Reload service php-fpm  done
[root@gary-tao php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php
<br />
<b>Parse error</b>:  syntax error, unexpected 'slow' (T_STRING), expecting ',' or ';' in <b>/data/wwwroot/test.com/sleep.php</b> on line <b>2</b><br />
  • 重新去更改配置文件vim /data/wwwroot/test.com/sleep.php的符号问题

  • 查看慢执行日志

[root@gary-tao php-fpm.d]# cat /usr/local/php-fpm/var/log/www-slow.log  //慢执行日志里指出了哪个脚本运行慢,也指出了是哪一行执行慢 

[09-Jan-2018 19:39:54]  [pool www] pid 81864
script_filename = /data/wwwroot/test.com/sleep.php
[0x00007f5987a07290] sleep() /data/wwwroot/test.com/sleep.php:3
[root@gary-tao php-fpm.d]# cat /data/wwwroot/test.com/sleep.php 
<?php 
echo "test slow log";
sleep(2);       //这个脚本超过1秒
echo "done";
?>

定义open_basedir

open_basedir的目的就是安全,只要在对应的Nginx虚拟主机配置文件中调用对应的pool,就可以使用open_basedir来物理隔离多个站点,从而达到安全目的。

1. 配置虚拟主机文件

[root@gary-tao php-fpm.d]# vim /usr/local/php-fpm/etc/php-fpm.d/www.conf 

增加如下配置内容:

php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/

2. 使用curl测试

[root@gary-tao php-fpm.d]# curl -x127.0.0.1:80 test.com/3.php -I  //正常访问
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Tue, 09 Jan 2018 12:32:50 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.30

3. 配置错误日志路径测试

  • 增加错误路径
[root@gary-tao php-fpm.d]# vim /usr/local/php-fpm/etc/php.ini //增加错误日志路径及定义日志级别,如下图

未分类

未分类

  • 进入到www.conf配置文件里面把test.com改为aming.com,再次测试,
    查看错误日志

  • 查看错误日志

[root@gary-tao php-fpm.d]# grep error_log /usr/local/php-fpm/etc/php.ini  //查看日志路径
; server-specific log, STDERR, or a location specified by the error_log
; Set maximum length of log_errors. In error_log information about the source is
;error_log = php_errors.log
;error_log = syslog
error_log = /usr/local/php-fpm/var/log/php_errors.log
; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=
[root@gary-tao php-fpm.d]# ls /usr/local/php-fpm/var/log/
php-errors.log  php-fpm.log  www-slow.log

[root@gary-tao php-fpm.d]# ls /usr/local/php-fpm/var/log/ //查看日志路径是否存在
php-fpm.log  www-slow.log
[root@gary-tao php-fpm.d]# touch /usr/local/php-fpm/var/log/php_errors.log  //手动建立一个日志文件
[root@gary-tao php-fpm.d]# chmod 777 /usr/local/php-fpm/var/log/php_errors.log  //更改成所有权限,防止不能写入日志
[root@gary-tao php-fpm.d]# !curl
curl -x127.0.0.1:80 test.com/3.php -I
HTTP/1.1 404 Not Found
Server: nginx/1.12.1
Date: Tue, 09 Jan 2018 13:05:05 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.30

[root@gary-tao php-fpm.d]# cat /usr/local/php-fpm/var/log/php_errors.log  //因为open_basedir限制的地址写错了,所有就会报错,访问出现404
[09-Jan-2018 13:05:05 UTC] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/test.com/3.php) is not within the allowed path(s): (/data/wwwroot/aming.com:/tmp/) in Unknown on line 0
[09-Jan-2018 13:05:05 UTC] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on lin

php-fpm进程管理

未分类

  1. pm = dynamic //定义php-fpm的子进程启动模式,dynamic为动态进程管理,一开始只启动少量的子进程,根据实际需求,动态地增加或者减少子进程,最多不会超过pm.max_children定义的数值。另外一种模式是static,这种模式下子进程数量由pm.max_children决定,一次性启动这么多,不会减少也不会增加。

  2. pm.max_children = 50 //最大子进程数,ps aux可以查看

  3. pm.start_servers = 20 //针对dynamic模式,它定义php-fpm服务在启动服务时产生的子进程服务时产生的子进程数量。

  4. pm.min_spare_servers = 5 //针对dynamic模式,定义在空闲时段,子进程数的最少数量,如果达到这个数值时,php-fpm服务会自动派生新的子进程。

  5. pm.max_spare_servers = 35 //针对dynamic模式,定义在空闲时段,子进程数的最大值,如果高于这个数值就开始清理空闲的子进程。

  6. pm.max_requests = 500 //针对dynamic模式,定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。

12 条用于 Linux 的 MySQL/MariaDB 安全最佳实践

MySQL 是世界上最流行的开源数据库系统,MariaDB(一个 MySQL 分支)是世界上增长最快的开源数据库系统。在安装 MySQL 服务器之后,在默认配置下是不安全的,确保数据库安全通常是通用数据库管理的基本任务之一。

这将有助于增强和提升整个 Linux 服务器的安全性,因为攻击者总是扫描系统任意部分的漏洞,而数据库在过去是重点目标区域。一个常见的例子是对 MySQL 数据库的 root 密码的强制破解。

在本指南中,我们将会讲解对开发者有帮助的 MySQL/MariaDB 的 Linux 最佳安全实践。

1. 安全地安装 MySQL

这是安装 MySQL 服务器后第一个建议的步骤,用于保护数据库服务器。这个脚本可以帮助您提高 MySQL 服务器的安全性:

  • 如果您在安装期间没有设置 root 帐户的密码,马上设置它

  • 通过删除可从本地主机外部访问的 root 帐户来禁用远程 root 用户登录

  • 删除匿名用户帐户和测试数据库,默认情况下,所有用户、甚至匿名用户都可以访问这些帐户和测试数据库

# mysql_secure_installation

在运行上述命令之后,设置 root 密码并通过输入 [Yes/Y] 和按下 [Enter] 键来回答一系列问题。

未分类

安全安装 MySQL 情况界面

2. 将数据库服务器绑定到 Loopback 地址

此配置将限制来自远程机器的访问,它告诉 MySQL 服务器只接受来自本地主机的连接。你可以在主配置文件中进行设置。

# vi /etc/my.cnf                       [RHEL/CentOS]    
# vi /etc/mysql/my.conf                    [Debian/Ubuntu] 
OR
# vi /etc/mysql/mysql.conf.d/mysqld.cnf    [Debian/Ubuntu]

在 [mysqld] 部分中添加下面这一行

bind-address = 127.0.0.1

3. 禁用 MySQL 的 LOCAL INFILE

作为安全性增强的一部分,您需要禁用 local_infile,使用下面的指令以防止在 [mysqld] 部分从 MySQL 中访问底层文件系统。

local-infile=0

4. 修改 MySQL 的默认端口

设置端口变量用于监听 TCP/IP 连接的 MySQL 端口号。默认端口号是 3306,但是您可以在 [mysqld] 中修改它。

Port=5000

5. 启用 MySQL 日志

日志是了解服务运行过程中发生了什么的最好的方法之一,在受到任何攻击的时候都可以很容易的从日志里看到任何入侵相关的行为。可以通过将下边的变量添加到配置文件[mysqld]部分来开启mysql日志功能。

log=/var/log/mysql.log

6. 设置合适的 MySQL 文件的访问权限

确保你已经为所有的 mysql 服务文件和数据路径设置了合适的访问权限。文件 /etc/my.conf 只能由 root 用户修改,这样就可以阻止其他用户修改数据库服务的配置。

# chmod 644 /etc/my.cnf

7. 删除 MySQL shell 历史

你在 MySQL shell 中执行的所有的命令都会被 mysql 客户端保存到一个历史文件:~/.mysql_history。这样是很危险的,因为对于你创建过的任何用户账户,所有的在 shell 输入过的用户名和密码都会记录到历史文件里面。

# cat /dev/null > ~/.mysql_history

8. 不要在命令行中运行 MySQL 命令

正如你所知道的,你在终端上输入的所有命令都会被存储在一个历史文件中,具体取决于你正在使用的shell(例如 bash 的 shell 历史文件放在 ~/.bash_history)。攻击者访问这个历史文件可以很容易地看到记录在那里的任何密码。

非常不建议在命令行里面输入密码,如下:

# mysql -u root -ppassword_

未分类

使用密码连接 MySQL

当你查看命令行历史文件的最后的部分时,可以看到之前输入过的密码。

# history

未分类

查看命令行输入历史

推荐连接 MySQL 的方式是

# mysql -u root -p
Enter password:

9. 定义特定应用的数据库用户

对于每一个在服务器上运行的应用,只设置一个与该应用相关的数据库用户。例如你有一个 wordpress 网站,如下创建一个 wordpress 的数据库用户:

# mysql -u root -p
MariaDB [(none)]> CREATE DATABASE osclass_db;
MariaDB [(none)]> CREATE USER 'osclassdmin'@'localhost' IDENTIFIED BY 'osclass@dmin%!2';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON osclass_db.* TO 'osclassdmin'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit

并且要记住对于不再使用的数据库用户要删掉。

10. 使用额外的安全插件和库

MySQL 包含许多安全插件:验证客户端连接到 MySQL 服务器的请求、密码校验和敏感信息的安全存储等,这些都在免费版本中提供。

在这里可查看更多:https://dev.mysql.com/doc/refman/5.7/en/security-plugins.html

11. 定期修改 MySQL 密码

定期修改密码是一个常见的信息/应用/系统安全建议。多久修改一次密码由你内部的安全策略决定。定期修改密码可以阻止长期跟踪你的“窥探者”,获取你的密码,登录你的 MySQL 服务器。

MariaDB [(none)]> USE mysql;MariaDB [(none)]> UPDATE user SET password=PASSWORD('YourPasswordHere') WHERE User='root' AND Host = 'localhost';MariaDB [(none)]> FLUSH PRIVILEGES;

12. 定期更新 MySQL Server 包

强烈建议定期从官方仓库更新 mysql/mariadb 包来获取最新的安全更新和错误改进。通常情况下操作系统中默认的包是过时的。

# yum update
# apt update

在对 mysql/mariadb server 进行任何修改之后,要重启服务。

# systemctl restart mariadb     #RHEL/CentOS
# systemctl restart mysql       #Debian/Ubuntu