指令FTP/SFTP(有/无密码)连接、下载以及上传

mac shell环境

主要说明使用expect自动输入密码形式访问,以下是a.sh脚本(后缀必须是.sh)

#!/bin/bash

echo "SFTP 连接"

# SFTP默认端口22 FTP默认端口21 (注意以下所有参数必须是字符串"")
Port="22"
User="UserName"
Host="127.0.0.1"
Pass="123456"

# 将本地/local下的目录树创建到SFTP指定主机的/remote/下(利用find awk gsub进行)
createFolder = `find /local/ -type d -exec ls -d {} \; | awk '{ gsub("/local/","/remote/",$1}; if($1=="")next;print "expect \"sftp>\"";print "send \"mkdir " $1"\r\""; }'`

/usr/bin/expect <"
send "put /local/a.txt /remote/a.txt\r"
expect "sftp>"
send "get /remote/a.txt /local/a.txt\r"
$createFolder
expect "sftp>"
send "bye\r"
FLAGEOF

echo "结束 SFTP"

 单独解释下这一行复杂点的代码做了什么事情;

# 将本地/local下的目录树创建到SFTP指定主机的/remote/下(利用find awk gsub进行)
 

createFolder = `find /local/ -type d -exec ls -d {} \; | awk '{ gsub("/local/","/remote/",$1}; if($1=="")next;print "expect \"sftp>\"";print "send \"mkdir " $1"\r\""; }'`

可拆解如下几个小块,逐一说明大概做的事情

find /local/ -type d -exec ls -d {} \;

        查询出本地/local/路径下的全部文件夹路径输出到{}缓存

awk '{ gsub("/local/","/remote/",$1}; if($1=="")next;print "expect \"sftp>\"";print "send \"mkdir " $1"\r\""; }'`

        awk指令取出缓存里的文件夹路径逐个进行如下操作:

gsub("/local/","/remote/",$1};

        将路径使用/remote/替换/local/(全部替换)结果会输出到$1,即gsub是一次性替换则一定会输出到$1变量

if($1=="")next;

        如果$1是空字符串则直接跳过这一次,否则进入如下:

print "expect \"sftp>\"";

        打印输出expect "sftp>"指令到sftp环境下执行

print "send \"mkdir " $1"\r\"";

        打印输出send "mkdir $1 \r"指令到sftp环境下执行

 执行a.sh方法如下

cd ~/Users
./a.sh

 FTP匿名

ftip -nv $Host <

FTP非匿名[username]和[password]

ftip -nv $Host <

FTP仅输入password情况 

ftip -nv $Host <

你可能感兴趣的:(个人见解,语言学习,#,U3D项目经验,shell,ftp,sftp)