Skip navigation.

极湖

无不用其“极”

Posts tagged with "Linux"

用LWP::UserAgent实现“Web浏览自动化”

, ,

想用Perl做一个自动登录、自动发送请求并取得执行结果的程序,这时候通常要用到LWP::UserAgent。

做了一个POST数据的例子如下:
#!/usr/bin/perl 

use LWP::UserAgent;
use HTTP::Request::Common qw(POST);

my %ua_option = (
    agent => "Mozilla/5.0", 
    timeout => 180,
);

my $ua = LWP::UserAgent->new(%ua_option);

my $url = 'http://your.domain.here/script_name.cgi'; # or 'https://...';

my %form;
$form{USER_ID} = 'user_id';
$form{PASSWORD} = 'password';

my $req  = POST($url, [%form]);

my $res = $ua->request($req);

if ($res->is_success) {
print $res->header("Content-Type") . "\n";
print $res->status_line . "\n";
print $res->code . "\n";
print $res->header("Server") . "\n";
#print $res->header("Client-SSL-Cipher") . "\n";
#print $res->header("Client-SSL-Cert-Subject") . "\n";
#print $res->header("Client-SSL-Cert-Issuer") . "\n";
#print $res->header("If-SSL-Cert-Object") . "\n";
print $res->content;
} else {
print $res->status_line . "\n";
}

如果用SSL,需安装Crypt::SSLeay。

crontab的时间格式

,

举例如下:
分 時 日 月 星期
43 21 * * *               21:43 执行
15 05 * * *             05:15 执行
0 17 * * *                17:00 执行
0 17 * * 1                每周一的 17:00 执行
0,10 17 * * 0,2,3         每周日,周二,周三的 17:00和 17:10 执行
0-10 17 1 * *             毎月1日从 17:00到7:10 毎隔1分钟 执行
0 0 1,15 * 1              毎月1日和 15日和 一日的 0:00 执行
42 4 1 * *              毎月1日的 4:42分 执行
0 21 * * 1-6            周一到周六 21:00 执行
0,10,20,30,40,50 * * * * 每隔10分 执行
*/10 * * * *        每隔10分 执行
* 1 * * *         从1:0到1:59 每隔1分钟 执行
0 1 * * *         1:00 执行
0 */1 * * *        毎时0分 每隔1小时 执行
0 * * * *         毎时0分 每隔1小时 执行
2 8-20/3 * * *      8:02,11:02,14:02,17:02,20:02 执行
30 5 1,15 * *       1日 和 15日的 5:30 执行

IP forwarding设置纪录

, , ,

### 背景 ###

server1 和 server2 所处的网段不一样,从 server1 不能直接访问 server2。

server1的IP地址:
eth0 10.224.17.10/255.255.255.0


server2的IP地址:
eth0 172.16.0.20/255.255.255.0


中间有一个服务器server3,有两个网卡,可以同时访问server1和server2

server3的IP地址:
eth0 10.224.17.30/255.255.255.0
eth1 172.16.0.30/255.255.255.0


这时候,只要在server3上进行IP forwading的设置,并在server1和server2进行静态路由的设置,就能实现server1和server2间的互访。
即: server1 <--> server3 <--> server2

### 设置纪录 ###

server3的设置

# vi /etc/hosts.allow
追加
ALL : 10.224.17.10 172.16.0.20

# vi /etc/hosts.deny
追加
ALL : ALL

# vi /etc/sysctl.conf
修改或追加
net.ipv4.ip_forward = 1

# sysctl -w 'net.ipv4.ip_forward=1'

server1的设置

# vi /etc/sysconfig/static-routes
追加
any net 172.16.0.0 netmask 255.255.255.0 gw 10.224.17.30 dev eth0

# /etc/init.d/network restart

server2的设置

# vi /etc/sysconfig/static-routes
追加
any net 10.224.17.0 netmask 255.255.255.0 gw 172.16.0.30 dev eth0

# /etc/init.d/network restart

存在时间超过n分钟文件的删除命令

, ,

(例)删除某目录下存在时间超过10分钟文件:

find /filepath -type f -amin +10 -exec rm {} \;

通过Shell发送邮件的方法

, ,

一,用mail命令发送

echo "Body" | mail -s "Subject" addr@some.domain

二,用sendmail命令发送

email="to@toaddress.com"
emailname="Test Mail"
messagebody="tmp.tmp"
from="from@fromaddress.com"
fromname="MailReport"
subject="Mail Report"

echo -e "To: \"${emailname}\" <${email}>\nFrom: \"${fromname}\" <${from}>\nSubject: ${subject}\n\n`cat ${messagebody}`" | /usr/sbin/sendmail -t


三,借助‘email’工具发送

echo "<h1>你好</h1><p style=\"color:red; background-color:gray; height:10em;\">html 邮件测试</p>" | email --html --smtp-user 发送邮件所用的帐号 --smtp-pass 发送邮件所用的密码 --subject "这里是标题" --attach 文件1.zip,文件2.jpg,文件3.tar --cc 抄送到邮件地址 -bcc 暗送到邮件地址 收件人邮件地址


自己制作启动脚本

,

以下是自己制作的启动脚本
#!/bin/sh
#
# chkconfig: 3 65 65
# description: DLE auto start-stop script.
#
# Copyright (c) 2000-2002 The Apache Software Foundation.
# See license at the end of this file.
#
export LANG=ja_JP.eucJP

DLE_HOME=/opt/evdo/kd_dir/dle/3.1/dle
case "$1" in
    'start')
        # Start dle:
        cd $DLE_HOME/shell
        ./dle_od_start.sh
        ;;
    'stop')
        # Stop dle:
        cd $DLE_HOME/shell
        ./dle_od_stop.sh
        ;;
    'restart')
        # Restart dle:
        $0 stop
        $0 start
        ;;
    *)
        echo "Usage: dle {start|stop|restart}"
        exit 1
esac

需要注意的地方:

# chkconfig: 3 65 65

用来设置启动的顺序。

做好后放在 /etc/init.d 下。如/etc/init.d/dle。
然后运行:

# chkconfig dle on
# chkconfig --list dle

这样,机器重启动的时候,就会自动运行:

# /etc/init.d/dle start

以上脚本,若需通过cron定时执行,只需用 crontab 命令添加任务。如

0 10 1 * * /etc/init.d/dle restart 1>/dev/null 2>&1

一定要注意脚本中的环境变量的设置。

查看用multilog管理的日志文件

, ,

multilog管理的日志文件,内容一般如下:

@4000000045c2ebca008e7a9c ... ...
@4000000045c2ebca008ee02c ... ...
@4000000045c2ebca06e079a4 ... ...
@4000000045c2ebca06e0a884 ... ...
@4000000045c2ebca1207e9d4 ... ...

欲显示可读的时间格式,用以下命令:

# tail -f /var/log/qmail/current | /usr/local/bin/tai64nlocal

结果如下:

2007-02-02 16:44:00.009337500 ... ...
2007-02-02 16:44:00.009363500 ... ...
2007-02-02 16:44:00.115374500 ... ...
2007-02-02 16:44:00.115386500 ... ...
2007-02-02 16:44:00.302508500 ... ...

* 以上命令是查看qmail日志的例子。

读取某目录下所有.qmail-*文件并输出内容至文件的Perl小程序

, ,

这些天和qmail过不去,或者说是qmail和我过不去,因此作了不少相关的脚本。

为了整理邮件转发列表,作了以下的Perl小程序:
#!/usr/bin/perl
use strict;

use vars qw($result_file);

$result_file = './ml_member_list.txt';

&main();

sub main()
{
if( -e $result_file ) {
unlink($result_file);
}

my $ml_root = '/home/somedir';

opendir(DIR, $ml_root) || die "Open dir $ml_root failed !";
my @all_ml = grep /^\.qmail.*$/, readdir DIR;
print $ml_root . ': '. scalar(@all_ml) . "\n";
for my $ml_name (@all_ml) {
write_file("$ml_name\n");
    open(FIN, "$ml_root/$ml_name") || die("Cannot open $ml_name\n");
while(<FIN>) {
write_file("\t$_");
}
close(FIN);
write_file("\n");
}
}

#-------------------------------------------------------------------
sub write_file($)
{
    my ($log_msg) = @_;

    open(FOUT, ">>$result_file") || die("Cannot open $result_file\n");
    print FOUT $log_msg;
    close(FOUT);
}

备份并更新log文件,保留最后n行的脚本

, ,

脚本功能如题,内容如下:
#! /bin/sh
#
# Copyright(c) 2007, by ZhiWei Ou.                          
# All rights reserved.
#
#ident @Z%new_maillog 1.0       2007/01/25 SMI          
#
LOGDIR=/var/adm           
BAKDIR=/mnt/var_bak/adm
LOG=procmaillog
DATE=`date '+%Y%m%d'` 
if test -d $BAKDIR
then
        cd $LOGDIR
        test -f $LOG && cp -pf $LOG $BAKDIR
        tail -10000 $LOG > $LOG.tmp && mv $LOG.tmp $LOG
        cd $BAKDIR
        gzip $LOG && mv $LOG.gz $LOG.$DATE.gz  
fi

*该程序于Solaris下做成,Linux下应该也能用。

ezmlm邮件列表管理: 从所有列表中删除多个邮件账号

,

用ezmlm进行邮件列表的管理,有时候需要从所有列表中删除一些邮件账号,手工删除很麻烦,于是用Perl作了一个程序。执行删除之前,只需修改程序中的用户名数组以及域名。

程序如下:
#!/usr/local/bin/perl
use strict;

use vars qw($log_file);

$log_file = './unsub_ml.'. &get_date() . '.log';

&main();

sub main()
{
if( -e $log_file ) {
unlink($log_file);
}

    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
    &write_log("---------- ". &get_time() . " Start delete member from mailling list ----------\n");

my @domain1_account = (
'domain1_user1',
'domain1_user2',
'domain1_user3',
'domain1_user4',
'domain1_user5',
);

my @domain2_account = (
'domain2_user1',
'domain2_user2',
);

my $ezmlm_unsub = '/usr/local/bin/ezmlm/ezmlm-unsub';
my $ml_root = '/var/qmail/alias';


opendir(DIR, $ml_root) || die "Open dir $ml_root failed !";
my @all_ml = grep !/^\..*$/, readdir DIR;

my $user_id = '';
my $mail_addr = '';
my $unsub_cmd = '';
for my $ml_name (@all_ml) {
next if ($ml_name eq 'Mailbox' || $ml_name eq 'ezmlmadmtools' );

for $user_id (@domain1_account){
$mail_addr = $user_id . '@mail.domain.1';
$unsub_cmd = "$ezmlm_unsub $ml_root/$ml_name $mail_addr";
write_log("$unsub_cmd\n");
system($unsub_cmd);
}

for $user_id (@domain2_account){
$mail_addr = $user_id . '@mail.domain.2';
$unsub_cmd = "$ezmlm_unsub $ml_root/$ml_name $mail_addr";
write_log("$unsub_cmd\n");
system($unsub_cmd);
}
}

    ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
    &write_log("---------- ". &get_time() . " Etart delete member from mailling list----------\n");
}


#-------------------------------------------------------------------
sub get_date()
{
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
return sprintf("%04d%02d%02d", $year + 1900, $mon +1, $mday);
}

#-------------------------------------------------------------------
sub get_time()
{
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
return sprintf("%02d:%02d:%02d", $hour, $min, $sec);
}

#-------------------------------------------------------------------
sub write_log($)
{
    my ($log_msg) = @_;

    open(LOG, ">>$log_file") || die("Cannot open $log_file\n");
    print LOG $log_msg;
    close(LOG);
}

程序名:ezmlm_unsub_all.pl
January 2010
S M T W T F S
December 2009February 2010
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30