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

问题描述 投票:46回答:12

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

bash ftp
12个回答
59
投票

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

安全的解决方案:

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

您可以发送单个文件:

scp <file to upload> <username>@<hostname>:<destination path>

或整个目录:

scp -r <directory to upload> <username>@<hostname>:<destination path>

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

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

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

来自man ssh

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

因此,示例命令是:

ssh [email protected] bunzip file_just_sent.bz2

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

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

echo "put files*.xml" | sftp -p -i ~/.ssh/key_name [email protected]

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

sftp -b batchfile.txt ~/.ssh/key_name [email protected]

一个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

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


0
投票

如果你想在'for'中使用它来复制最后生成的文件,那就是每天的bacakup ......

j=0  
var="`find /backup/path/ -name 'something*' -type f -mtime -1`"  
#we have in $var some files with last day change date

for i in $var  
  do  
  j=$(( $j + 1 ))  
  dirname="`dirname $i`"  
  filename="`basename $i`"  
  /usr/bin/ftp -in >> /tmp/ftp.good 2>> /tmp/ftp.bad << EOF  
    open 123.456.789.012  
    user user_name passwd  
    bin  
    lcd $dirname  
    put $filename  
    quit  
  EOF      #end of ftp  
done       #end of for iteration

0
投票

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/

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


-1
投票
echo -e "open <ftp.hostname>\nuser <username> <password>\nbinary\nmkdir New_Folder\nquit"|ftp -nv

77
投票

您可以使用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

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


18
投票

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


6
投票

命令在一行:

ftp -in -u ftp://username:password@servername/path/to/ localfile

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

4
投票
#/bin/bash
# $1 is the file name
# usage: this_script  <filename>
IP_address="xx.xxx.xx.xx"
username="username"
domain=my.ftp.domain
password=password

echo "
 verbose
 open $IP_address
 USER $username $password
 put $1
 bye
" | ftp -n > ftp_$$.log

3
投票

不需要复杂的东西 - 这应该工作:

#/bin/bash
echo "
 verbose
 open ftp.mydomain.net
 user myusername mypassword
 ascii
 put textfile1
 put textfile2
 bin
 put binaryfile1
 put binaryfile2
 bye
" | ftp -n > ftp_$$.log

或者你可以使用mput,如果你有很多文件...


1
投票

将文件放在Root上的工作示例...........看得很简单

#!/bin/sh
HOST='ftp.users.qwest.net'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'

ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
put $FILE
quit
END_SCRIPT
exit 0

0
投票

cd C:\ Program Files(x86)\ WinSCP

winscp.exe / console / command“打开UserName:** @ Server”“put file path”

© www.soinside.com 2019 - 2024. All rights reserved.