最近在使用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]
参数:
- -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
open Host [port]
参数 : port为端口号,Host同上。
如果使用上述“ftp”命令时已经加上Host参数则不需要再使用该命令。
3.登录用户 – user
user username [password] [account]
参数:
- username :用户名。
- password :username 的密码。如果没有填写,但必须填写,ftp 会提示输入密码。
- account :登录到远程计算机所使用的帐户。如果没有填写account,但是需要填写,ftp 会提示您输入帐户。
4.结束 – close/disconnect/bye/!/quit
close
disconnect
bye
by
!
quit
close 和 disconnect,只结束与远程服务器的 FTP 会话,还留在 FTP 程序内。bye(或 by)、!、quit,关闭 FTP 对话并退出 FTP。
5.编码 – ascii/binary
ascii
binary
bi
FTP 支持两种文件传送类型,ASCII 码和二进制码(binary 或 bi)。
6.更改目录 – cd/cdup/lcd
cd remote-dir
cdup
lcd [directory]
- cd :更改的远程计算机上的目录,跳转到 remote-dir 这个目录 。
- cdup :更改的远程计算机上的目录,跳到上一层目录。
- lcd :更改本地计算机上的目录为 directory。如果没有填写 directory,将显示本地计算机中当前的工作目录。
7.上传 – send/put/mput
send local-file [remote-file]
put local-file [remote-file]
mput local-files
参数:
- local-file(s) :复制的本地文件。
- remote-file :在远程计算机上使用的名称。如果没有,文件将命名为 local-file。
send 和 put 是上传单个文件,mput 是上传多个文件。
8.下载 – get/mget/reget/recv
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。
get 和 recv 一样,下载单个文件,reget 类似 get,但若 local-file 存在,则从上次传输中断处续传。mget 则下载多个文件。
9.帮助 – ?/help
? [command]
help [command]
参数:command 是需要帮助的命令的名称。如果没有,ftp 将显示全部远程命令的列表。
SFTP常用命令
1.连接登录SFTP – sftp
sftp [user@]host
参数:user 是登录的用户名;host 是远程的ip地址。
执行上面的命令后, linux shell 会提示用户输入密码, 输入password后就可以成功建立 sftp 连接。
2.帮助 – help
help
3.查看当前目录 – pwd/lpwd
pwd
lpwd
pwd 是查看远端服务器的目录, 即 sftp 服务器默认的当前目录。lpwd 是看本地目录。
4.显示目录文件和子目录的缩写列表 – ls/lls
ls
lls
ls 是查看远端服务器的。lls 是看本地的。
5.上传 – put
put [-P] local [remote]
#如:将本地文件a.txt上传到远程主机/tmp/目录
put a.txt /tmp/
上传多个文件用 * 等模糊匹配命令即可,参数 -P 指把文件的权限和时间戳都复制过来。
6.下载 – get
get [-P] local [remote]
用法与 put 类似。
7. 执行本地命令 – !
!cmd
参数:cmd为命令,执行为本地执行,并非远程主机执行。
FTP 有同样的用法,上面没写上。
8.退出 – exit/quit
exit
quit
bye
!
除了 ! 是保留进程退回到本地 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
说明
- << 是使用即时文件重定向输入。
- ! 或 EOF 是即时文件的标志,它必须成对出现,以标识即时文件的开始和结尾。两者在 FTP 和 SFTP 都可以使用。
- 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