最近在使用shell脚本时,需要使用到 ftp
进行上传和下载,趁最近一段时间还算有空,总结一下 ftp
和 sftp
的一些Linux命令和利用shell脚本实现 ftp
和 sftp
批量上传下载的方法。
FTP
和 SFTP
区别
在linux系统中,最常见的文件传输的方式莫过于 ftp
和 sftp
了。
FTP
(File Transfer Protocol),即文件传输协议,用于Internet上控制文件的双向传输。
FTP
在linux系统中,传输默认的端口为21端口,通常以ASCII码和二进制的方式传输数据,支持主动模式和被动模式两种方式。
SFTP
(Secure File Transfer Protocol),即文件加密传输协议。
SFTP
在linux系统中,传输默认的端口为22端口,这种传输方式更为安全,传输双方既要进行密码安全验证,还要进行基于密钥的安全验证,有效的防止了“中间人”的威胁和攻击。
两个比较起来,ftp传输会比sftp传输速率快,毕竟sftp牺牲了一定的效率,以保证传输过程的安全。
FTP
常用命令
1.初始或连接 - ftp
1 | ftp [-pinegvtd] [Host] |
参数:
-p
启用被动模式。-i
传送多个文件时禁用交互提示。-n
在建立初始连接后禁止自动登录功能。-e
禁用行读取。-g
禁用文件名组合。Glob 允许使用星号 (*) 和问号 (?) 作为本地文件和路径名的通配符字符。-v
详细模式,显示指令执行过程。-t
启用数据包跟踪。-d
启用调试、显示在 FTP 客户端和 FTP 服务器之间传递的所有命令。Host
指定要连接的计算机名、IP 地址或 IPv6 地址。如果指定了主机名或地址,则其必须是命令行的最后一个参数。
注意: 该命令为 0.17 版本的
ftp
命令,不同版本间有细微的差异,其中[-dignv]
5个命令为通用命令,各版本一致。具体可以使用ftp -help
这一命令查看。
提示: 部分版本会用
[-A]
命令,如果出现 “connect: 没有到主机的路由”这一问题,可以使用[-A]
命令解决。
2. 连接FTP - open
1 | open Host [port] |
参数: port
为端口号,Host
同上。
如果使用上述 ftp
命令时已经加上 Host
参数则不需要再使用该命令。
3.登录用户 - user
1 | user username [password] [account] |
参数:
username
用户名。password
密码。如果没有填写,但必须填写,ftp
会提示输入密码。account
登录到远程计算机所使用的帐户。如果没有填写account
,但是需要填写,ftp
会提示您输入帐户。
4.结束 - close
/disconnect
/bye
/!
/quit
1 | close |
close
和 disconnect
,只结束与远程服务器的 FTP
会话,还留在 FTP
程序内。bye
(或 by
)、 !
、 quit
,关闭 FTP
对话并退出 FTP
。
5.编码 - ascii
/binary
1 | ascii |
FTP
支持两种文件传送类型,ASCII 码和二进制码(binary
或 bi
)。
6.更改目录 - cd
/cdup
/lcd
1 | cd remote-dir |
cd
更改的远程计算机上的目录,跳转到remote-dir
这个目录 。cdup
更改的远程计算机上的目录,跳到上一层目录。lcd
更改本地计算机上的目录为directory
。如果没有填写directory
,将显示本地计算机中当前的工作目录。
7.上传 - send
/put
/mput
1 | send local-file [remote-file] |
参数:
local-file(s)
复制的本地文件。remote-file
在远程计算机上使用的名称。如果没有,文件将命名为local-file
。
send
和put
是上传单个文件,mput
是上传多个文件。
8.下载 - get
/mget
/reget
/recv
1 | get remote-file [local-file] |
参数:
remote-file(s)
复制的远程文件。local-file
在本地计算机上使用的名称。如果没有,文件将命名为remote-file
。
get
和 recv
一样,下载单个文件, reget
类似 get
,但若 local-file
存在,则从上次传输中断处续传。 mget
则下载多个文件。
9.帮助 - ?
/help
1 | ? [command] |
参数: command
是需要帮助的命令的名称。如果没有, ftp
将显示全部远程命令的列表。
SFTP
常用命令
1.连接登录SFTP - sftp
1 | sftp [user@]host |
参数: user
是登录的用户名; host
是远程的ip地址。
执行上面的命令后, linux shell 会提示用户输入密码, 输入password后就可以成功建立 sftp
连接。
2.帮助 - help
1 | help |
3.查看当前目录 - pwd
/lpwd
1 | pwd |
pwd
是查看远端服务器的目录, 即 sftp
服务器默认的当前目录。 lpwd
是看本地目录。
4.显示目录文件和子目录的缩写列表 - ls
/lls
1 | ls |
ls
是查看远端服务器的。 lls
是看本地的。
5.上传 - put
1 | put [-P] local [remote] |
上传多个文件用 *
等模糊匹配命令即可,参数 -P
指把文件的权限和时间戳都复制过来。
6.下载 - get
1 | get [-P] local [remote] |
用法与 put
类似。
7. 执行本地命令 - !
1 | !cmd |
参数: cmd
为命令,执行为本地执行,并非远程主机执行。
FTP
有同样的用法,上面没写上。
8.退出 - exit
/quit
1 | exit |
除了 !
是保留进程退回到本地 shell
界面外,其他都是直接退出 SFTP
进程。
9.移动目录 - cd
/lcd
同 ftp
的 cd
/lcd
命令。
shell脚本
所用命令参数可以查看上面的 FTP
命令和 SFTP
命令。
FTP
实现上传
1 |
|
FTP
实现下载
1 |
|
SFTP
实现上传
1 |
|
SFTP
实现下载
1 |
|
说明
<<
是使用即时文件重定向输入。!
或EOF
是即时文件的标志,它必须成对出现,以标识即时文件的开始和结尾。两者在FTP
和SFTP
都可以使用。get
命令前加一个 “-
” 以防止其执行错误时 sftp 执行过程被终止。
上述脚本需要修改 IP、登录用户名、密码和文件路径(文件名),自定义的 FTP
(SFTP
)命令需要在即时文件的标志(!
或 EOF
)中。
FTP
需要实现单文件上传下载,将 mget
改为 get
等单文件命令即可。 SFTP
需要实现批量文件上下传可以将具体文件名改为 *
等模糊匹配标志即可。
SFTP
脚本执行时会出现登录密码输入提醒,需要输入正确的密码才能继续执行。如果需要实现全自动脚本,可以使用 lftp
等命令,或者使用密钥对实现。如果后续有时间会更新这部分内容,敬请关注。