在linux shell脚本的for循环里调用ftp命令

1关于ftp:

它只是一个文件传输工具,看似和shell命令在执行中有相似,但其实有一些细节的地方是很不一样的习惯

    1  区分ftp命令和shell命令

在shell中可以创建touch ,vi文件,而进入ftp命令后就只能执行上传下载,lcd,cd,cd这类命令,如果要对文件进行修改,只能先下载到本地,执行后再上传,这样就直接覆盖掉了之前的

ftp>lcd /home/lsx/src1

ftp>put test.sh


    注意:这个put的一个参数是要上传的文件,直接tab就可以快速提示文件名,第二个参数就是上面lcd的目录,也可以直接指定,但是不可以使用.这样的shell的操作符,否则ftp会报错!

    2 区分ftp服务器和客户端: 我们直接执行ftp的命令

注意:以下是通过lftp进入的,当执行本地文件查看命令是ok的,lcd,lpwd(ftp无lpwd,只有pwd),但是一旦要查看服务器上文件,就connecting,连不上,但lftp并不如ftp直接,连不上服务器时,ftp会直接告知,并不能进入ftp的命令行

另外,这里我们使用的都是ftp的客户端,服务端叫做sftpd

[gmd@tcbj3-dmetl01 log-upload]$ lftp name:password@ip:port
lftp aitingftp@10.120.64.128:~> lpwd
/atmd/etltasks/gmd/log-upload
lftp aaaftp@10.120.11.11:~> lcd test1
lcd ok, local cwd=/atmd/etltasks/gmd/log-upload/test1
lftp aaaftp@10.120.11.11:~> lcd ..
lcd ok, local cwd=/atmd/etltasks/gmd/log-upload
lftp aaaftp@10.120.11.11:~> mirror -R test1 .
bye`.' [Connecting...]
Interrupt
lftp aaaftp@10.120.11.11:~> bye

    3 区分ftp客户端命令和ssh服务器命令

    进入服务器后,所有的操作都是基于登录服务器的,而进入ftp的客户端命令,还是基于当前机器,来同时将本机和打开的ftp服务器做交互的。

回到主题,单独在linux shell脚本中调用ftp命令是ok的

#!/bin/bash -e
ftp -n -v  << EOF
        open $HOST $PORT
        user $USER $PASS
        mkdir $EXECUTE_YEAR
        cd $EXECUTE_YEAR
        mkdir $EXECUTE_DAY
        bye
EOF

但如果在脚本for循环里直接这样调用ftp命令是不可以的:

错误写法

EOF是个文件结束符和上面的是一对

这里只能把这部分包裹起来执行: 这里还有一个问题,就是结尾的EOF必须放在行首,不能有空格,否则报错:

       for upfile in `ls $localLog_Dir/$module`
       do
                echo upfile:$upfile
                #开始逐个上传文件$localLog_Dir/$module/$upfile
                ftp_uplog=`ftp -n -v  << EOF
                                passive
                                open $HOST $PORT
                                user $USER $PASS
                                binary
                                cd /$EXECUTE_YEAR/$EXECUTE_DAY/$module
                                lcd /$localLog_Dir/$module
                                put $upfile
                                bye
EOF`
       done

上面的方式,有错误的话,不会提示,换种方式,以脚本调用

opftp.sh

#!/bin/bash
USER=xx
PASS=xx
HOST=106.xx.xx.xx
PORT=21
ftp -n -v  << EOF
        open $HOST $PORT
        user $USER $PASS
        binary
        prompt
        $1
        $2
        $3
        bye
EOF
for module in `ls $zip_dir`
do
       echo module: $module
       mkdir $zip_flag_dir/$module
       ftp_mkdir_module="ftp -n -v  << EOF
                            open $HOST $PORT
                            user $USER $PASS
                            cd $EXECUTE_YEAR/$EXECUTE_DAY/
                            mkdir $module
                            prompt
                            mdelete /$EXECUTE_YEAR/$EXECUTE_DAY/$module/*
                            bye
EOF"
       $upload_dir/opftp.sh "cd $EXECUTE_YEAR/$EXECUTE_DAY/" "mkdir $module" "mdelete /$EXECUTE_YEAR/$EXECUTE_DAY/$module/*"
done

缺点:查参方式。。。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值