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
缺点:查参方式。。。