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

时间:2009-12-12 18:48:11

标签: bash ftp

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

12 个答案:

答案 0 :(得分: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等)。不是节省大量资源,但值得牢记。

答案 1 :(得分:57)

以下是两个答案。首先是建议使用更安全/灵活的解决方案,如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]如果指定了命令,则为   在远程主机而不是登录shell上执行。

因此,示例命令是:

ssh username@hostname.example bunzip file_just_sent.bz2

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

首先,您可以使用echo和pipe

传递命令
echo "put files*.xml" | sftp -p -i ~/.ssh/key_name username@hostname.example

您还可以将批处理文件与-b参数一起使用:

sftp -b batchfile.txt ~/.ssh/key_name username@hostname.example

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命令将其设置为二进制模式,如果您正在传输文本文件以外的其他内容,这将有所帮助。

答案 2 :(得分:18)

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

答案 3 :(得分:6)

命令在一行中:

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

答案 4 :(得分: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

答案 5 :(得分: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

答案 6 :(得分: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,如果你有很多文件......

答案 7 :(得分: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

答案 8 :(得分:0)

cd C:\ Program Files(x86)\ WinSCP

winscp.exe / console / command“打开UserName: * * @Server”“放置文件路径”

答案 9 :(得分:0)

如果你想在&#39;中使用它。复制最后生成的文件为每天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

答案 10 :(得分: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在命令行上直接指定用户名和密码。

答案 11 :(得分:-1)

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