Linux系统shell脚本判断变量文件目录:权限、是否存在、空值、相等

先写一些基本语法:

1、字符串判断

str1 = str2      当两个串有相同内容、长度时为真
str1 != str2      当串str1和str2不等时为真
-n str1        当串的长度大于0时为真(串非空)
-z str1        当串的长度为0时为真(空串)
str1           当串str1为非空时为真

2、数字的判断

int1 -eq int2    两数相等为真
int1 -ne int2    两数不等为真
int1 -gt int2    int1大于int2为真
int1 -ge int2    int1大于等于int2为真
int1 -lt int2    int1小于int2为真
int1 -le int2    int1小于等于int2为真

3 文件的判断

-r file     用户可读为真
-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真

3、复杂逻辑判断

-a         与
-o        或
!        非

下面是一些使用实例:

#!/bin/sh
myPath="/var/log/httpd/"
myFile="/var /log/httpd/access.log"

#这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
if [ ! -x "$myPath"]; then
mkdir "$myPath"
fi

#这里的-d 参数判断$myPath是否存在
if [ ! -d "$myPath"]; then
mkdir "$myPath"
fi

#这里的-f参数判断$myFile是否存在
if [ ! -f "$myFile" ]; then
touch "$myFile"
fi

#其他参数还有-n,-n是判断一个变量是否是否有值
if [ ! -n "$myVar" ]; then
echo "$myVar is empty"
exit 0
fi

#两个变量判断是否相等
if [ "$var1" == "$var2" ]; then
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi

if list then
do something here
elif list then
do another thing here
else
do something else here
fi

EX1:

#!/bin/sh

SYSTEM=`uname -s`     #获取操作系统类型,我本地是linux

if [ $SYSTEM = "Linux" ] ; then     #如果是linux的话打印linux字符串
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi     #ifend

基本上和其他脚本语言一样。没有太大区别。不过值得注意的是。[]里面的条件判断。

来自:http://hi.baidu.com/speiwak/blog/item/afd342ae265104c57dd92a19.html

使用Iptables来控制Linux开放或者禁止指定端口

1、关闭所有的 INPUT FORWARD OUTPUT 。
下面是命令实现:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

再用命令 iptables -L -n 查看 是否设置好, 好看到全部 DROP 了
这样的设置好了,我们只是临时的, 重启服务器还是会恢复原来没有设置的状态
还要使用 service iptables save 进行保存
看到信息 firewall rules 防火墙的规则 其实就是保存在 /etc/sysconfig/iptables
可以打开文件查看 vi /etc/sysconfig/iptables
2、打开22端口

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

 

执行 iptables -L -n 查看所有规则

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp spt:22

 

现在Linux服务器只打开了22端口,用putty.exe测试一下是否可以链接上去。
如果可以连的上去,就说明没有问题。

最后别忘记了保存 对防火墙的设置
通过命令:service iptables save 进行保存

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

针对这2条命令进行一些讲解吧
-A 参数就看成是添加一条 INPUT 的规则
-p 指定是什么协议 我们常用的tcp 协议,当然也有udp 例如53端口的DNS
到时我们要配置DNS用到53端口 大家就会发现使用udp协议的

而 –dport 就是目标端口 当数据从外部进入服务器为目标端口
反之 数据从服务器出去 则为数据源端口 使用 –sport

-j 就是指定是 ACCEPT 接收 或者 DROP 不接收
3、禁止某个IP访问
1台Linux服务器,2台windows xp 操作系统进行访问
Linux服务器ip 192.168.1.99
xp1 ip: 192.168.1.2
xp2 ip: 192.168.1.8

下面看看我2台xp 都可以访问的

192.168.1.2  这是 xp1 可以访问的,
192.168.1.8 xp2 也是可以正常访问的。

那么现在我要禁止 192.168.1.2 xp1 访问, xp2 正常访问,
下面看看演示

通过命令 iptables -A INPUT -p tcp -s 192.168.1.2 -j DROP
这里意思就是 -A 就是添加新的规则, 怎样的规则呢? 由于我们访问网站使用tcp的,
我们就用 -p tcp , 如果是 udp 就写udp,这里就用tcp了, -s就是 来源的意思,
ip来源于 192.168.1.2 ,-j 怎么做 我们拒绝它 这里应该是 DROP

好,看看效果。好添加成功。下面进行验证 一下是否生效

一直出现等待状态 最后 该页无法显示 ,这是 192.168.1.2 xp1 的访问被拒绝了。

再看看另外一台 xp 是否可以访问, 是可以正常访问的 192.168.1.8 是可以正常访问的
4、如何删除规则
首先我们要知道 这条规则的编号,每条规则都有一个编号

通过 iptables -L -n –line-number 可以显示规则和相对应的编号

num  target     prot opt source               destination
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3306
2    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:21
3    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80

多了 num 这一列, 这样我们就可以 看到刚才的规则对应的是 编号2

那么我们就可以进行删除了
iptables -D INPUT 2
删除INPUT链编号为2的规则。

再 iptables -L -n 查看一下 已经被清除了。
5、过滤无效的数据包
假设有人进入了服务器,或者有病毒木马程序,它可以通过22,80端口像服务器外传送数据。
它的这种方式就和我们正常访问22,80端口区别。它发向外发的数据不是我们通过访问网页请求
而回应的数据包。

下面我们要禁止这些没有通过请求回应的数据包,统统把它们堵住掉。

iptables 提供了一个参数 是检查状态的,下面我们来配置下 22 和 80 端口,防止无效的数据包。

iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

可以看到和我们以前使用的:

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

多了一个状态判断。

同样80端口也一样, 现在删掉原来的2条规则,
iptables -L -n –line-number    这个是查看规则而且带上编号。我们看到编号就可以
删除对应的规则了。

iptables -D OUTPUT 1     这里的1表示第一条规则。

当你删除了前面的规则, 编号也会随之改变。看到了吧。

好,我们删除了前面2个规则,22端口还可以正常使用,说明没问题了

下面进行保存,别忘记了,不然的话重启就会还原到原来的样子。

service iptables save    进行保存。

Saving firewall rules to /etc/sysconfig/iptables:          [  OK  ]

其实就是把刚才设置的规则写入到 /etc/sysconfig/iptables 文件中。
6、DNS端口53设置
下面我们来看看如何设置iptables来打开DNS端口,DNS端口对应的是53

大家看到我现在的情况了吧,只开放22和80端口, 我现在看看能不能解析域名。

host www.google.com 输入这个命令后,一直等待,说明DNS不通

出现下面提示 :
;; connection timed out; no servers could be reached

ping 一下域名也是不通
[root@localhost ~ping www.google.com
ping: unknown host www.google.com

我这里的原因就是 iptables 限制了53端口。

有些服务器,特别是Web服务器减慢,DNS其实也有关系的,无法发送包到DNS服务器导致的。

下面演示下如何使用 iptables 来设置DNS 53这个端口,如果你不知道 域名服务端口号,你

可以用命令 : grep domain /etc/services

[root@localhost ~] grep domain /etc/services
domain          53/tcp                          # name-domain server
domain          53/udp
domaintime      9909/tcp                        # domaintime
domaintime      9909/udp                        # domaintime

看到了吧, 我们一般使用 udp 协议。

好了, 开始设置。。。

iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

这是我们 ping 一个域名,数据就是从本机出去,所以我们先设置 OUTPUT,
我们按照ping这个流程来设置。

然后 DNS 服务器收到我们发出去的包,就回应一个回来

iptables -A INPUT -p udp --sport 53 -j ACCEPT

同时还要设置

iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT

好了, 下面开始测试下, 可以用 iptables -L -n 查看设置情况,确定没有问题就可以测试了

 

[root@localhost ~] iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp spt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp spt:22 state ESTABLISHED
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp spt:80 state ESTABLISHED
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp spt:53

可以测试一下 是否 DNS 可以通过iptables 了。

[root@localhost ~]host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com is an alias for www-china.l.google.com.
www-china.l.google.com has address 64.233.189.104
www-china.l.google.com has address 64.233.189.147
www-china.l.google.com has address 64.233.189.99

正常可以解析 google 域名。

ping 方面可能还要设置些东西。

用 nslookup 看看吧

 

[root@localhost ~]nslookup
> www.google.com
Server:         192.168.1.1
Address:        192.168.1.1#53

Non-authoritative answer:
www.google.com canonical name = www.l.google.com.
www.l.google.com canonical name = www-china.l.google.com.
Name:   www-china.l.google.com
Address: 64.233.189.147
Name:   www-china.l.google.com
Address: 64.233.189.99
Name:   www-china.l.google.com
Address: 64.233.189.104

说明本机DNS正常, iptables 允许53这个端口的访问。
7、iptables对ftp的设置
现在我开始对ftp端口的设置,按照我们以前的视频,添加需要开放的端口
ftp连接端口有2个 21 和 20 端口,我现在添加对应的规则。

iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT

好,这样就添加完了,我们用浏览器访问一下ftp,出现超时。

所以我刚才说 ftp 是比较特殊的端口,它还有一些端口是 数据传输端口,
例如目录列表, 上传 ,下载 文件都要用到这些端口。

而这些端口是 任意 端口。。。 这个 任意 真的比较特殊。

如果不指定什么一个端口范围, iptables 很难对任意端口开放的,
如果iptables允许任意端口访问, 那和不设置防火墙没什么区别,所以不现实的。

那么我们的解决办法就是 指定这个数据传输端口的一个范围。

下面我们修改一下ftp配置文件。

我这里使用vsftpd来修改演示,其他ftp我不知道哪里修改,大家可以找找资料。

[root@localhost root] vi /etc/vsftpd.conf

在配置文件的最下面 加入

pasv_min_port=30001
pasv_max_port=31000

然后保存退出。

这两句话的意思告诉vsftpd, 要传输数据的端口范围就在30001到31000 这个范围内传送。

这样我们使用 iptables 就好办多了,我们就打开 30001到31000 这些端口。

 

iptables -A INPUT -p tcp --dport 30001:31000 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 30001:31000 -j ACCEPT

service iptables save

最后进行保存, 然后我们再用浏览器范围下 ftp。可以正常访问

用个账号登陆上去,也没有问题,上传一些文件上去看看。

看到了吧,上传和下载都正常。。 再查看下 iptables 的设置

 

[root@localhost root] iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0          tcp dpt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0          tcp dpt:21
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0          tcp dpt:20
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0          tcp dpts:30001:31000

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0          tcp spt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0          tcp spt:21
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0          tcp spt:20
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0          tcp spts:30001:31000

这是我为了演示ftp特殊端口做的简单规则,大家可以添加一些对数据包的验证
例如 -m state –state ESTABLISHED,RELATED  等等要求更加高的验证

为PHP增加纯真IP数据库(qqwry)支持

 当我们的网站需要根据IP来查询IP来源时,我们需要一个IP数据库,而国内最好的IP数据库当属“纯真IP数据库”了。为了读取“纯真IP数据库”中的数据,一般情况下我们需要写一段PHP程序,而目前Discuz!中就有这样的PHP代码,我们可以直接拿来使用。这样的做法对于一般网站来说已经够用了,但是对于计数器网站,有大量的IP查询事务,这时候使用纯PHP代码的方式就显得效率低下了。有没有更高效的方法呢?答案当然是肯定的。国内就有人写出了这样的PHP扩展,并且此扩展已经登录在PECL网站了。此扩展的名字叫做QQWRY,网站地址:http://http://pecl.php.net/package/qqwry/

qqwry的安装

 qqwry的安装方法与一般PHP扩展的安装方法一样:

wget http://pecl.php.net/get/qqwry-0.1.0.tgz
tar zxvf qqwry-0.1.0.tgz
cd qqwry-0.1.0
./configure --with-php-config=/usr/local/web/php/bin/php-config
make
make install

然后在php.ini中加入qqwry支持

extension = "qqwry.so"

 然后,重启php即可实现PHP的纯真IP数据库支持了。相比纯PHP代码的实现,此扩展的效率是其的6至10倍。

 qqwry的使用

 使用方法很简单,首先就是实例化,传入纯真数据库的文件路径,然后调用q方法。该方法返回一个数组,第一个值为所属区域,第二个值为更详细的地址。下面的iconv是把数据从GB2312转到UTF-8,如果你的站点是用GB2312,那么这一步是不需要的。

$qqwry=new qqwry('QQWry.Dat');

list($addr1,$addr2)=$qqwry->q('127.0.0.1');
$addr1=iconv('GB2312','UTF-8',$addr1);
$addr2=iconv('GB2312','UTF-8',$addr2);
echo $addr1,'|',$addr2,"\n";

$arr=$qqwry->q('222.216.47.4');
$arr[0]=iconv('GB2312','UTF-8',$arr[0]);
$arr[1]=iconv('GB2312','UTF-8',$arr[1]);
echo $arr[0],'|',$arr[1],"\n";

$arr=$qqwry->q('64.233.187.99');
$arr[0]=iconv('GB2312','UTF-8',$arr[0]);
$arr[1]=iconv('GB2312','UTF-8',$arr[1]);
echo $arr[0],'|',$arr[1],"\n";

输出如下:

本机地址|
广西南宁市|(青秀区)电信ADSL
美国|加利福尼亚州Google公司

绝对有效的 Centos 5.5 关闭IPV6方法!【2011年4月22日修正版本】

5.4及其以上版本的CentOS系统应该如下方法禁用ipv6:

可以修改下面两个文件以阻止IPv6内核模块的加载:
/etc/modprobe.conf – 内核模块配置文件
/etc/sysconfig/network – 网络配置文件

第一步:

vim /etc/modprobe.conf

在其中加入下面这一行,

install ipv6 /bin/true

保存并退出。

第二步:

vim /etc/sysconfig/network

在其中加入下面配置项:

NETWORKING_IPV6=no
IPV6INIT=no

保存并退出文件,重启网络与服务器:

service network restart
reboot

如果想检查当前IPv6是否已禁用,可以使用下列命令:

lsmod | grep ipv6
ifconfig -a

注:以上方法在CentOS5.5验证通过,同样适用于RHEL和Fedora。

SSH-KeyGen 的用法

假设 A 为客户机器,B为目标机;

要达到的目的:
A机器ssh登录B机器无需输入密码;
加密方式选 rsa|dsa均可以,默认dsa

做法:
1、登录A机器
2、ssh-keygen -t [rsa|dsa],将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub
3、将 .pub 文件复制到B机器的 .ssh 目录, 并 cat id_dsa.pub >> ~/.ssh/authorized_keys
4、大功告成,从A机器登录B机器的目标账户,不再需要密码了;

ssh-keygen做密码验证可以使在向对方机器上ssh ,scp不用使用密码.
具体方法如下:
ssh-keygen -t rsa
然后全部回车,采用默认值.

这样生成了一对密钥,存放在用户目录的~/.ssh下。
将公钥考到对方机器的用户目录下,并拷到~/.ssh/authorized_keys中。

要保证.ssh和authorized_keys都只有用户自己有写权限。否则验证无效。

备份VPS全部数据的脚本!

需要修改的部分在上面,所有部分都有说明不需要的功能自己用 # 注释掉!!

#!/bin/bash
#你要修改的地方从这里开始
WEB_DATA=/var/data/html                         #要备份的网站数据
mysql_DATA=/var/data/mysql                      #要备份的数据库目录
nginx_DATA=/usr/local/web/nginx/conf      #要备份的NGINX配置文件
PHP_Config=/usr/local/web/php/etc         #要备份的PHP配置文件
Ftp=/usr/local/web/pureftpd               #要备份的PURE-FTPD
Config=/etc/init.d/                             #要备份的服务文件
ppp=/etc/ppp                                    #要备份的PPP(pptp)账号数据
Folder=/home/backup                             #备份文件夹
#你要修改的地方从这里结束
#把时间加入变量
Date=$(date +"%Y%m%d")

#手动备份删除今日数据
rm -fr /$Folder/$Date.tar.gz

#删除5天前的数据
rm -fr /$Folder/$(date -d -5day +"%Y%m%d").tar.gz

#创建今天的备份目录
mkdir -p /$Folder/$Date
#停止服务
/etc/init.d/mysqld stop

#打包mysql目录
cd $mysql_DATA
tar zcf /$Folder/$Date/mysql.tar.gz ./*

#运行服务
/etc/init.d/mysqld start
/etc/init.d/php-fpm reload
/etc/init.d/nginx reload

#压缩网站数据
cd $WEB_DATA
tar zcf /$Folder/$Date/web.tar.gz ./*

#压缩NGINX配置文件
cd $nginx_DATA
tar zcf /$Folder/$Date/domian.tar.gz ./*

#压缩PHP配置文件
cd $PHP_Config
tar zcf /$Folder/$Date/php.tar.gz ./*

#压缩FTP Server文件
cd $Ftp
tar zcf /$Folder/$Date/ftp.tar.gz ./*

#压缩服务文件
cd $Config
tar zcf /$Folder/$Date/d.tar.gz ./nginx ./mysqld ./php-fpm ./vnstat

#复制SSHD配置文件
cp /etc/ssh/sshd_config /$Folder/$Date

#复制MYSQL配置文件
cp /etc/my.cnf /$Folder/$Date

#打包PPP配置以及PPTP拨号帐号
cd $ppp
tar zcf /$Folder/$Date/ppp.tar.gz ./*

#整体打包
cd /$Folder/
tar zcf /$Folder/$Date.tar.gz ./$Date/*

#删除临时目录
rm -fr /$Folder/$Date

#更改所有者
chown -R www:www /$Folder

#脚本完成退出,防止僵尸进程
exit

Nginx Webserver SSL网站配置.

以下为Nginx 1.3 SSL网站使用的配置文件.

server {
	listen 443 ssl spdy; #编译时必须打开SPDY, NGINX版本 1.3+
	server_name example.com;
	index index.html index.htm index.php;
	root  /home/wwwroot/example;

	ssl on; #打开SSL
	ssl_certificate certs/example.crt; #设置证书
	ssl_certificate_key certs/example.key; #设置KEY文件
	ssl_session_timeout 5m;

	ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; #只打开SSLV3 和TLSV1,V1.1,V1.2,不打开老的SSLV2
	ssl_prefer_server_ciphers   on;
	ssl_ciphers  HIGH:!aNULL:!MD5;
	ssl_session_cache  builtin:1000  shared:SSL:10m; #SSL会话缓存加速
	spdy_headers_comp 5;

	location ~ .*\.(php|php5)?$ {
		include php.conf;
	}
}

server { #这里是自动跳转到SSL的部分.
	listen 80;
	server_name example.com www.example.com;
	rewrite ^/(.*) https://example.com/$1 permanent;
}

LINUX/UNIX 下安装pureftpd+mysql验证

一.修正安装环境
LINUX:

vi /etc/ld.so.conf

增加你MYSQL LIB的地址,例如我的:

/usr/local/webserver/mysql/lib/mysql

运行ldconfig更新/etc/ld.so.cache即可

UNIX(FreeBSD):
执行

cp /usr/local/webserver/mysql/lib/mysql/*.* /usr/lib/

把MYSQL LIB文件拷贝到LIB文件夹下!
二.开始安装

wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.29.tar.gz
tar zvxf pure-ftpd-1.0.29.tar.gz
cd pure-ftpd-1.0.29
./configure --prefix=/usr/local/webserver/pureftpd --with-mysql=/usr/local/webserver/mysql --with-puredb --with-paranoidmsg --with-shadow --with-welcomemsg --with-uploadscript --with-cookie --with-virtualchroot --with-virtualhosts --with-virtualroot --with-diraliases --with-quotas --with-sysquotas --with-ratios --with-ftpwho --with-throttling --with-rfc2640 --with-language=simplified-chinese

如果你的mysql是编译安装的,需要在–with-mysql加上你的安装目录,比如–with-mysql=/usr/local/webserver/mysql

make
make check
make install

mkdir /usr/local/webserver/pureftpd/etc/
cp configuration-file/pure-config.pl /usr/local/webserver/pureftpd/bin/
cp configuration-file/pure-ftpd.conf /usr/local/webserver/pureftpd/etc/
chmod +x /usr/local/webserver/pureftpd/bin/pure-config.pl
cd ..

这样安装就完成了,还有问题可以看 //www.byte128.com/blog/2010-11/108.html 这篇文章!