我正在尝试编写一个将文件上传到服务器的bash脚本。我怎样才能做到这一点? bash脚本是否适合用于此目的?
答案 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不安全且更有限,并且您真的想要编写脚本...
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