yum/wget使用http proxy

内网的Linux服务器无法直接使用yum和wget等工具,要更新系统或者安装软件每次都破费周折,好在yum和wget都支持使用代理,所以我们可以在一个可以上网的服务器上架设一个http proxy服务(比如squid),然后内网服务器通过这个跳板与Internet之间通信。

1.yum使用http proxy的设置,是修改/etc/yum.conf,追加以下内容:

proxy=http://你的http proxy服务器的IP或者主机名:端口
proxy_username=你的http proxy的用户名
proxy_password=你的http proxy的密码

继续阅读

发表在 Linux Tips | 标签为 , , , | 留下评论

禁止SCP用户登录Shell

其实这个问题在我以前的博客rsync同步备份服务器中提到过类似的问题,那里讲的是rsync采用SSH的无密码密钥远程备份只允许执行rsync命令,现在我们来完善一下那个方案。
首先我们创建一个shell脚本,比如路径为/usr/local/bin/scp-rsync-only.sh,内容如下:

#!/bin/bash
case $SSH_ORIGINAL_COMMAND in
 'scp'*)
    $SSH_ORIGINAL_COMMAND
    ;;
 'rsync'*)
    $SSH_ORIGINAL_COMMAND
    ;;
 *)
    echo "Reject"
    ;;
esac

继续阅读

发表在 Linux Tips | 标签为 , | 评论关闭

MySQL的ibdata1文件越来越大的解决方法

一个VPS的MySQL使用了innodb存储引擎,由于我的程序大量的使用了事务处理,所以虽然数据不是很多,但是ibdata1越来越大,即使删除后数据它也是不会变小的,VPS硬盘空间本身就没多大,所以我决定来给他瘦身一下。
*该操作有一定的危险性,操作的时候一定要先备份,并且最好在测试机上实验。
操作的主要步骤如下: 继续阅读

发表在 MySql配置 | 标签为 , | 评论关闭

Nagios安装

Nagios是一个非常常用的监控软件,我个人认为他最大的特点就是能够及时的监控服务的可用性,我叫他死活检知,这样当服务或者监控对象出现问题的时候,能够快速通过邮件等方式通知管理员,从而做出对应的处理。
这个软件一开始只有一个免费的版本,现在除了免费版本还有付费的版本,功能更强大,接下来,我们来按照官方的手册来简单的安装和使用它的免费版本。 继续阅读

发表在 系统监控 | 标签为 , | 评论关闭

Oracle刷新统计信息

昨天oracle执行数据同步很慢,于是去尝试优化那些跑着慢的存储过程,结果累了半天,发现过程已经很精简了,查询速度很快,无奈下班前做了下执行很慢的那些过程的表分析。结果今天早上一看,执行速度奇快。 继续阅读

发表在 DBA专栏 | 留下评论

如何调整oracle的SGA

Oracle SGA,系统全局区(System Global Area),SGA的大小对oracle的性能有直接影响,那么应该如何调整SGA的大小呢?

调整之前需要明确一个常识:32位版本的oracle最大支持1.75GB的SGA,如果oracle版本是32位的,那么你就不必尝试去调整大于1.7GB的SGA了。 继续阅读

发表在 DBA专栏 | 留下评论

Loop设备不够导致Xen虚拟机启动失败

今天,在管理Xen虚拟机的时候遇到了问题,新建了一台虚拟机后无法启动安装系统,查看了Xen的日志,以及手动启动的时候,都有如下错误:
Error: Device 5632 (vbd) could not be connected. /etc/xen/scripts/block failed; error detected.
这错误,让我直接摸不着头脑,于是修改设置继续启动尝试,突然发现,在没加载ISO镜像文件的时候,居然能启动,脑子里一个念头闪过,莫非是镜像文件的问题,导致无法加载? 继续阅读

发表在 Linux Tips, 虚拟化技术 | 标签为 , , | 2 条评论

libvirt API获得Xen虚拟机CPU使用率

最近在用Nagios监控Xen PV虚拟机的时候出现了问题,在被监控的服务器上是采用nrpe来采集数据的。但是在进程里无法看到PV虚拟机的进程,虽然可以通过xm top vpsname的方式来获取名为vpsname虚拟机的cpu使用率情况,但是不便于采集数据,通过xm list可以采集到cpu时间,根据CPU时间的差值,可以计算CPU使用率,可是该命令只能root执行,因为该命令可以进行关闭,重启虚拟机等重要操作,所以如果把权限给了nrpe,将可能造成严重的安全问题。
幸好livirt提供了API,所以我打算尝试用API写一个Nagios的插件来满足的我的需求,我的想法就是分别2次获得虚拟机的CPU时间,并分别记录2次取得数据时的系统时间,然后根据差值来计算,在理论上是存在一些误差的。

1.要使用API,首先需要安装libvirt-devel

[root@test ~]# yum -y install libvirt-devel

2.我的代码如下,文件名为vCpu.c

/**
 * Program Name: vCpu.c
 * Author: steptodream
 * Description:A simple plugin to get vps cpu usage
 *             for nagios(nrpe) by libvirt api
 * Compile:gcc -o vCpu vCpu.c -lvirt
 */
#include <stdlib .h>
#include <stdio .h>
#include <libvirt /libvirt.h>

/* define the exit status for nagios */
#define OK       0
#define WARNING  1
#define CRITICAL 2
#define UNKNOWN  3

/* get cpu time of the given name */
double getCpuTime(char *vpsName,virConnectPtr conn) {
    virDomainInfo info;
    virDomainPtr domain = NULL;
    int ret;

    /* Find the domain of the given name */
    domain = virDomainLookupByName(conn, vpsName);
    if (domain == NULL) {
        printf("Failed to find the vps called %s\n", vpsName);
        exit(OK);
    }

    /* Get the information of the domain */
    ret = virDomainGetInfo(domain, &info);
    virDomainFree(domain);

    if (ret < 0) {
        printf("Failed to get information for %s\n", vpsName);
        exit(OK);
    }

    return info.cpuTime;
}

int main(int argc,char * argv[])
{
    char *vpsName;             /* vps name */
    int  interval = 1;         /* check interval */
    double warning;            /* warning value */
    double critical;           /* critical value */
    double cpuUsage;           /* cpu usage of the vps */
    struct timeval startTime;  /* time of the first time to get cpu time */
    struct timeval endTime;    /* time of the second time to get cpu time */
    int realTime;              /* real interval between two times */
    long long startCpuTime;    /* cpu time of the first time */
    long long endCpuTime;      /* cpu time of the second time */
    int  cpuTime;              /* value of startCpuTime - endCpuTime */
    char *output;              /* output data for nagios */
    int  ret;                  /* exit status for nagios */
    virConnectPtr conn;        /* connection pointer */

    switch (argc){
        case 5:
             interval = atoi(argv[4]);
        case 4:
             vpsName  = argv[1];
             warning  = atof(argv[2]);
             critical = atof(argv[3]);
             break;
        default:
             printf("Usage:vCpu <vName> <warning> <critical> [interval]\n\n");
             return OK;
    }

    /* connect to local Xen Host */
    conn = virConnectOpenReadOnly(NULL);
    if (conn == NULL) {
        printf("Failed to connect to local Xen Host\n");
        return OK;
    }

    /* get cpu time the first time */
    startCpuTime = getCpuTime(vpsName, conn);

    /* get start time */
    if (gettimeofday(&startTime, NULL) == -1) {
        printf("Failed to get start time\n");
        return OK;
    }

    /* wait for some seconds  */
    sleep(interval);

    /* get cpu time the second time */
    endCpuTime = getCpuTime(vpsName, conn);

    /* get end time */
    if (gettimeofday(&endTime, NULL) == -1) {
        printf("Failed to get end time\n");
        return OK;
    }

    /* colose connection */
    virConnectClose(conn);

    /* calculate the usage of cpu */
    cpuTime = (startCpuTime - endCpuTime) / 1000;
    realTime = 1000000 * (startTime.tv_sec - endTime.tv_sec) +
        (startTime.tv_usec - endTime.tv_usec);
    cpuUsage = cpuTime / (double)(realTime);

	/* display cpuUsage by percentage */
	cpuUsage *= 100;
	
    /* make output data and exit status for nagios*/
    if (cpuUsage > critical) {
        output = "CRITICAL";
        ret    = CRITICAL;
    } else if (cpuUsage > warning){
        output = "WARNING";
        ret    = WARNING;
    } else {
        output = "OK";
        ret    = OK;
    }
    printf("%s CPU:%.2f%|CPU=%.2f",output,cpuUsage,cpuUsage);

    return ret;
}

继续阅读

发表在 Linux基础, 开源工具使用, 系统监控 | 标签为 , , , , | 4 条评论

Perl通过Socks代理发送邮件

前段时间写了一篇关于Perl发送邮件的博客,有读者联系我说,希望能通过Socks代理的方式发送,并给了我一些参考文件,今天抽空测试了一下,要使用Socks代理连接,我们需要Net::SOCKS这个模块,基本代码如下。

#!/usr/bin/perl -w
use strict;
use Net::SMTP_auth;
use Net::SOCKS;

#smtp邮件服务器和端口
my $smtpHost = 'smtp.163.com';
my $smtpPort = '25';
my $sslPort = '465';

#auth info to connect socks server
my $socksServer = 'x.x.x.x';
my $socksUser   = 'username';
my $socksPass   = 'password';
my $socksPort   = '1080';

#smtp服务器认证用户名密码(就是你登陆邮箱的时候的用户名和密码)
my $username = 'user@163.com';
my $passowrd = 'password';
 
#邮件来自哪儿,要去哪儿,邮件标题
my $from = 'from@163.com';
my $to   = 'to@somedomain.com';
my $subject = '[Notice]TEST MAIL';
 
#设置邮件header
my $header = << "MAILHEADER";
From:$from
To:$to
Subject:$subject
Mime-Version:1.0
Content-Type:text/plain;charset="UTF-8"
Content-Trensfer-Encoding:7bit
 

MAILHEADER
 
#设置邮件内容
my $message = << "MAILBODY";
TEST MAILBODY
MAILBODY
 
#获得邮件域名部分,用于连接的时候表名身份
my @helo = split /\@/,$from;
 
#连接到socks服务器
my $sock = new Net::SOCKS(socks_addr => $socksServer,
                socks_port => $socksPort,
                user_id => $socksUser,
                user_password => $socksPass,
                protocol_version => 5);
				
#通过socks代理与smtp服务器建立连接
my $sockfd = $sock->connect(
		peer_addr => $smtpHost, 
		peer_port => $smtpPort
) || die "通过Socks代理连接到$smtpHost失败!";


#通过socks代理与smtp的连接句柄,与smtp服务器通信并验证用户
my $smtpHandle = Net::SMTP_auth->new_from_fd(
                $sockfd,
                'r+'
                ) or die("Error:拷贝连接handle失败!");
$smtpHandle->getline();
$smtpHandle->hello($helo[1]);
$smtpHandle->auth('LOGIN',$username,$passowrd) or die("Error:认证失败!");
 
#发送邮件
$smtpHandle->mail($from);
$smtpHandle->to($to);
$smtpHandle->data();
$smtpHandle->datasend($header);
$smtpHandle->datasend($message);
$smtpHandle->dataend();
$smtpHandle->quit();
 
print "OK";
$sock->close();
exit 0;
发表在 Linux Tips, Linux基础, Perl相关 | 标签为 , , , | 留下评论

Python发送邮件

上一篇介绍了Perl发送邮件的方法,接下来我们看看同样的例子,如何使用Python发送邮件,这里给出简单的代码,需要你自己根据需求去完善。

#!/usr/bin/python
import smtplib
from email.MIMEText import MIMEText
from email.Utils import formatdate
from email.Header import Header

#发送邮件的相关信息,根据你实际情况填写
smtpHost = 'smtp.163.com'
smtpPort = '25'
sslPort  = '465'
fromMail = 'user@163.com'
toMail   = 'user@somedomain.com'
username = 'user@163.com'
password = 'password'

#邮件标题和内容
subject  = u'[Notice]hello'
body     = u'hello,this is a mail from ' + fromMail

#初始化邮件
encoding = 'utf-8'
mail = MIMEText(body.encode(encoding),'plain',encoding)
mail['Subject'] = Header(subject,encoding)
mail['From'] = fromMail
mail['To'] = toMail
mail['Date'] = formatdate()

try:
	#连接smtp服务器,明文/SSL/TLS三种方式,根据你使用的SMTP支持情况选择一种
	#普通方式,通信过程不加密
	smtp = smtplib.SMTP(smtpHost,smtpPort)
	smtp.ehlo()
	smtp.login(username,password)

	#tls加密方式,通信过程加密,邮件数据安全,使用正常的smtp端口
	#smtp = smtplib.SMTP(smtpHost,smtpPort)
	#smtp.ehlo()
	#smtp.starttls()
	#smtp.ehlo()
	#smtp.login(username,password)

	#纯粹的ssl加密方式,通信过程加密,邮件数据安全
	#smtp = smtplib.SMTP_SSL(smtpHost,sslPort)
	#smtp.ehlo()
	#smtp.login(username,password)

	#发送邮件
	smtp.sendmail(fromMail,toMail,mail.as_string())
	smtp.close()
	print 'OK'
except Exception:
	print 'Error: unable to send email'

继续阅读

发表在 Python相关 | 标签为 , , , , | 2 条评论