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

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

我正在尝试编写将文件上传到服务器的bash脚本。 我该如何实现? bash脚本是正确的选择吗?

Andrew asked 2020-02-03T12:53:31Z

12个解决方案

77 votes

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

ftp -n $Server <

# -n option disables auto-logon

user anonymous "$Password"

binary

cd $Directory

put "$Filename.lsm"

put "$Filename.tar.gz"

bye

End-Of-Session

因此ftp进程将以标准输入为标准,最多包含End-Of-Session。这是生成任何进程的有用技巧,而不仅仅是ftp! 请注意,这样可以省去生成单独的进程(回声,猫等)。 这不是节省大量资源,但值得牢记。

Brian Agnew answered 2020-02-03T12:55:22Z

63 votes

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

一个安全的解决方案:

您确实应该为此使用SSH / SCP / SFTP而不是FTP。 SSH / SCP的优点是更安全,并且可以使用公钥/私钥来运行,而无需用户名或密码即可运行。

您可以发送一个文件:

scp @:

或整个目录:

scp -r @:

有关使用RSYNC设置密钥并将文件移动到服务器的更多详细信息,如果要移动的文件很多,或者有时在一组随机文件中只有一个新文件,这将很有用,请查看:

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

切入服务器后,您还可以执行一个命令:

来自man ssh

ssh [... snipped ...]主机名[command]如果指定了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

您还可以将批处理文件与<

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 <

quote USER $USER

quote PASS $PASSWD

binary

put $FILE

quit

END_SCRIPT

exit 0

ftp的“ -n”确保该命令不会尝试从当前终端获取密码。 另一个花哨的部分是使用Heredoc:<

greggles answered 2020-02-03T12:54:57Z

18 votes

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

Paul Tomblin answered 2020-02-03T12:55:41Z

7 votes

一行命令:

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

Chizhik answered 2020-02-03T12:56:01Z

6 votes

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

#!/bin/bash

#$1 is the file name

#usage:this_script

HOST='your host'

USER="your user"

PASSWD="pass"

FILE="abc.php"

REMOTEPATH='/html'

ftp -n $HOST <

quote USER $USER

quote PASS $PASSWD

cd $REMOTEPATH

put $FILE

quit

END_SCRIPT

exit 0

Shal answered 2020-02-03T12:56:22Z

4 votes

#/bin/bash

# $1 is the file name

# usage: this_script

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

ennuikiller answered 2020-02-03T12:56:38Z

3 votes

无需使事情复杂化-这应该起作用:

#/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 ...

Martin Hvidberg answered 2020-02-03T12:57:03Z

1 votes

使您的文件扎根的工作示例...........看到它非常简单

#!/bin/sh

HOST='ftp.users.qwest.net'

USER='yourid'

PASSWD='yourpw'

FILE='file.txt'

ftp -n $HOST <

quote USER $USER

quote PASS $PASSWD

put $FILE

quit

END_SCRIPT

exit 0

Shal answered 2020-02-03T12:57:23Z

0 votes

cd C:\ Program档案(x86)\ WinSCP

winscp.exe /控制台/命令“打开用户名:** @服务器”“放置文件路径”

Naveen Sharma answered 2020-02-03T12:57:47Z

0 votes

如果要在'for'中使用它来复制每天生成的文件的最后生成的文件...

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

oso_togari answered 2020-02-03T12:58:08Z

0 votes

--user username:password命令不是为脚本设计的,因此对其进行控制很尴尬,而获得退出状态则更加尴尬。

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指定用户名和密码。

Pelle Nilsson answered 2020-02-03T12:58:37Z

-1 votes

echo -e "open \nuser \nbinary\nmkdir New_Folder\nquit"|ftp -nv

Yavuz Karali answered 2020-02-03T12:58:53Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值