如何在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