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结束就行了。

打造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的话,应该能看到密码明文啦:)。