免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2452 | 回复: 4
打印 上一主题 下一主题

[原创]交互式单机、批量ftp的shell [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-04 08:38 |只看该作者 |倒序浏览
可以向单个或多个主机传送文件的shell,首先修改两个参数ftp_user   ftp_passwd
就是接受文件主机的用户名和密码。如果是批量发送则接受文件主机的密码必须相同。还要建立一个IP_file文件以一定的格式保存IP地址表。特别对经常向多个主机传送文件的用户非常方便,设置好参数,执行该shell就可以睡大觉了!

shell魅力无穷,欢迎交流并提出宝贵意见!!



#!/bin/ksh
#功能: 实现向辖区内单个网点或者所有网点传送文件,以#显示传送情况.
#特殊要求:如果向全辖所有网点传送文件需要一个IP地址表文件:IP_file和本shell文件
#         放在同一目录下,格式:IP地址    | 机构码  |  机构名称   
#         第一行为地址目录,第二行为服务器地址,从第三行开始是接受文件的主机
#作者:河南农信 “飞越无限”              tel:03753391193    qq:58016532
#版本:2006/01/20  (Today is my boy's birthday,I love him!!)
my_ftp()   #ftp函数
{
ftp -i -n "$ftp_address" << FTPIT
user "$ftp_user" "$ftp_passwd"
cd /tmp
bin
hash
put "$put_file" /tmp/"$get_file"
chmod 755 /tmp/"$get_file"
by
FTPIT
echo "OK.......\07"
}

ftp_menu()
{
clear
setcolor hi_white
echo "\n\n"
echo "\t\t┏━━━━━━━━━━━━━━━━┓"
echo "\t\t┃                                ┃"
echo "\t\t┃     1   向单个主机传送文件     ┃"
echo "\t\t┃     2   向所有主机传送文件     ┃"
echo "\t\t┃     0   退出                   ┃"
echo "\t\t┃                                ┃"
echo "\t\t┗━━━━━━━━━━━━━━━━┛"
echo "\t\t\t请选择:\c"
setcolor white
}

#主程序
ftp_user=root            #ftp的登陆用户
ftp_passwd=*******       #ftp的登陆用户密码
while true
do
ftp_menu
read choise0
[ "$choise0" -eq 0 ] && break
[ "$choise0" -ge 1 -a "$choise0" -le 2 ] || continue
echo "请输入要发送的文件名(带绝对路径):\c"
while read put_file
  do
     if [ -f "$put_file" ]
       then
         break
       else
         echo "^[[33m输入文件不存在,请重新输入:^[[37m\c"
     fi
  done
get_file=`basename "$put_file"`
case $choise0 in                   #向单个主机发送文件
  1)
  echo "请输入接受文件的主机IP地址:\c"
  while read ftp_address
  do
    [ $ftp_address = "0" ] && break
    [ $ftp_address = "n" ] && break
    num=`ping -c 1 $ftp_address | awk '$2 == "packets" {print substr($7,1,1)}'`
    if [ $num = 0 ]
     then
       my_ftp
     else
      echo "^[[41m地址是"$ftp_address"的网点网络不通!!!^[[40m"
     fi
    echo "\n^[[33m请输入接受数据主机的IP地址,退出请输入[0/n]:^[[37m\c"
  done
  ;;

2)        #向全辖主机发送文件
  if [ -f /tmp/auto_ftp.log ]
     then
          rm /tmp/auto_ftp.log
  fi
  IP_address=`tail +3 IP_file | awk -F\| '{print $1}'`
  echo "\n^[[44m开始向辖内所有网点发送文件,请按 y 确认:^[[40m\c"
  read choise2
  if [ $choise2 = y ]
   then
    for ftp_address in $IP_address
      do
        num=`ping -c 1 $ftp_address | awk '$2 == "packets" {print substr($7,1,1)}'`
        if [ $num = 0 ]
          then
             echo "^[[32m向主机地址是"$ftp_address"发送文件......^[[37m"  
             echo "向主机地址是"$ftp_address"发送文件" >>/tmp/auto_ftp.log
             my_ftp
          else
             echo "^[[41m主机IP是"$ftp_address"的网点网络不通!!^[[40m"
             echo "主机IP是"$ftp_address"的网点网络不通!!" >>/tmp/auto_ftp.log
         fi
     done
     echo "\n^[[45m请按任意键返回菜单!^[[40m"
  else
    echo "\n^[[2;14;4m输入错误发送失败!!^[[2;7;0m"
  fi
   read wait
  ;;
esac
done

[ 本帖最后由 xhlshyjy 于 2006-2-4 08:41 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-02-05 10:07 |只看该作者
不错哦,我想请问一下这句话是什么意思?
get_file=`basename "$put_file"`

另外,你这个SHELL在FTP批量时好蠏没有限制一次同时传多少个网点?
我们原来用的FTP SHELL是同时传八个网点,这样可能对系统资源影响少点儿。
我想如果传送失败的LOG可以做成IP_FILE的格式,这样,下次重传失败的网点时就不用重新组织文件了。

论坛徽章:
0
3 [报告]
发表于 2006-02-07 09:14 |只看该作者
原帖由 router 于 2006-2-5 10:07 发表
不错哦,我想请问一下这句话是什么意思?
get_file=`basename "$put_file"`

另外,你这个SHELL在FTP批量时好蠏没有限制一次同时传多少个网点?
我们原来用的FTP SHELL是同时传八个网点,这样可能 ...


put_file 是带绝对路径的,用basename命令可以去掉路径,直接取的文件名,然后给get_file 。这可能是个系统函数,我也是在在看其他shell中看到的觉得还是非常有用的!!

你的建议非常好,我会考虑修改完善的,另外你说的同时向8个网点传送文件,这个如何实现呢?能不能谈谈思路么?非常谢谢!!

[ 本帖最后由 xhlshyjy 于 2006-2-7 09:21 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-02-07 10:05 |只看该作者
程序不错,祝你儿子生日快乐

论坛徽章:
0
5 [报告]
发表于 2006-02-08 08:22 |只看该作者
原帖由 西门子 于 2006-2-7 10:05 发表
程序不错,祝你儿子生日快乐


谢谢!!明确地说06/01/20是我儿子一岁生日!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP