#正则表达式 ###匹配一个单词 “Hello World” =~ /World/; #成功 这里“Hello World”是一个字符串,World是正则表达式,/ /包围的/World/告诉perl为了匹配搜索字符串,操作符是”=~”连接字符串和正则表达式。
正则表达式操作符有两种, =~ 和!~. ###() group Perl 中引入了一个(),由此出现的 \1,\2是抓取(),(\1 is back reference)
$_ = "abba";
if (/(.)\1/) {
print "It matched "
}
(.)\1是说你现在匹配一个紧挨着这个字符的东西,上面的例子中,(.)匹配一个a,当它往后寻找时,必须找一个同他匹配的。现在是ab,则匹配下一个是abb,于是就匹配了bb.
不是不是,为什么原文书我看不懂
/(fred)*/ matches strings like hello, world
#perl的调试技术 下面说的perl的调试技术是针对Perl解释器本身,可以通过 -d 选项打开这个功能,我们简单的就这个调试技术做个了解。
perl -d xx.pl
这样就打开了调试功能。 ##插入/查看/删除断点
插入断点使用b命令,格式为 b 行号/函数名 条件
查看断点使用L命令,注意使用大写。小写只会显示程序尚未到达的部分内容。
删除断点使用B命令,格式为 B 行号|* ,使用通配符删除所有的断点。 ##增加/查看/删除监视 新填一个变量,格式 w $val==1
查看这个变量,格式 p $val==1
删除这个变量,格式 W $val==1 ##步入执行 碰到子程序会进入到子程序, 命令 s
退出执行的命令为 r
##退出调试
q
p128 =======摘自网络======
</pre>
想要真正使用mutt,必须详细了解邮件系统的运作机制
首先是安装必须的软件
sudo apt-get install mutt fetchmail procmail msmtp
2. 邮件接收程序fetchmail和邮件分拣程序procmail后,首先分别创建各自的配置文件$ HOME/.fetchmailrc和$HOME/.procmailrc,这样为的是让我们能独立使用fetchmail和procmail这两个程序 通过pop接收并分拣邮件。
###关于mutt的一点说明
1.邮件处理分为很多部分,这取决于你想如何应用这个邮件系统。
邮件客户端(MUA), A mail user agent MUA:
MUA: Mail User Agent (email client)
MTA: Mail Transport Agent (SMTP server)
mutt and SMTP
MDA: Mail Delivery Agent
MRA: Mail Retrieval Agent (POP/IMAP client)
在这里,我们使用mutt作为邮件客户端。
###分步讲解 2.1
MUA:让用户管理,如阅读、储存邮箱里的email,或者通过MSA将新的邮件发出。 除了在unix上流行的mutt,其他较为流行的MUA还有:
Other popular MUAs include Thunderbird, Kmail, evolution, Sylpheed,mulberry, pegasus, pine, and elm (mutt’’s predecessor)…
2.2
MTA: Mail Transport Agent(SMTP server)
MTA的功能是接受、发送email到其他的MTAs,在Internet上,MTAs与MTAs交流使用的是 the Simple Mail Transfer Protocol,简称SMTP.官网上还有很多,自己也没有看懂,先就不写了
较流行的MTAs有
exim
postfix
sendmail
qmail
2.3
MDA: Mail Delivery Agent
MDA的功能是从MTA接收一封email或者发送(过滤)email到用户的邮箱文件夹。
而MDAs用的较多就是procmail.
2.4
MRA: Mail Retrieval Agent(POP/IMAP client)
MRA的处理对象是POP/IMAP,很多功能和MUAs很象如果你能直接使用SHELL-cmd或者mutt直接读取邮件服务器的本地邮件,就不需要MRA了。
我的理解是我们之所以使用MRA是我们能直接使用上面情况的机会很少,更多的使用是例如网易的163、126,google的gmail的邮件服务器,那么就需要MRA将他们服务器上的邮件转移到你这儿来
MRA使用较多的是
fetchmail ( http://fetchmail.berlios.de/)
getmail ( http://pyropus.ca/software/getmail/)
retchmail ( http://freecode.com/projects/retchmail)
##注意
在实际应用中,上面的划分存在很多变体,与上面各个子系统的功能会有部分的叠加和交叉,其实,上面的邮件子系统也存在着很多交叉的功能,大家注意区分,毕竟,万变不离其宗。 ###参考—–
http://www.iki.fi/era/procmail/mini-faq.html#appendix-mx
http://www.feep.net/sendmail/tutorial/intro/MUA-MTA-MDA.html
http://ebusiness.gbdirect.co.uk/howtos/mail-system.html
http://twiki.org/cgi-bin/view/Wikilearn/EmailServerSketches
http://www.tldp.org/HOWTO/Mail-User-HOWTO/
http://www.netbsd.org/docs/guide/en/chap-mail.html
=====================
前面都是基本知识,废话,下面才是重点
====================
#安装过程
建议源码安装,我自己偷懒了直接(先测试 mutt -v,若找不到,可能你的linux发行版没有安装)
sudo apt-get install mutt
接着 mutt -v会出现
System: xxx [using ncurses 5.2] [using libiconv 1.7]
Compile options:
-DOMAIN
-DEBUG
-HOMESPOOL +USE_SETGID +USE_DOTLOCK +DL_STANDALONE
+USE_FCNTL -USE_FLOCK
+USE_POP +USE_IMAP -USE_GSS +USE_SSL -USE_SASL -USE_SASL2
+HAVE_REGCOMP -USE_GNU_REGEX
+HAVE_COLOR +HAVE_START_COLOR +HAVE_TYPEAHEAD +HAVE_BKGDSET
+HAVE_CURS_SET +HAVE_META +HAVE_RESIZETERM
+CRYPT_BACKEND_CLASSIC_PGP +CRYPT_BACKEND_CLASSIC_SMIME
-CRYPT_BACKEND_GPGME -BUFFY_SIZE -EXACT_ADDRESS -SUN_ATTACHMENT
+ENABLE_NLS -LOCALES_HACK +HAVE_WC_FUNCS +HAVE_LANGINFO_CODESET +HAVE_LANGINFO_YESEXPR
+HAVE_ICONV -ICONV_NONTRANS -HAVE_LIBIDN +HAVE_GETSID -HAVE_GETADDRINFO
-ISPELL
SENDMAIL="/usr/lib/sendmail"
MAILPATH="/var/mail"
...
EXECSHELL="/bin/sh"
我们可以看出mutt的默认发送邮件的程序是 sendmail,下面我们使用msmtp来发送邮件, (配置文件先不写,在msmtp的后面) ##install msmtp sudo apt-get install msmtp
msmtp 是一款专门负责邮件发送的客户端软件,基于GPL发布,支持TLS/SSL、DNS模式、IPv6、服务器端认证、多用户等特性。
创建msmtp的配置文件~/.msmtprc,内容如下:
vim $HOME/.msmtprc
defaults
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
# 126
account default
host smtp.126.com
from [email protected]
auth on #
port 25
user yuzibode
password xx
logfile /var/msmtp.log
这个配置文件都要注意权限,
chmod 0600 $HOME/.msmtprc
保护模式下段描述表分为全局描述符表(GDT)、中断描述表(IDT)、局部描述符表(LDT)。
linux使用以下段描述符:
.内核代码段
.内核数据段
.用户代码段
.用户数据段
.TSS段
.默认LDT段
GDT中的内核代码段(kernel code segment)描述表中的值如下:
.Base = 0x00000000
.Limit 0x00000000(2^32-1 = 4GB)
.G(颗粒标识) = 1,表示段的大小是以页为单位的
.S = 1,表示普通代码段或数据段
.Type = 0xa, 表示可以读取或者可以执行的代码段
.DPL = 0,表示内核模式
与这个段相关的线性地址是4GB, S=1 和type=0xa表示代码段,选择器在cs寄存器中,linux访问这个段选择器的宏是_KERNEL_CS.
Kernel data segment与上面的代码段相似,只是.Type的字段值为2,选择器在ds寄存器中,访问这个段选择器的宏是_KERNEL_DS
user code segment 由处于用户模式下的所有进程共享,存储在GDT中的对应段描述符的值如下:
.Base = 0x00000000
.Limit = 0xffffffff
.G = 1
.S = 1
.Type = 0xa
.DPL = 3 可使用_USER_CS访问 user data segment 中唯一不同的字段就是Type = 2,使用_USER_DS
除了以上的段描述表以外,GDT中还包含了用于创建每个进程的段描述 - TSS和LDT
每个TSS代表一个不同的进程,TSS中保存了每个CPU的硬件的上下文信息,它有助于切换上下文。
每个进程都有自己在GDT中存储器的对应的TSS描述符,其值如下:
.Base = &tss(对应进程描述符的TSS字段的地址,例如&tss_struct)
.Limit = 0xeb(TSS段的大小是236字节)
.Type = 9或11
.DPL = 0,用户模式不能访问TSS。G位被清除。
在linux下编程,最熟悉的不过是Makefile了。这个文件是用于自动连接和编译的,而且记录所有工程文件的修改信息,这样,这个工程在下次编译前会自动重新编译。
对应于target,”@” 是”argument”的简写。当你键入make foo的时候,”foo” 就是 argument,也就是@#(?).
与”$<”相类似,只不过它表示所有的的依赖的文件”^”记住嘛。
在依赖条件列表中的第一个输入文件。帮助记忆,”<”在shell中,这就是输入的”<”.
所有的比target新的依赖文件(input),”你在干什么,哪些文件必须改变?”
%的作用类似于”*“在shell的作用,也就是任意匹配
以上会衍生出$(@D) $(@F),也就是目录和文件的区别
main: main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o: main.c mytool1.h mytool2.h
gcc -c $< # -c 只输出目标文件,不产生可执行文件
mytool1.o: mytool1.c mytool1.h
gcc -c $<
.c.o:
gcc -c $<
这个规则表示所有的 .o文件都是依赖对应的.c文件的,简化以后的Makefile
main: main.o mytool1.o mytool2.o
gcc -o $@ $^
.c.o:
gcc -c $<
Makefile中有很多的函数,这里,将碰到的一一记录下来,做个完善。
这个函数拾取特定目录下的文件通配符.比如我要将一个头文件.h三个源文件.c编译成 一个目标文件,那么,我就可以首先声明一个变量SRCS,然后将所有的源文件(包括头 文件)一起赋给它.
SRCS = $(wildcard *.c)
这样,变量SRCS就包括所有的源文件了
update 高级一点的用法,
$(patsubst %.c,%.o,$(wildcard))
这句话将所有文件名的后缀.c替换成.o,这样我们就可以得到当前目录下生成的可执行 文件。
hostname [none] display hostname
hostname -d #display machine belongs to the domain
hostname -f #display full name
hostname -i #display ip
ping [ip/address]
View network configure.
下面是我的ifconfig输出:
root@debian:/home/yubo/test/tmp/unix# ifconfig
eth0 Link encap:Ethernet HWaddr 08:9e:01:6d:08:4e
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:41 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:44786 errors:0 dropped:0 overruns:0 frame:0
TX packets:44786 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:22286992 (21.2 MiB) TX bytes:22286992 (21.2 MiB)
wlan0 Link encap:Ethernet HWaddr 80:9b:20:5c:23:04
inet addr:192.168.0.117 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::829b:20ff:fe5c:2304/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:94748 errors:0 dropped:0 overruns:0 frame:0
TX packets:208467 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:92813171 (88.5 MiB) TX bytes:22941747 (21.8 MiB)
root@debian:/home/yubo/test/tmp/unix# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 wlan0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
root@debian:/home/yubo/test/tmp/unix#
注意,我这里配合着route命令。
从上面的输出,我们可以了解到root主机上被激活的ip地址是wlan0,因为这是我在WIFI 条件下连接上网的。lo可以暂时忽略。eth0是以太网的连接。
由此说明,任何由root主机创建的IP包的源地址(source address) 是192.168.0.117. 类似的,任何由root主机收到的IP包的目的地址是192.168.0.117
用于无线网卡
从ip获得主机名或者从ip获得主机名
nsloopup google.com
查看数据包在提交到远程系统或者网站的时候所经过的ip,hoop,time
查看用户信息。
通过telnet协议连接目标主机,如果telnet连接可以在任一端口上完成即代表着两台主机间的连接良好。
telnet hostname port - 使用指定的端口telnet主机名。这通常用来测试主机是否在线或者网络是否正常。
有的发行版不带这些工具,需要我们自己去下载。
发现主机连接最有用最通用的Linux命令。你可以使用”netstat -g”查询该主机订阅的所有多播组(网络)
netstat -nap | grep port 将会显示使用该端口的应用程序的进程id
netstat -a or netstat –all 将会显示包括TCP和UDP的所有连接
netstat --tcp or netstat –t 将会显示TCP连接
netstat --udp or netstat –u 将会显示UDP连接
netstat -g 将会显示该主机订阅的所有多播网络。
iptables -L ## 查看
iptables -F ## 清空规则
控制进来的链接
转发。
root@debian:/home/yubo/test/tmp/unix# sudo iptables -L -v
Chain INPUT (policy ACCEPT 572K packets, 504M bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 1003K packets, 129M bytes)
pkts bytes target prot opt in out source destination
阻塞所有来自10.10.10.10的链接。
iptables -A INPUT -s 10.10.10.10 -j DROP
阻塞一个范围的网址:
iptables -A INPUT -s 10.10.10.0/24 -j DROP
链接到一个特别的端口, 阻塞来自于10.10.10.10的ssh链接
iptables -A input -p tcp --dport ssh -s 10.10.10.10 -j DROP
你可以使用其他协议将“ssh”或者其他端口号。”-p”是协议,如果你想阻塞UDP,则使用 “-p udp”.
如果你使用ssh链接主机,下面的命令慎用,危险!
iptables -A INPUT -p tcp --dport ssh -j DROP
ubuntu
sudo /sbin/iptables-save
Red Hat
/sbin/service iptables save
或者
/etc/init.d/iptables save
哪有什么起因啊,看着在linux kernel中大行其道的汇编代码,自己只能硬着头皮去找点资料来学习,不成想居然找到这么一个强悍的文章,如果你打算自己写一个编译器,那么这篇文章就是为你准备的,在这里
我们借助一个简单的例子,试着揭开linux下的真面目。
int main() { printf("hello,world\n"); return 0; }
在linux下使用 gcc -S test.c 就会产生test.s文件,我在自己机子上可能由于加了头文件,反正汇编后的代码和博客中的代码不太一样。
.file "test.c" .section .rodata .LC0: .string "hello,world!" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 andl $-16, %esp subl $16, %esp movl $.LC0, (%esp) call puts movl $0, %eax leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (Debian 4.7.2-5) 4.7.2" .section .note.GNU-stack,"",@progbits
现在我们只需要关注三个不同的元素:
以__.开头的结构信息,.global main__说明main是一个全局符号可以被其他代码模块引用,.string 暗示一个可以插入到输出代码的字符常量。
以:结尾。它描述了名字和位置的联系。只要调用.LCO立马找到下面的字符串。main:被调用后,立即执行push %ebp(原文是这样表达的,但是我的不一样),在Labels前面用一个.开头的是一个由编译器临时产生的局部变量,其他的就是用户可见和全局变量,现在gcc默认是极大优化的)
如果我们把汇编代码弄成可执行代码,使用以下命令:
gcc -m32 test.s -o test
六个通用寄存器
%eax,%ebx,%ecx,%edx,%esi,%edi
两个堆栈寄存器
%esp,%ebp
bits:
%ah=%al ==> 8 bits. %ax ==>16 bits. %eax ==> 32 bits.
IA-32是 complex instruction set(CISC),so MOV has many different variants that move different types of data between different cells.
Suffix Name Size
B BYTE 8bits
W WORD 16 bits
L LONG 32 bits
在这里分为
global value
immediate value:($56)
register value:(%ebx)
indirect((%sp),也就是MASM中[bx]),
base-relative:(-12(%ecx))(这个语句是说这个值在%ecx暗示的地址(%ecx)下面12字节的内存中).
-12(%esi,%ebx,4): refers to the value at the address -12+%esi+%ebx*4
绝对跳转指令和返回指令需要加"*"
AT&T Intel 说明
Cbtw Cbw 把%al中的字节值符号扩展到%ax中
Cwtl Cwde 把%ax符号扩展到%eax中
Cwtd Cwd 把%ax符号扩展到%dx:%eax中
Cltd Cdq 把%eax符号扩展到%edx:%eaxAT&T