如何在bash脚本中将(FTP)文件上传到服务器?

And*_*rew 52 ftp bash

我正在尝试编写一个将文件上传到服务器的bash脚本.我怎样才能做到这一点?bash脚本是否适合用于此目的?

Bri*_*new 78

您可以使用heredoc来执行此操作,例如

ftp -n $Server <<End-Of-Session
# -n option disables auto-logon

user anonymous "$Password"
binary
cd $Directory
put "$Filename.lsm"
put "$Filename.tar.gz"
bye
End-Of-Session
Run Code Online (Sandbox Code Playgroud)

因此ftp进程在stdin上提供所有内容End-Of-Session.产生任何过程的有用提示,而不仅仅是ftp!请注意,这可以节省产生一个单独的进程(echo,cat等).不是主要的资源节约,但值得铭记.

  • +1此方法对于如此多的脚本非常有用. (5认同)
  • @erikb85 - 这用于脚本,而不是(必须)用于交互式使用。Heredoc 将自动在您的“会话结束”标记上注册一个行为(您可能会使用 EOF 或类似的) (2认同)

gre*_*les 64

以下是两个答案.首先是建议使用更安全/灵活的解决方案,如ssh/scp/sftp.其次是如何在批处理模式下运行ftp的说明.

安全的解决方案:

你真的应该使用SSH/SCP/SFTP而不是FTP.SSH/SCP具有更安全和使用公钥/私钥的优点,允许它在没有用户名或密码的情况下运行.

您可以发送单个文件:

scp <file to upload> <username>@<hostname>:<destination path>
Run Code Online (Sandbox Code Playgroud)

或整个目录:

scp -r <directory to upload> <username>@<hostname>:<destination path>
Run Code Online (Sandbox Code Playgroud)

有关使用RSYNC设置密钥和将文件移动到服务器的更多详细信息,如果您要移动大量文件,或者有时在一组随机文件中只获得一个新文件,则非常有用,请查看:

http://troy.jdmz.net/rsync/index.html

您也可以在sshing到服务器后执行单个命令:

man ssh

ssh [... snipped ...] hostname [command]如果指定了command,则在远程主机而不是登录shell上执行.

因此,示例命令是:

ssh username@hostname.example bunzip file_just_sent.bz2
Run Code Online (Sandbox Code Playgroud)

如果你可以使用带有密钥的SFTP来获得安全连接的好处,那么我用来执行命令有两个技巧.

首先,您可以使用echo和pipe传递命令

echo "put files*.xml" | sftp -p -i ~/.ssh/key_name username@hostname.example
Run Code Online (Sandbox Code Playgroud)

您还可以使用带有-b参数的批处理文件:

sftp -b batchfile.txt ~/.ssh/key_name username@hostname.example
Run Code Online (Sandbox Code Playgroud)

一个FTP解决方案,如果你真的需要它:

如果您了解FTP不安全且更有限,并且您真的想要编写脚本...

http://www.stratigery.com/scripting.ftp.html上有一篇很棒的文章

#!/bin/sh
HOST='ftp.example.com'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'

ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
binary
put $FILE
quit
END_SCRIPT
exit 0
Run Code Online (Sandbox Code Playgroud)

ftp的"-n"确保命令不会尝试从当前终端获取密码.另一个奇特的部分是使用heredoc:<<END_SCRIPT启动heredoc,然后END_SCRIPT在行的开头就完全相同,结束了heredoc.该binary命令将其设置为二进制模式,如果您正在传输除文本文件之外的其他内容,这将有所帮助.

  • 虽然这对OP来说是有用的建议,但它不应该是公认的答案.它没有回答原始问题(通过谷歌找到) (14认同)
  • 其他一些海报已经在FTP命令中添加了二进制模式(即`bin`).由于您的答案是公认的,我建议您也将此添加到您的答案中. (2认同)

Pel*_*son 28

ftp命令不是为脚本设计的,因此控制它很笨拙,获得其退出状态更笨拙。

Curl是可编写脚本的,并且还有一个优点,您可以稍后通过修改 URL 轻松切换到其他协议。如果您将 FTP 凭据放在.netrc 中,则只需执行以下操作:

# Download file
curl --netrc --remote-name ftp://ftp.example.com/file.bin
# Upload file
curl --netrc --upload-file file.bin ftp://ftp.example.com/
Run Code Online (Sandbox Code Playgroud)

如果必须,您可以使用--user username:password代替直接在命令行上指定用户名和密码--netrc

  • 这是更简单的解决方案。 (2认同)

Pau*_*lin 18

安装ncftpput和ncftpget.它们通常是同一个包装的一部分.

  • @Adam"连接不会被加密"等是使用FTP的结果,这是在问题中指定的.无论您使用什么FTP客户端,都会发生这种情况. (3认同)
  • 命令行是:“ncftpput -u username -p password server.org /path/filename.blah” 注意连接不会被加密,密码将以明文形式发送。 (2认同)

小智 7

命令在一行:

ftp -in -u ftp://username:password@servername/path/to/ localfile
Run Code Online (Sandbox Code Playgroud)

  • 什么是`-u`?放?工具和联机帮助都不知道. (4认同)
  • 您正在使用哪个版本的ftp?它在ubuntu 18上不起作用 (4认同)
  • @erikbwork -u是:" - u URL文件[...] - 将命令行上的文件上传到URL,其中URL是自动提取支持的ftp URL类型之一(具有单个文件上载的可选目标文件名) ),文件是一个或多个要上传的本地文件." (2认同)

Sha*_*hal 6

使用它将文件上传到远程位置

#!/bin/bash
#$1 is the file name
#usage:this_script <filename>
HOST='your host'
USER="your user"
PASSWD="pass"
FILE="abc.php"
REMOTEPATH='/html'

ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
cd $REMOTEPATH
put $FILE 
quit
END_SCRIPT
exit 0
Run Code Online (Sandbox Code Playgroud)