Category: Linux

  • nginx由0.8.54无缝升级0.9.5 | nginx自动更新脚本

    正好有一台测试机
    试试nginx升级
    原来版本是nginx0.8.54

    下载最新版的nginx
    #wget http://nginx.org/download/nginx-0.9.5.tar.gz
    解压缩
    #tar vxzf nginx-0.9.5.tar.gz
    新版本编译
    root@debian:~/nginx-0.9.5# cd nginx-0.9.5/
    root@debian:~/nginx-0.9.5# ./configure
    root@debian:~/nginx-0.9.5# make
    make -f objs/Makefile
    make[1]: Entering directory `/root/nginx-0.9.5′
    gcc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Wunused-function -Wunused-variable -Wunused-value -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \……………………中间省略………………………………………….
    make[1]: Leaving directory `/root/nginx-0.9.5′
    make -f objs/Makefile manpage
    make[1]: Entering directory `/root/nginx-0.9.5′
    sed -e “s|%%PREFIX%%|/usr/local/nginx|” \
    -e “s|%%PID_PATH%%|/usr/local/nginx/logs/nginx.pid|” \
    -e “s|%%CONF_PATH%%|/usr/local/nginx/conf/nginx.conf|” \
    -e “s|%%ERROR_LOG_PATH%%|/usr/local/nginx/logs/error.log|” \
    < man/nginx.8 > objs/nginx.8
    make[1]: Leaving directory `/root/nginx-0.9.5′
    编译完成

    开始升级

    root@debian:~/nginx-0.9.5# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

    关键 拷贝objs下的nginx

    root@debian:~/nginx-0.9.5# cp objs/nginx /usr/local/nginx/sbin/

    关键 升级

    root@debian:~/nginx-0.9.5# make upgrade
    /usr/local/nginx/sbin/nginx -t
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
    sleep 1
    test -f /usr/local/nginx/logs/nginx.pid.oldbin
    kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

    查看版本

    root@debian:~/nginx-0.9.5# /usr/local/nginx/sbin/nginx -v
    nginx: nginx version: nginx/0.9.5

    确实是无缝升级的,中间没有停顿

    ———————————nginx自动更新脚本 update 2011-06-01————————————–
    root@debian:~# vim nginxupdate.sh

    #!/bin/bash
    #for nginx updating
    version=`curl http://nginx.org/en/download.html | sed 's/.tar.gz.*$//g' | sed 's/^.*download\/nginx-//g'`
    wget http://nginx.org/download/nginx-${version}.tar.gz
    tar vxzf nginx-${version}.tar.gz
    cd nginx-${version}/
    ./configure
    make
    mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
    cp objs/nginx /usr/local/nginx/sbin/
    make upgrade
    cd ..
    rm -rf nginx-${version}
    rm -f nginx-${version}.tar.gz

    在cron里加入,每个礼拜更新一次

    0 0 * * 0 bash  /root/nginxupdate.sh
  • iptables设置规则

    用iptables命令是及时生效的,用两台机很便于测试学习

    filter是最常用的表,在filter表中最常用的三个目标是ACCEPT、DROP和REJECT。

    DROP会丢弃数据包,不再对其进行任何处理。REJECT会把出错信息传送至发送数据包的主机。

    比如:

    iptables -I INPUT -s 219.230.xxx.xxx -j DROP

    这样ping会直接ping不通,无任何信息;

    iptables -I INPUT -s 219.230.xxx.xxx -j REJECT

    目标主机不能到达 “Destination Host Unreachable”信息说明对方主机不存在或者没有跟对方建立连接。

    清除已有iptables规则

    iptables -F
    iptables -X
    iptables -Z

    开放指定的端口

    #允许本地回环接口(即运行本机访问本机)

    iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

    # 允许已建立的或相关连的通行

    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    #允许所有本机向外的访问

    iptables -A OUTPUT -j ACCEPT

    # 允许访问22端口

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

    #允许访问80端口

    iptables -A INPUT -p tcp --dport 80 -j ACCEPT

    #允许FTP服务的21和20端口

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

    #如果有其他端口的话,规则也类似,稍微修改上述语句就行
    #禁止其他未允许的规则访问

    iptables -A INPUT -j REJECT
    iptables -A FORWARD -j REJECT

    屏蔽IP

    #屏蔽单个IP的命令是

     iptables -I INPUT -s 123.45.6.7 -j DROP

    #封整个段即从123.0.0.1到123.255.255.254的命令

     iptables -I INPUT -s 123.0.0.0/8 -j DROP

    #封IP段即从123.45.0.1到123.45.255.254的命令

     iptables -I INPUT -s 124.45.0.0/16 -j DROP

    #封IP段即从123.45.6.1到123.45.6.254的命令是

     iptables -I INPUT -s 123.45.6.0/24 -j DROP

    查看已添加的iptables规则

    简单查看 #iptables –list

    iptables -L -n

    v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
    x:在 v 的基础上,禁止自动单位换算(K、M)
    n:只显示IP地址和端口号,不将ip解析为域名

    用iptables做SNAT的时候,查看需要再加 -t nat

    iptables -L -t nat

    删除已添加的iptables规则

    将所有iptables以序号标记显示,执行:

    iptables -L -n --line-numbers

    比如要删除INPUT里序号为8的规则,执行:

    iptables -D INPUT 3  (注意大小写)

    ubuntu下面iptables的开机启动及规则保存

    https://help.ubuntu.com/community/IptablesHowTo

  • ssh的key的生成

    生成密钥对

    使用ssh-keygen来生成密钥对
    (具体参数请参阅man ssh-keygen)

    ssh-keygen -b 1024 -t rsa

    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    5c:81:74:f3:00:97:65:8a:09:ce:0e:43:ee:d7:66:72 root@debian
    The key’s randomart image is:
    +–[ RSA 1024]—-+
    | . ..oo*oo |
    | o o ..=.B |
    | + o o o . |
    | . + o . |
    | . + E |
    | . = |
    | |
    | |
    | |
    +—————–+

    无交互生成密钥对

    ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N ""

    密钥分发

    方法1:

    刚才生成了一对密钥,把私钥放在自己的机器上的~/.ssh/目录下并保证访问权限是“-rw——-”(即600)。私钥永远不要给别人。

    再把生成的公钥放在要连接的远程主机的~/.ssh/目录下并改名为authorized_keys,并且保证文件除了属主外没有被人修改的权限“-rw——-”(即600)。公钥无需保密

    方法2:

    linux内置了ssh-copy-id命令,直接使用

    ssh-copy-id [email protected]

    然后按提示输入密码之后,此脚本会自动将公钥copy到目标机器用户目录下的authorized_keys中并修改权限。对于一个key管理大批量主机时自动化分发。其实就是方法1的脚本实现。

    如果目标主机ssh端口不是22,公钥也不是id_rsa.pub,可以指定端口和公钥

    ssh-copy-id -i /home/secure.pub "-p 3322 [email protected]"

    测试

    ssh,scp使用密钥登陆(-i指定私钥路径)

    ssh -i jpuyy-key [email protected]
    scp -i jpuyy-key filename [email protected]:/home/

    更改key的passphrase

    上面在生成密钥对的时候会提示输入密钥,需要更改id_rsa文件的密码时,使用如下命令即可更改。

    ssh-keygen -f id_rsa -p

    判断一对公私钥是不是一对

    diff <( ssh-keygen -y -e -f "~/.ssh/id_rsa" ) <( ssh-keygen -y -e -f "ec2.demo.pub" )
    

    如果 diff 有输出则不是一对

    验证 cert 是不是合法

    ssh-keygen -L -f ~/.ssh/id_rsa-cert.pub
    
  • ubuntu工具之apt的使用 | apt-spy的应用

    办公室一台弄过来的电脑
    装了debian6.0

    debian/ubuntu 是好东西,也是我平时用的最多的linux

    apt给人们带来的很大的方便

    总是找源的问题
    还是不想麻烦了,以后就用apt-spy解决找源
    到这里去下载对应的版本http://packages.debian.org/sid/i386/apt-spy/download

    下好后
    apt-spy -d unstable -a asia -t 5
    ……………………………………………………………………………………………………
    Tips

    * To retrieve the latest list of Debian mirrors, run (as root)

    # apt-spy update

    * To find the fastest mirror in North America for testing, run

    # apt-spy -d testing -a north-america

    * To find the fastest mirror in Germany for stable, run

    # apt-spy -d stable -s de

    FAQ’s

    Q. What are the region (-d argument) codes?

    A. africa, asia, europe, north-america, oceania, and south-america

    Q. What if I want apt-spy to only text x mirrors?

    A. Add the argument -e x. For example, apt-spy -d unstable -a asia -e 5 would test 5 mirrors hosting unstable, and located in Asia.

    把sources.list覆盖
    #cat /etc/apt/sources.list.d/apt-spy.list > /etc/apt/sources.list

    接下来想把这两条命令写到一个bash里,并用cron每天执行一次
    #vim /root/renewapt.sh

    #for update /etc/sources.list using apt-spy
    #!/bin/bash
    apt-spy update
    apt-spy -d unstable -a asia -t 5
    cat /etc/apt/sources.list.d/apt-spy.list > /etc/apt/sources.list

    #crontab -e
    0 0 * * * bash /root/renewapt.sh

  • lsof命令详解

    lsof – list open files显示程序打开的文件(linux下所有的文件,程序,进程都是文件)

    root用户才能执行lsof命令,普通用户会被拒绝显示或无显示结果。

    根据实例学习用法:

    显示已经打开的文件

    lsof

    显示所有打开的internet链接(-i),unix socket (-U)

    lsof -i -U

    显示被进程1197打开的ipv4网络文件,可以看到是pptpd的进程,正在监听状态

    # lsof -i 4 -a -p 1197
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    pptpd 1197 root 6u IPv4 4181 0t0 TCP *:1723 (LISTEN)

    显示打开ipv6的网络文件

    # lsof -i 6

    显示使用tcp协议,22端口(或ssh,在/etc/service中)的ipv4和ipv6文件

    # lsof -i tcp:22
    或
    # lsof -i tcp:ssh
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    sshd 14873 root 3u IPv4 4100995 0t0 TCP ibm.jpuyy.com:ssh->114.221.19.245:56544 (ESTABLISHED)
    sshd 17248 root 3r IPv4 4149257 0t0 TCP ibm.jpuyy.com:ssh->114.221.19.245:52610 (ESTABLISHED)
    sshd 27849 root 3u IPv4 3235729 0t0 TCP *:ssh (LISTEN)
    sshd 27849 root 4u IPv6 3235731 0t0 TCP *:ssh (LISTEN)

    显示某个命令打开的文件,如pptpd

    # lsof -c pptpd

    显示和ip:1.2.3.4有关的打开的文件

    # lsof -i @1.2.3.4

    显示和ip:1.2.3.4有关的tcp协议ftp

    # lsof -i [email protected]:ftp

    显示和jpuyy有关的打开的文件

    # lsof -u jpuyy

    不断显示连到jpuyy.com的80端口的打开的文件,(default fifteen)

    # lsof -i @jpuyy.com:80 -r

    显示/dev/sdb1打开的文件

    # lsof /dev/sdb1

     

    lsof |sort -k7 -n

  • Mysql忘记密码时重置密码

    方法一:

    一个中心:停止服务,载入安全模式

    killall -TERM mysqld

    然后

    mysqld --skip-grant-tables &

    两个基本点:更新user表,刷新权限

    use mysql;
     update user set password=password("newpass") where user="root";
     flush privileges;

    如果不方便用mysql的cli界面交互
    调用mysqladmin即可

    mysqladmin -u root flush-privileges password "newpassword"

     

    方法二(debian亲测):

    直接使用/etc/mysql/debian.cnf文件中[client]节提供的用户名和密码 备用

    mysql -u debian-sys-maint -p
    Enter password: <输入[client]节的密码>

    mysql> show databases;

    mysql> use mysql;

    mysql> show tables;

    这个时候使用user表

    mysql> UPDATE user SET Password=PASSWORD(‘newpassword’) where USER=’root’;

    Query OK, 3 rows affected (0.00 sec)
    Rows matched: 3  Changed: 3  Warnings: 0
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    mysql> quit

    # mysql -u root -p
    Enter password: <输入新设的密码newpassword>
    mysql>

    方法三(centos 6.2亲测,等同于方法一):

    1.确认服务器处于安全的状态,在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护,不连网操作最好,实在不行挑个好时候,操作要快
    2.修改MySQL的登录设置:

    # vi /etc/my.cnf

    在[mysqld]的段中加上一句:skip-grant-tables
    例如:

    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    skip-grant-tables

    保存并且退出vi。
    3.重新启动mysqld

    # /etc/init.d/mysqld restart
    Stopping MySQL: [ OK ]
    Starting MySQL: [ OK ]

    4.登录并修改MySQL的root密码

    [root@vps ~]# mysql
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 2
    Server version: 5.1.61 Source distribution
    Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql> use mysql;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    Database changed
    mysql> update user set password=password('jpuyy') where user = 'root';
    Query OK, 2 rows affected (0.00 sec)
    Rows matched: 2 Changed: 2 Warnings: 0
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    mysql> quit
    Bye

    5.将MySQL的登录设置修改回来

    # vi /etc/my.cnf

    将刚才在[mysqld]的段中加上的skip-grant-tables删除
    保存并且退出vi。
    6.重新启动mysqld

    # /etc/init.d/mysqld restart
    Stopping MySQL: [ OK ]
    Starting MySQL: [ OK ]

    附加windows下的重置方法

    开始-运行-cmd

    net stop mysql

    然后进入到mysql的安装位置,运行如下命令

    mysqld-nt.exe –skip-grant-tables

    再打开一个cmd窗口

    运行msyql -u root -p,不用输入密码即可进入

    > use mysql

    > UPDATE user SET Password=PASSWORD(‘newpassword’) where USER=’root’;

    >flush privileges;

    最后在任务管理器里将mysql-nt的任务和进程都停止掉(如果不停掉会出现“mysql服务无法启动。系统出错。系统发生1067错误。进程意外中止。”),接下来

    net start mysql

    密码重置完成。