最近在使用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

ftp [-pinegvtd] [Host]

参数:

注意:该命令为 0.17 版本的 ftp 命令,不同版本间有细微的差异,其中 [-dignv] 5个命令为通用命令,各版本一致。具体可以使用 ftp -help 这一命令查看。

提示:部分版本会用 [-A] 命令,如果出现 “connect: 没有到主机的路由”这一问题,可以使用 [-A] 命令解决。

2. 连接FTP – open

FTP > open Host [port]

参数 port为端口号,Host同上。

如果使用上述“ftp”命令时已经加上Host参数则不需要再使用该命令。

3.登录用户 – user

FTP > user username [password] [account]

参数:

4.结束 – close/disconnect/bye/!/quit

FTP > close
FTP > disconnect
FTP > bye
FTP > by
FTP > !
FTP > quit

close 和 disconnect,只结束与远程服务器的 FTP 会话,还留在 FTP 程序内。bye(或 by)、!、quit,关闭 FTP 对话并退出 FTP。

5.编码 – ascii/binary

FTP > ascii
FTP > binary
FTP > bi

FTP 支持两种文件传送类型,ASCII 码和二进制码(binary 或 bi)。

6.更改目录 – cd/cdup/lcd

FTP > cd remote-dir
FTP > cdup
FTP > lcd [directory]

7.上传 – send/put/mput

FTP > send local-file [remote-file]
FTP > put local-file [remote-file]
FTP > mput local-files

参数:

send 和 put 是上传单个文件,mput 是上传多个文件。

8.下载 – get/mget/reget/recv

FTP > get remote-file [local-file]
FTP > recv remote-file [local-file]
FTP > reget remote-file [local-file]
FTP > mget remote-files

参数:

get 和 recv 一样,下载单个文件,reget 类似 get,但若 local-file 存在,则从上次传输中断处续传。mget 则下载多个文件。

9.帮助 – ?/help

FTP > ? [command]
FTP > help [command]

参数:command 是需要帮助的命令的名称。如果没有,ftp 将显示全部远程命令的列表。

SFTP常用命令

1.连接登录SFTP – sftp

sftp [user@]host

参数:user 是登录的用户名;host 是远程的ip地址。

执行上面的命令后, linux shell 会提示用户输入密码, 输入password后就可以成功建立 sftp 连接。

2.帮助 – help

SFTP > help

3.查看当前目录 – pwd/lpwd

SFTP > pwd
SFTP > lpwd

pwd 是查看远端服务器的目录, 即 sftp 服务器默认的当前目录。lpwd 是看本地目录。

4.显示目录文件和子目录的缩写列表 – ls/lls

SFTP > ls
SFTP > lls

ls 是查看远端服务器的。lls 是看本地的。

5.上传 – put

SFTP > put [-P] local [remote]

#如:将本地文件a.txt上传到远程主机/tmp/目录
SFTP > put a.txt /tmp/

上传多个文件用 *** 等模糊匹配命令即可,参数 **-P 指把文件的权限和时间戳都复制过来。

6.下载 – get

SFTP > get [-P] local [remote]

用法与 put 类似。

7. 执行本地命令 – !

SFTP > !cmd

参数:cmd为命令,执行为本地执行,并非远程主机执行。

FTP 有同样的用法,上面没写上。

8.退出 – exit/quit

SFTP > exit
SFTP > quit
SFTP > bye
SFTP > !

除了 ! 是保留进程退回到本地 shell 界面外,其他都是直接退出 SFTP 进程。

9.移动目录 – cd/lcd

同 ftp 的 cd/lcd 命令。

shell脚本

所用命令参数可以查看上面的 FTP 命令SFTP 命令

FTP实现上传

#!/bin/bash
ftp -n<<!
open 192.168.1.1
user guest 123456
binary
cd /home/data
lcd /home/databackup
prompt
mput *
close
bye
!

FTP实现下载

#!/bin/bash
ftp -n<<!
open 192.168.1.1
user guest 123456
binary
cd /home/data
lcd /home/databackup
prompt
mget *
close
bye
!

SFTP实现上传

#!/bin/sh
sftp guest@192.168.1.1 << EOF
cd /home/data/
lcd /home/databackup/
-put 201912
-put 202001
quit
EOF

SFTP实现下载

#!/bin/sh
sftp guest@192.168.1.1 << EOF
cd /home/data/
lcd /home/databackup/
-get 201912
-get 202001
quit
EOF

说明

  1. « 是使用即时文件重定向输入。
  2. ! 或 EOF 是即时文件的标志,它必须成对出现,以标识即时文件的开始和结尾。两者在 FTP 和 SFTP 都可以使用。
  3. get 命令前加一个“”以防止其执行错误时 sftp 执行过程被终止。

上述脚本需要修改 IP、登录用户名、密码和文件路径(文件名),自定义的FTP(SFTP)命令需要在即时文件的标志(! 或 EOF)中。

FTP 需要实现单文件上传下载,将 mget 改为 get 等单文件命令即可。SFTP 需要实现批量文件上下传可以将具体文件名改为 ***** 等模糊匹配标志即可。

SFTP 脚本执行时会出现登录密码输入提醒,需要输入正确的密码才能继续执行。如果需要实现全自动脚本,可以使用 lftp 等命令,或者使用密钥对实现。如果后续有时间会更新这部分内容,敬请关注。

本文由 小TiD笔记 发布在小TiD笔记,转载此文请保持文章完整性,并请附上文章来源(小TiD笔记)及本页链接。

原文链接: https://www.tidnotes.ga/2020/01/linux-shell-ftp.html