xrdp

xrdp ubuntu sudo systemctl enable --now xrdp sudo ufw allow from any to any port 3389 proto tcp archlinux yay -S xrdp yay -S xorgxrdp vim /etc/X11/Xwrapper.config # content allowed_users=anybody systemctl start xrdp systemctl enable xrdp vim ~/.xinitrc # content exec startxfce4 remove yay -R xorgxrdp-devel-git yay -R xrdp Install xrdp on CentOS 7 / RHEL 7 By Raj Last updated Mar 29, 2018 88 Share xrdp is an Open Source Remote desktop Protocol server, which allows you to RDP to your Linux server from Windows machine; it is capable of accepting connections from rdesktop, freerdp, and remote desktop clients. ...

2012-01-31 · 4 min · 753 words · -

login as root gives "530 Login incorrect."

login as root gives “530 Login incorrect.” comment out root from both /etc/vsftpd/ftpusers and /etc/vsftpd/user_list

2012-01-30 · 1 min · 15 words · -

RHEL 5 vsftpd

RHEL 5 vsftpd vsftpd安装 [root@linux01 ~]# mkdir /media/cdrom [root@linux01 ~]# mount -t iso9660 /dev/cdrom /media/cdrom # 挂载镜像 mount: block device /dev/cdrom is write-protected, mounting read-only [root@linux01 ~]# cd /media/cdrom/Server # 进入软件包目录 [root@linux01 Server]# [root@linux01 Server]# rpm -qa | grep ^vsftpd # 查询相关已经安装的软件包 [root@linux01 Server]# ls | grep vsftpd* # 查询当前路径下安装包 vsftpd-2.0.5-12.el5.i386.rpm [root@linux01 Server]# rpm -ivh vsftpd-2.0.5-12.el5.i386.rpm # 安装软件包 i安装 v输出详细信息 h进度 warning: vsftpd-2.0.5-12.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186 ...

2012-01-30 · 1 min · 109 words · -

debian, grub2, run level

debian, grub2, run level edit /boot/grub/grub.cfg menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-686-bigmem run level 3' -class debian -class gnu-linux -class gnu -class os { insmod part_msdos insmod ext2 set root='(hd0,msdos7)' search -no-floppy -fs-uuid -set ca201e81-b7d4-4cb1-9a68-707dab19738a echo 'Loading Linux 2.6.32-5-686-bigmem ...' linux /vmlinuz-2.6.32-5-686-bigmem root=/dev/sda8 ro quiet 3 echo 'Loading initial ramdisk ...' initrd /initrd.img-2.6.32-5-686-bigmem } menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-686-bigmem run level 5' -class debian -class gnu-linux -class gnu -class os { insmod part_msdos insmod ext2 set root='(hd0,msdos7)' search -no-floppy -fs-uuid -set ca201e81-b7d4-4cb1-9a68-707dab19738a echo 'Loading Linux 2.6.32-5-686-bigmem ...' linux /vmlinuz-2.6.32-5-686-bigmem root=/dev/sda8 ro quiet 5 echo 'Loading initial ramdisk ...' initrd /initrd.img-2.6.32-5-686-bigmem }

2012-01-29 · 1 min · 102 words · -

centos basic

centos basic AlmaLinux AlmaLinux 是 CloudLinux 公司搞得 RHEL 下游发行版 sudo dnf --refresh update sudo dnf upgrade # The containerd.io package contains runc too, but does not contain CNI plugins. sudo dnf install containerd.io centos 7 minimal 安装之后 磁盘占用 1.4G yum repo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo dhcp vim /etc/sysconfig/network-scripts/ifcfg-eth0 bootproto=dhcp onboot=yes Linux centos livecd bin netinstall 各版本的区别 CentOS-5.5-x86_64-LiveCD.iso 光盘系统 CentOS-5.5-x86_64-bin-DVD 64位安装盘 CentOS-5.5-x86_64-netinstall 64位网络安装盘 LiveCD一般用来修复系统使用,有容量很小,不用安装,可以自启动等特性,可以直接使用光盘启动的系统。 bin DVD也具有同样的功能,但是体积较大,需要安装到硬盘使用。 netinstall和bin都可以用来安装系统,不同的是,netinstall根据你选择的软件列表从网上下载,然后进行系统安装; bin DVD本身包含了软件,不需要依赖于网络经行安装。 ...

2012-01-25 · 2 min · 324 words · -

ubuntu vnc

ubuntu vnc 第一步,获取安装文件 sudo apt-get install vnc4server 第二步,修改VNC Password,不能太短 # vncpasswd Password: ** Verify:***** 第三步,检查防火墙,这个就不详细说明了 第四步,启动VNC server vncserver 第五步,通过客户端连接 地址后面加:1 启动完vnc4server后在你的主目录下将会产生一个.vnc的目录。 此时就可以通过vnc客户端链接到服务器了。 停止一个vnc4server vnc4server -kill :3 根据你启动时获得的数字替换此处的3。 打开 .vnc/xstartup 文件并编辑: gedit /.vnc/xstartup 文件看起来将是这样的: #!/bin/sh # Uncomment the following two lines for normal desktop: # unset SESSION_MANAGER # exec /etc/X11/xinit/xinitrc [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources xsetroot -solid grey vnccon** -iconic & x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" & x-window-manager & 修改 .vnc/xstartup文件并保存 取消unset和exec开始的行的注释,注释以xsetroot,vnccon**,xterm和twm开始的行。执行后看起来像这样: ...

2012-01-20 · 2 min · 397 words · -

ssh

ssh SSH和Session的关系是一对多的关系 SSH连接 (SSH Connection) 定义: 是客户端与服务器之间的底层加密网络连接 协议层: SSH Transport Layer Protocol 作用: 提供加密的通信通道, 作用: 提供加密、认证、完整性保护 生命周期: 从建立连接到断开连接的整个过程 数量: 通常一个客户端到服务器只有一个SSH连接 SSH Channel (SSH通道) 定义: 在SSH连接内部的逻辑通道 协议层: SSH Connection Protocol 作用: 在单个SSH连接上复用多个数据流 类型: session - 用于命令执行、shell direct-tcpip - 用于端口转发 forwarded-tcpip - 用于反向端口转发 x11 - 用于X11转发 SSH会话 (SSH Session) 定义: 运行在特定Channel上的服务, 是在SSH连接之上的逻辑会话 协议层: 应用层服务 作用: 用于执行具体的命令或启动shell 生命周期: 从创建会话到关闭会话 数量: 一个SSH连接可以创建多个会话 类型: exec - 执行单个命令 shell - 启动交互式shell subsystem - 启动子系统(如SFTP) 为什么需要会话管理? 状态隔离 每个会话有独立的环境变量、工作目录 不同命令之间不会相互影响 ...

2012-01-20 · 1 min · 79 words · -

squid cache_peer 参数详解

squid cache_peer 参数详解 通过squid.conf配置文件中的cache_peer选项来配置代理服务器阵列,通过其他的选项来控制选择代理伙伴的方法。Cache_peer的使用格式如下: cache_peer hostname type http_port icp_port 共有5个选项可以配置: hostname:指被请求的同级子代理服务器或父代理服务器。可以用主机名或ip地址表示; type: 指明hostname的类型,是同级子代理服务器还是父代理服务器,也即parent (父) 还是 sibling (子) ; http_port: hostname的监听端口; icp_port: hostname上的ICP监听端口,对于不支持ICP协议的可指定7; options: 可以包含一个或多个关键字。 Options可能的关键字有: 1. proxy-only: 指明从peer得到的数据在本地不进行缓存,缺省地,squid是要缓存这部分数据的; 2. weight=n: 用于你有多个peer的情况,这时如果多于一个以上的peer拥有你请求的数据时,squid通过计算每个peer的ICP响应时间来 决定其weight的值,然后squid向其中拥有最大weight的peer发出ICP请求。也即weight值越大,其优先级越高。当然你也可以手工 指定其weight值; 3. no-query: 不向该peer发送ICP请求。如果该peer不可用时,可以使用该选项; 4. Default: 有点象路由表中的缺省路由,该peer将被用作最后的尝试手段。当你只有一个父代理服务器并且其不支持ICP协议时,可以使用default和no-query选项让所有请求都发送到该父代理服务器; 5.login=user:password: 当你的父代理服务器要求用户认证时可以使用该选项来进行认证。

2012-01-18 · 1 min · 41 words · -

Squid

Squid Squid cache (简称为Squid) 是一个流行的自由软件 (GNU通用公共许可证) 的代理服务器和Web缓存服务器。Squid有广泛的用途,从作为网页服务器的前置cache服务器缓存相关请求来提高Web服务器的速度,到为一组人共享网络资源而缓存万维网,域名系统和其他网络搜索,到通过过滤流量帮助网络安全,到局域网通过代理上网。Squid主要设计用于在Unix一类系统运行。 Squid的发展历史相当悠久,功能也相当完善。除了HTTP外,对于FTP与HTTPS的支援也相当好,在3.0 测试版中也支援了IPv6。

2012-01-18 · 1 min · 9 words · -

linux http proxy

linux http proxy 在Linux的命令行底下,一般的程序都是使用http_proxy和ftp_proxy这两个环境变量来获得代理设置的。 export HTTP_PROXY=[username]:[password]@[proxy-web-or-IP-address]:[port-number] export HTTPS_PROXY=[username]:[password]@[proxy-web-or-IP-address]:[port-number] export FTP_PROXY=[username]:[password]@ [proxy-web-or-IP-address]:[port-number] export NO_PROXY=localhost,127.0.0.1,::1 export http_proxy=http://localhost:8118/ # 需要密码的代理服务器 export http_proxy=http://username:password@proxyserver:port/ export ftp_proxy=http://username:password@proxyserver:port/ unset http_proxy unset https_proxy unset ftp_proxy export no_proxy=“localhost,127.0.0.0/8,*.local” 例如,假设你的代理服务器为192.168.1.1,端口是8080,用户名为cnkker,密码是123456,那么应该这样设置这两个环境变量: export http_proxy=http://cnkker:123456@192.168.1.1:8080 export ftp_proxy=http://cnkker:123456@192.168.1.1:8080 如果要使下次生效,需要把导出配置写入~/.bashrc中,这样配置之后,退出再登录一次,或者直接使用下面的命令source一下.bashrc: source ~/.bashrc 现在,上述程序就可以通过代理服务器访问网络了。

2012-01-18 · 1 min · 38 words · -

go rlimit

go rlimit package main import ( "fmt" "syscall" ) func main() { var rLimit syscall.Rlimit err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit) if err != nil { fmt.Println("Error Getting Rlimit ", err) } fmt.Println(rLimit) rLimit.Max = 999999 rLimit.Cur = 999999 err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit) if err != nil { fmt.Println("Error Setting Rlimit ", err) } err = syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit) if err != nil { fmt.Println("Error Getting Rlimit ", err) } fmt.Println("Rlimit Final", rLimit) }

2012-01-17 · 1 min · 71 words · -

代理服务器

代理服务器 代理服务器不仅可以为局域网内的PC提供代理服务,还可以为基于Windows网络的用户提供代理服务。而且代理服务的实现十分简单,它只需在局域网的一台服务器上运行相应的服务器端软件即可。目前代理服务器软件产品主要有: Microsoft Proxy,Microsoft ISA,WinProxy、WinGate、winRoute、SyGate、CCProxy、SuperProxy等;而在UNIX/Linux系统主要采用Squid和Netscape Proxy等服务器软件作为代理。 squid 在Unix/linux下使用的比较优秀的代理服务器软件Squid。之所以说它比较优秀,是因为它可以在代理服务器上作一个很大的缓存,可以把好多常去的网站内容存储到缓存中,这样,内部网的机器再访问那些网站,就可以从缓存里调用了。这样一方面可以加快内部网浏览因特网的速度,这就是所谓的提高客户机的访问命中率;另一方面,Squid不仅仅支持HTTP协议,而且还支持FTP,GOPHER,SSL和WAIS等协议。 考虑到简捷实用的原则,squid作为代理服务器不仅性能优异,而且还详细的纪录了各个客户端的访问纪录Squid是一个缓存internet数据的一个软件,它接收用户的下载申请,并自动处理所下载的数据。Squid可以工作在很多的操作系统中,如AIX, Digital Unix, FreeBSD, HP-UX, Irix, Linux, NetBSD, Nextstep, SCO, Solaris,OS/2等,也有不少人在其他操作系统中重新编译过Squid。由于它安装简单,使用方便,所以已经被广泛使用。 1 Microsoft Proxy Server Microsoft Proxy Server是把对Intemet的访问带入一个组织内部每一个桌面上去的一种容易而又安全的方法,它包括Web Proxy服务器,Winsock Proxy服务器和Socks Proxy服务器。Web Proxy为Cache类代理软件,Winsock Proxy通过Winsock协议代理使LAN内的计算机好像直接连接在上一级网络上一样,实际上是通过代理服务器发送请求,但客户端要安装 Microsoft Winsock Proxy Client软件。Microsoft ProxyServer 2.0是Microsoft Bank Ofice客件之一,运行在Windows NT 或Windows 2000环境下。在Windows NT Server4.0上安装时,必须安装3.0或更高版本的IIS(Internet InformationServer)及Windows Service Pack 3或更高版本的补丁。 它容易与安全地安装,充分利用内建在Windows NTServer里的安全性,并允许网络操作员对进入或来自Intemet的访问作有效地控制。它支持全部的Internet协议包括HTTP、FTP、 Gopher、RealAudio、VDOfive、IRC、邮件和新闻协议,支持IPX/SPX和TCP/IP协议来容易访问Intemet服务器以及内部网上的应用软件。它提供超高速缓存,保存网络带宽,改善客户机的响应时问,减少网络的拥挤,并且在不加重最终用户和网络管理员负担的情况下改善对网络资源的控制。管理员可以根据用户、服务、端口或IP域来允许或拒绝入站或出站的连接,可以阻止对一些指定站点的访问,但不能采用直接导入方法来设定允许访问站点地址。它与NT网络系统管理服务集成,ProxyServer生成一套Windows NT Performance Counters来监视网络上任何一台代理服务器的状态,与Windows NT ServerDirectory Services集成来用户等级的验证。井提供防火墙等Intemet安全认证特性。 2 Wingate Wingate是Qbic公司的产品,软件分为服务器和客户两部分。服务器可运行于Win 98或Win NT平台,提供用户认证,各种网络应用层协议代理,Intemet访问控制,包过滤等服务;客户部分为一个用户登录程序Gatekeeper,用户使用它在代理服务器上进行登录,代理服务器将用户的IP地址与相应用户账号绑在一起。如果这一用户是管理员,还可以使用Gatekeeper进行远程管理。 Wingate支持双网络接口,一个接口通过网络适配器卡连接内部局域网络,另一个网络接口连接Intemet,两块网卡问的IP转发要禁用,使内部网络与外部网络完全隔开,形成双宿网关防火墙。Wingate也支持单网卡,在许多校园网中,只允许部分计算机具有Intemet访问权,利用这些计算机作为代理服务器,为其他的计算机提供服务,只是它不具备防火墙的功能。Wingate除了提供FTP Proxy、Telnet Proxy、 POP3 Proxy、RealAudio Proxy、Socks Pmxy代理服务之外,还提供了DNS、DHCP、拨号管理等丰富功能。 3 SyGate ...

2012-01-17 · 1 min · 188 words · -

influxdb lsm tsm

influxdb lsm tsm 底层采用自研的TSM存储引擎,TSM也是基于LSM的思想,提供极强的写能力以及高压缩率。 数据库 数据库的本质上是完成四件事情, 插入数据, 删除数据, 修改数据, 查询数据。 也就是我们常说的CRUD。 市面上现在流行的数据库大致有两类, 1. 基于日志结构的储存引擎。大部分的 Nosql 数据库都是此类, 面向页的存储引擎: Mysql 极简key-value型数据库 第一版需要实现的功能: 1. 插入数据 2. 查询数据 #!/bin/hash db_set() { echo "$1,$2" >> database } db_get() { grep "^$1, "database | sed -e "s/^$1,//" | tail -n 1 } 上面我们用两个Bash 函数实现了一个Key-value型数据库,用文件读写的方式将数据记录到磁盘上。 每行是用逗号分割的key,value 形式。 (这种存储方式也叫CSV文件格式) db_set() : 追加到文件尾 db_get() : 遍历所有匹配key 的行, 用sed 命令把key, 替换成空字符串, 并输出最后一行。 至于删除, 我们可以再写入一条数据, 在key,value 后面追加一个墓碑标记。 查询的时候,如果最新的一条数据有墓碑标记, 则代表该数据已被删除。 考虑下这个数据库的性能: 空间上: 当我们修改key 对应的值, 是采用追加写入文件的方式, 会造成存在很多重复的键, 过于占用磁盘空间, 当使用一段时间,磁盘空间可能就会被耗尽。 时间上: 读数据需要整体遍历一遍文件, 当我们数据量非常大的时候查询速度将会变得非常慢。 对于一个数据库, 我们认为查询数据的时候O(logn) 或者O(1)的时间复杂度是可接受的。 ...

2012-01-13 · 2 min · 282 words · -

golang log

golang log seelog https://github.com/cihub/seelog log, glog, logrus https://sites.google.com/site/kjellhedstrom2/g2log-efficient-background-io-processign-with-c11/g2log-vs-google-s-glog-performance-comparison https://logmatic.io/blog/our-guide-to-a-golang-logs-world/ https://www.goinggo.net/2013/11/using-log-package-in-go.html http://legendtkl.com/2016/03/11/go-log/ log 首先是golang自带的package log。使用godoc查看,godoc -http=:8001,然后就可以在localhost:8001/pkg/log就可以查看了。 最重要的是SetOutput这个函数,原型是func SetOutput(w io.Writer),决定了log应该输出到什么地方,默认是标准输出。下面是把log输出到文件的一个简单代码示例。 package main import ( “log” “os” ) func main() { f, err := os.OpenFile(“logfile.log”, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf(“file open error : %v”, err) } defer f.Close() log.SetOutput(f) log.Println(“This is a test log entry”) } 我们此时打开文件logfile.log,会看到文件内容如下。 2016/03/11 17:54:10 This is a test log entry 有时候我们并不需要前面的日期以及时间信息,比如做自动化测试的时候比对log肯定不希望有时间信息。那应该怎么办呢?这时候就该SetFlags()出场了。 package main import ( “log” “os” ) func main() { f, err := os.OpenFile(“logfile.log”, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) ...

2012-01-08 · 2 min · 278 words · -

Dsniff

Dsniff Dsniff 是一个著名的网络嗅探工具包。其开发者Dug Song早在1999年12月,以密歇根大学CITI研究室 (Center for Information Technology Integration) 的研究成果为基础,开发了这个后来具有很大影响力的网络安全工具包。Dug Song开发Dsniff的本意是揭示网络通信的不安全性,借助这个工具包,网络管理员可以对自己的网络进行审计,也包括渗透测试。但万事总有其两面 性,Dsniff所带来的负面作用也是"巨大"的,首先它是可以自由获取的,任何拥有这个工具包的人都可能做"非正当"的事,其次,Dsniff里面的某 些工具,充分揭示了一些安全协议的"不安全性",例如针对SSH1和SSL的MITM (Man-In-The-Middle) 攻击工具—SSHmitm和 Webmitm。SSH1和SSL都是建立网络通信加密通道的机制,向来被认为是很安全的,但人们在具体使用时,往往因为方便性上的考虑而忽视了某些环 节,造成实事上的不安全。所以说,最大的不安全性,往往并不在于对安全的一无所知,而在于过于相信自己的安全。 Dub Song在2000年12月发布了Dsniff的v2.3版本,该版本支持OpenBSD、Linux、Solaris系统平台。目前,最新版本是 2001年3月发布的v2.4b1的Beta版 除了针对Unix系统的版本,从网上也可以得到Windows平台上运行的Dsniff早期版 作为一个工具集,dsniff包括的工具分为四类: 纯粹被动地进行网络活动监视的工具,包括: dsniff、filesnarf、mailsnarf 、msgsnarf、urlsnarf、webspy 针对SSH和SSL的MITM (Man-In-The-Middle) “攻击"工具,包括sshmitm和webmitm 发起主动欺骗的工具,包括: arpspoof、dnsspoof、macof 其它工具,包括tcpkill、tcpnice dsniff的安装 sudo pacman -S dsniff 安装完成后,默认 dsniff 的安装目录是 /usr/local/sbin,在这里可以看到 dsniff 所有的工具 dsniff工具介绍 纯粹被动地进行网络活动监视的工具,包括: dsniff、filesnarf、mailsnarf 、msgsnarf、urlsnarf、webspy 针对SSH和SSL的MITM (Man-In-The-Middle) “攻击"工具,包括sshmitm和webmitm 发起主动欺骗的工具,包括: arpspoof、dnsspoof、macof 其它工具,包括tcpkill、tcpnice dsniff dsniff 是一个密码侦测工具,他能够自动分析端口上收到的某些协议的数据包,并获取相应的密码。 dnisff 支持的协议有 FTP, Telnet, SMTP, HTTP, POP, poppass, NNTP, IMAP, SNMP, LDAP, Rlogin, RIP, OSPF, PPTP MS-CHAP, NFS, VRRP, YP/NIS, SOCKS, X11, CVS, IRC, AIM, ICQ, Napster, PostgreSQL, Meeting Maker, Citrix ICA, Symantec pcAnywhere, NAI Sniffer, Microsoft SMB, Oracle SQL*Net, Sybase and Microsoft SQL。 ...

2012-01-08 · 2 min · 344 words · -

Session

Session session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的。 session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。 有时候我们可以看到这样的话"在一个浏览器会话期间,…",这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间 ①。 最混乱的是"用户 (客户端) 在一次会话期间"这样一句话,它可能指用户的一系列动作 (一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction) ,然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差别只能靠上下文来推断②。 然而当session一词与网络协议相关联时,它又往往隐含了"面向连接"和/或"保持状态"这样两个含义, “面向连接"指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态"则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有"一个TCP session"或者 “一个POP3 session"③。 而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。 有时候session也用来指这种解决方案的存储结构,如"把xxx保存在session 里"⑤。 由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。 鉴于这种混乱已不可改变,本文中session一词的运用也会根据上下文有不同的含义,请大家注意分辨。 在本文中,使用中文"浏览器会话期间"来表达含义①, 使用"session机制"来表达含义④, 使用"session"表达含义⑤, 使用具体的"HttpSession"来表达含义⑥ HTTP协议与状态保持 HTTP 协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的 (非会员制) 大卖场之间的关系一样。 然而聪明 (或者贪心?) 的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用,就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范以响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、 cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。 让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案: 该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。 发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。 发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。 由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。 理解cookie机制 cookie机制的基本原理就如上面的例子一样简单,但是还有几个问题需要解决: “会员卡"如何分发;“会员卡"的内容;以及客户如何使用"会员卡”。 正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。 而cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。 cookie的内容主要包括: 名字,值,过期时间,路径和域。 其中域可以指定某一个域比如 .google.com,相当于总店招牌,比如宝洁公司,也可以指定一个域下的具体某台机器比如 www.google.com 或者 froogle.google.com,可以用飘柔来做比。 路径就是跟在域名后面的URL路径,比如/或者/foo等等,可以用某飘柔专柜做比。 路径与域合在一起就构成了cookie的作用范围。 如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。 存储在硬盘上的cookie 可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按 Ctrl-N (或者从文件菜单) 打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie;对于 Mozilla Firefox0.8,所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。 下面就是一个goolge设置cookie的响应头的例子 HTTP/1.1 302 FoundLocation: http://www.google.com/intl/zh-CN/Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.comContent-Type: text/html 这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分 ...

2012-01-08 · 1 min · 166 words · -

deb

deb 安装deb文件 dpkg -i filename.deb deb卸载 打开新立得软件包管理器 sudo synaptic 在左侧的选择框中选择Installed(local or obsolete, 再在右侧的选择框中查找需要卸载的deb包, 如果知道deb包名,直接点击 [搜索]输入包名 选择要删的包,右击,选择[标记以便删除] The difference between “Mark for Removal” and “Mark for Complete Removal” in Synaptic Package Manager: Mark for removal removes the package, but not the configuration files associated with the package. It is equivalent to apt-get remove package_name Mark for Complete Removal purges the package, i.e. removes both the package files and its configuration. It is equivalent to ...

2012-01-08 · 1 min · 84 words · -

linux ftp

linux ftp 安装: apt-get install vsftpd 默认设置: 家目录/srv/ftp ……在/etc/password 中可以查到. 允许匿名访问. /etc/ftpusers 记录着不允许访问FTP服务器的用户名单.默认排除了root 启动服务 /etc/init.d/./vsftpd start 重启服务 /etc/init.d/./vsftpd restart 停止服务 /etc/init.d/./vsftpd stop 修改/etc/vsftpd.conf listen=yes (独立的VSFTPD服务器) anonymous_enable=yes (允许匿名登陆) local_enable=NO (禁止本地系统用户) write_enable=NO (不开放本地用户写权限) anon_upload_enable=NO (匿名用户上传权限) anon_mkdir_write_enable=NO (关闭可上传目录并关闭在此目录上传权限) anon_other_write_enable=NO (关闭匿名帐户的删除权限) anon_world_readable_only=YES (禁止匿名拥护下载具有全局读取权限的文件) hide_ids=YES (目录中用户和组信息列取都显示为ftp) ls_recurse_enable=NO (禁止ls -R 递归查询) dirmessage_enable=yes (切换目录时,显示目录下.message的内容) local_umask=022 (FTP上本地的文件权限,默认是077) connect_form_port_20=yes (启用FTP数据端口的数据连接) * xferlog_enable=yes (激活上传和下传的日志) xferlog_std_format=yes (使用标准的日志格式) ftpd_banner=XXXXX (欢迎信息) pam_service_name=vsftpd (验证方式)

2012-01-07 · 1 min · 60 words · -

AOP

AOP AOP为Aspect Oriented Programming的缩写,意为: 面向切面编程 (也叫面向方面) ,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。 为什么要区分J2EE容器和J2EE应用系统? 我们知道,J2EE应用系统只有部署在J2EE容器中才能运行,那么为什么划分为J2EE容器和J2EE应用系统? 通过对J2EE容器运行机制的分析 (见我的电子教材"EJB实用原理") ,我们可以发现: 实际上J2EE容器分离了一般应用系统的一些通用功能,例如事务机制、安全机制以及对象池或线程池等性能优化机制。 这些功能机制是每个应用系统几乎都需要的,因此可以从具体应用系统中分离出来,形成一个通用的框架平台,而且,这些功能机制的设计开发有一定难度,同时运行的稳定性和快速性都非常重要,必须经过长时间调试和运行经验积累而成,因此,形成了专门的J2EE容器服务器产品,如Tomcat JBoss、Websphere、WebLogic等。 从J2EE系统划分为J2EE容器和J2EE应用系统两个方面,我们已经看到一种分散关注的思路 (separation of concerns) 。 分散关注 将通用需求功能从不相关类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。 AOP就是这种实现分散关注的编程方法,它将"关注"封装在"方面"中。 AOP是什么? AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。 举例: 假设有在一个应用系统中,有一个共享的数据必须被并发同时访问,首先,将这个数据封装在数据对象中,称为Data Class,同时,将有多个访问类,专门用于在同一时刻访问这同一个数据对象。 为了完成上述并发访问同一资源的功能,需要引入锁Lock的概念,也就是说,某个时刻,当有一个访问类访问这个数据对象时,这个数据对象必须上锁Locked,用完后就立即解锁unLocked,再供其它访问类访问。 使用传统的编程习惯,我们会创建一个抽象类,所有的访问类继承这个抽象父类,如下: abstract class Worker{ abstract void locked(); abstract void accessDataObject(); abstract void unlocked(); } 缺点: accessDataObject()方法需要有"锁"状态之类的相关代码。 Java只提供了单继承,因此具体访问类只能继承这个父类,如果具体访问类还要继承其它父类,比如另外一个如Worker的父类,将无法方便实现。 重用被打折扣,具体访问类因为也包含"锁"状态之类的相关代码,只能被重用在相关有"锁"的场合,重用范围很窄。仔细研究这个应用的"锁",它其实有下列特性: “锁"功能不是具体访问类的首要或主要功能,访问类主要功能是访问数据对象,例如读取数据或更改动作。 “锁"行为其实是和具体访问类的主要功能可以独立、区分开来的。 “锁"功能其实是这个系统的一个纵向切面,涉及许多类、许多类的方法。因此,一个新的程序结构应该是关注系统的纵向切面,例如这个应用的"锁"功能,这个新的程序结构就是aspect (方面) 在这个应用中,“锁"方面 (aspect) 应该有以下职责: 提供一些必备的功能,对被访问对象实现加锁或解锁功能。以保证所有在修改数据对象的操作之前能够调用lock()加锁,在它使用完成后,调用unlock()解锁。 AOP应用范围 很明显,AOP非常适合开发J2EE容器服务器,目前JBoss 4.0正是使用AOP框架进行开发。 具体功能如下: Authentication 权限 Caching 缓存 Context passing 内容传递 ...

2012-01-07 · 1 min · 125 words · -

hexdump command

hexdump command, 以 16 进制查看文件, 以十六进制查看文件 hexdump -e '16/1 "%02X " "\n"' hexdump -C foo.bin # 大文件可以和 less 配合使用 hexdump -C foo.bin | less echo /etc/passwd | hexdump echo /etc/passwd | xxd echo /etc/passwd | hexdump -C hexdump 命令一般用来查看"二进制"文件的十六进制编码,但实际上它的用途不止如此, 手册页上的说法是"ascii, decimal, hexadecimal, octal dump", 这也就是本文标题为什么要将"十六"给引起来的原因,而且它能查看任何文件,而不只限于二进制文件了。 另外还有xxd和od也可以做类似的事情,但是我从未用过。在程序输出二进制格式的文件时,常用hexdump来检查输出是否正确。 当然也可以使用Windows上的UltraEdit32之类的工具查看文件的十六进制编码,但Linux上有现成的工具,何不拿来用呢。 参数 -C,显示结果分为三列 (文件偏移量、字节的十六进制、ASCII字符) 。 od echo /etc/passwd | od -x 0000000 652f 6374 702f 7361 7773 0a64 0000014 # 规范的十六进制和ASCII码显示 (Canonical hex+ASCII display ) echo /etc/passwd | hexdump -C 00000000 2f 65 74 63 2f 70 61 73 73 77 64 0a |/etc/passwd.| ...

2012-01-02 · 2 min · 325 words · -