在linuxshell脚本的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`.' []
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
linux循环执行命令脚本USER=xx
PASS=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
缺点:查参⽅式。。。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论