FTP下载Shell脚本编程

我心血来潮学起了Linux Shell脚本,大概看了一下鸟哥的教材个人感觉不错。刚好手头有个需求,大致是需要从FTP下载zip文件并解压。我之前写了个Python版本,正好用Shell脚本重写一遍练练手:)。

#!/bin/sh
# download file from ftp server.
# write by bobo

VERSION=1.0

if [ "$#" != "3" ]; then
    echo "Version $VERSION"
    echo "Usage:"
    echo "    ftp.sh username@ip password files"
    exit 1
fi

username=$(echo $1 | cut -d'@' -f 1)
if [ ! "$username" ]; then
    echo "username invalid" 
    exit 1
fi

ip=$(echo $1 | cut -d'@' -f 2)
if [ ! "$ip" ]; then
    echo "ip invalid" 
    exit 1
fi

password=$2
file=$3

#echo $username,$ip,$password,$file

#ftp -inv $ip <<EOF
ftp -in $ip <<EOF
user $username $password
bin
get $file
bye
EOF

if [ -e "$file" ]; then
    echo "download success"

    dirname=$(echo $file | cut -d'.' -f 1)
    filetype=$(echo $file | cut -d'.' -f 2)

    # the file type is zip?
    if [ "$filetype" = "zip" ]; then
        mkdir -p $dirname
        unzip -o $file -d $dirname
    fi
fi

示例:从ftp服务器192.168.14.1上下载14.zip并解压:

ftp.sh username@192.168.14.1 password 14.zip

记录一下心得:

  • ftp命令参数-n表示登录时不进行用户密码验证,可以用user命令输入用户和密码,方便脚本编写。
  • <<EOF表示键盘输入到EOF为止,这样脚本中只要每行输入FTP命令,最后以EOF结束就行了。
类别: Programming
日期: 2012-05-11 15:51, 10 days ago

打造OpenWrt网络监听器

前言

写了上一篇后我偶然想到网桥也可以用来监听数据:),只要在目标PC或路由器出口上连接一个网桥,监听网桥网卡就可以了。

实现

话说原理其实很简单啦,网桥连接两个子网,因为是二层设备所以对上层的TCP/IP是透明的,而且所有通信都要经过网桥中转,用普通的tcpdump就可以监听了。

在OpenWrt上需要开启VLAN来模拟两个虚拟子网vlan0和vlan1

config switch eth1
        option reset 1
        option enable_vlan 1

config switch_vlan
        option vlan 0
        option device eth1
        option ports '0 1 2 5t'

config switch_vlan
        option vlan 1
        option device eth1
        option ports '3 5t'

两个vlan网络接口分别为eth1.0和eth1.1,0、1、2口为一个子网,3口单独一个子网。现在把eth1.0和eth1.1两个网络接口组成一个网桥br0:

config interface br0
        option type bridge
        option ifname 'eth1.0 eth1.1'
        option proto none

br0默认不设置ip,因为我直接用TTL线获得Shell所以用不着。如果你想远程访问OpenWrt,则必须按情况设置static或dhcp,当然也可以用前一篇说到底Wifi客户端,这样你就可以舒舒服服的坐在电脑边远程登录查看抓包了:)。

最后一步是关闭防火墙,因为网桥用不着:

/etc/init.d/firewall disable

重启网络后可以用ifconfig看到很多网络接口,只要监听br-br0就行了:

br-br0    Link encap:Ethernet  HWaddr 00:74:04:07:4B:CC
          UP BROADCAST RUNNING 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:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth1      Link encap:Ethernet  HWaddr 00:74:04:07:4B:CC
          UP BROADCAST RUNNING 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:14

eth1.0    Link encap:Ethernet  HWaddr 00:74:04:07:4B:CC
          UP BROADCAST RUNNING 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:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth1.1    Link encap:Ethernet  HWaddr 00:74:04:07:4B:CC
          UP BROADCAST RUNNING 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:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  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:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

测试

  1. 首先在OpenWrt里安装Tcpdump:

    opkg install tcpdump
    
  2. 用网线连接电脑到路由器3口(eth1.1),路由器2口(或0、1口)连接原本电脑的出口。

  3. 运行Tcpdump监听POP邮箱密码:

    tcpdump -X -i br-br0 port 110
    

如果你的邮箱没加SSL的话,应该能看到密码明文啦:)。

类别: OpenWrt
日期: 2012-05-02 19:23, 19 days ago

OpenWrt无线Wifi客户端模式

前言

前一篇讲到了OpenWrt的网络结构,这一篇讲讲OpenWrt的Wifi客户端模式,这主要是满足那些懒得接网线的人:)。

Wifi一般用的是AP(Access Point)模式:无线路由器作为一个Wifi热点为其他的Wifi客户端提供连接服务。

这里要用到的是Wifi的STA(Station)模式:作为客户端连接AP模式下的Wifi,这个一般笔记本的无线网卡都是这种模式(详细的Linux下支持的Wifi模式看这里),网络结构图:

上图中左边STA客户端模式下的无线网卡作为WAN把192.168.2.0/24划为内网,用NAT方式连接外网的Wifi AP节点(192.168.1.1)。这个很像经典的OpenWrt WAN和LAN网络结构,只不过把WAN的以太网接口换成了Wifi。

OpenWrt设置

在OpenWrt下主要是设置/etc/config/network、/etc/config/wireless这两个文件,其他的都与默认的LAN和WAN模式相同。

/etc/config/network下,关闭VLAN(enable_valn=0),lan接口设置成静态并去掉网桥(默认为'option type bridge',Wifi通常自动桥接到lan接口),wan去掉'option ifname '选项(无线Wifi接口会自动加入wan作为ifname)。

config switch eth1
    option reset 0
    option enable_vlan 0

config interface loopback
    option ifname lo
    option proto static
    option ipaddr 127.0.0.1
    option netmask 255.0.0.0

config interface lan
    option ifname eth1
    option proto static
    option ipaddr 192.168.2.1
    option netmask 255.255.255.0

config interface wan
    option proto dhcp

配置以后所有交换机上的接口都变为内部LAN,而无线Wifi作为WAN连接外网。LAN和WAN之间用NAT方式进行地址转换(具体在firewall的WAN设置masq=1,默认已经设置好了),firewall的NAT选项叫Masquerade(伪装),就是WAN接口把内网的数据包源地址伪装成自己的,很形象:)。

我一开始连接失败用Tcpdump查看wlan0,发现数据包还没有NAT伪装,最后发现是firewall没启动,所以确保firewall开机启动:

/etc/init.d/firewall enable

查看firewall是否启动:

/etc/init.d/firewall enabled && echo on

/etc/config/wireless下,设置Wifi参数:

config wifi-device radio0
    option type mac80211
    option channel 0
    option hwmode 11g
    option txpower 0

config wifi-iface
    option device     radio0
    option network    wan
    option mode       sta
    option ssid       yourAPssid
    option encryption psk2
    option key        yourkey

主要是设置mode为sta,network选择要自动加入wan,填上要连接Wifi AP的ssid、加密方式encryption和密钥key,全部完成后重启网络,Wifi连接成功后WLAN LED灯会亮起。

/etc/init.d/network restart

把你的台式电脑网线随便插入LAN口,这样你就成为了一台有无线网卡的台式机了,省去了用网线想方设法连接其他房间路由器的烦恼:)。

参考

http://wiki.openwrt.org/doc/howto/clientmode

http://wiki.openwrt.org/doc/recipes/routedclient#using.masquerade

类别: OpenWrt
日期: 2012-04-27 11:35, 24 days ago

OpenWrt网络结构

OpenWrt的网络配置很丰富,在我看来几乎可以完成任何网络结构。下图为一个支持OpenWrt的路由器网络结构:这个路由器内部交换机有6个口,其中1个WAN口、4个LAN口、Port5默认连接内部网卡eth0,还有连接Wifi的无线网卡接eth2,eth3保留。

从中我们可以看到这个路由器最多支持3个物理网络接口eth0、eth1、eth2。其实一般路由器有两张以太网卡和一张无线网卡,但更多的路由器里只有一张以太网卡和一张无线网卡。

最让我惊奇的是OpenWrt网络的灵活性,它主要靠VLAN和(Bridging)网桥等实现。

  • VLAN

    一般路由器为节约成本只有一张网卡(我的理解是以太网控制芯片),但如何接入多个网络呢?(路由器按常理至少要两张网卡吧),这就是VLAN的功劳啦。

    VLAN(Virtual Local Area Network)是虚拟局域网缩写,是把局域网中的同一工作组的主机连在一起,隔绝不同的子网(在一个或多个交换机上),这种局限增强了工作组间的保密性,也减少了全面广播的副作用。用了VLAN也就把连接子网用的路由器给省了,省钱而且效率还很高。

    VLAN需要路由器内置的交换机支持(一般都支持啦),最多可以划分4096个VLAN。一般使用只划分两个VLAN:WAN和LAN,分别对应外网和内网。如果是纯粹的VLAN,则WAN和LAN之间是隔离的,互相不能通信,但在自己的VLAN里可以自由通信。

  • Trunking

    用一张网卡怎么连接两个网络呢?不知你是否留意到上图中的Port5,Port5一边连接路由器,一边连接网卡eth0,它的作用就是连接vlan0和vlan1。这就是采用VLAN的Trunking技术,在Trunk Port(port5)经过的以太网帧上打标签(Tagging)用以区分来自那个VLAN,然后路由器用网卡eth0接收并处理标签从而处理(在CPU中处理),这就是所谓的单臂路由器,很形象啊:)。

  • Bridging

    网桥说穿了就是交换机,它就是用软件模拟以太网交换机,连接多个以太网网卡(虚拟的或物理的)分享同一个IP子网。在OpenWrt中,网桥主要用来连接无线WIFI网络和LAN,组成一个统一的内部局域网

最后为了方便理解,我画了一张示意图用普通的交换机和路由器解释上面提到的VLAN、Trunking和Bridging:

hand

参考

VLAN动画详解

OpenWrt network interface

Linux下的网桥

类别: OpenWrt
日期: 2012-04-23 15:29, 28 days ago