最近在使用shell脚本时,需要使用到 ftp 进行上传和下载,趁最近一段时间还算有空,总结一下 ftpsftp 的一些Linux命令和利用shell脚本实现 ftpsftp 批量上传下载的方法。

FTPSFTP 区别

在linux系统中,最常见的文件传输的方式莫过于 ftpsftp 了。

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
2
3
4
5
6
close
disconnect
bye
by
!
quit

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

5.编码 - ascii/binary

1
2
3
ascii
binary
bi

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

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

1
2
3
cd remote-dir
cdup
lcd [directory]
  • cd 更改的远程计算机上的目录,跳转到 remote-dir 这个目录 。
  • cdup 更改的远程计算机上的目录,跳到上一层目录。
  • lcd 更改本地计算机上的目录为 directory。如果没有填写 directory,将显示本地计算机中当前的工作目录。

7.上传 - send/put/mput

1
2
3
send local-file [remote-file]
put local-file [remote-file]
mput local-files

参数:

  • local-file(s) 复制的本地文件。
  • remote-file 在远程计算机上使用的名称。如果没有,文件将命名为 local-file

sendput 是上传单个文件, mput 是上传多个文件。

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

1
2
3
4
get remote-file [local-file]
recv remote-file [local-file]
reget remote-file [local-file]
mget remote-files

参数:

  • remote-file(s) 复制的远程文件。
  • local-file 在本地计算机上使用的名称。如果没有,文件将命名为 remote-file

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

9.帮助 - ?/help

1
2
? [command]
help [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
2
pwd
lpwd

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

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

1
2
ls
lls

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

5.上传 - put

1
2
3
4
put [-P] local [remote]

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

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

6.下载 - get

1
get [-P] local [remote]

用法与 put 类似。

7. 执行本地命令 - !

1
!cmd

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

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

8.退出 - exit/quit

1
2
3
4
exit
quit
bye
!

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

9.移动目录 - cd/lcd

ftpcd/lcd 命令。

shell脚本

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

FTP 实现上传

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
ftp -n<<!
open 192.168.1.1
user guest 123456
binary
cd /home/data
lcd /home/databackup
prompt
mput *
close
bye
!

FTP 实现下载

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
ftp -n<<!
open 192.168.1.1
user guest 123456
binary
cd /home/data
lcd /home/databackup
prompt
mget *
close
bye
!

SFTP 实现上传

1
2
3
4
5
6
7
8
#!/bin/sh
sftp [email protected] << EOF
cd /home/data/
lcd /home/databackup/
-put 201912
-put 202001
quit
EOF

SFTP 实现下载

1
2
3
4
5
6
7
8
#!/bin/sh
sftp [email protected] << EOF
cd /home/data/
lcd /home/databackup/
-get 201912
-get 202001
quit
EOF

说明

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

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

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

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