我想写将文件上载到服务器的bash脚本。 我怎样才能做到这一点? 是一个bash脚本用于此正确的事情?
Answer 1:
下面是两个答案。 首先是使用诸如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
您也可以ssh方式连接到服务器后执行一个命令:
从man ssh
SSH [...剪断...]主机名[命令]如果指定命令,则远程主机,而不是登录壳上执行。
所以,示例性的命令是:
ssh username@hostname.example bunzip file_just_sent.bz2
如果您可以使用SFTP的钥匙,以获得安全连接的好处,也有我用来执行命令两个技巧。
首先,你可以通过使用echo和管道命令
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
该“-n”到FTP确保命令不会尝试从当前终端获取密码。 其他花哨的部分是使用定界符的:在<<END_SCRIPT
开始定界符,然后把相同的END_SCRIPT
对自身行的开始结束定界符。 该binary
命令将其设置为二进制模式,帮助,如果你正在转移除文本文件以外的东西。
Answer 2:
您可以使用定界符来做到这一点如
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进程被馈送一切达标准输入End-Of-Session
。 产卵的过程中任何一个有用的技巧,不局限于FTP! 请注意,这节省了产卵一个单独的进程(回声,猫等)。 不是主要的资源节约型,但值得铭记。
Answer 3:
安装ncftpput和ncftpget。 他们通常是同一个包的一部分。
Answer 4:
在一个行命令:
ftp -in -u ftp://username:password@servername/path/to/ localfile
Answer 5:
用它来上传文件到远程位置
#!/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
Answer 6:
#/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
Answer 7:
无需复杂的东西 - 这应该工作:
#/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的,如果你有很多文件...
Answer 8:
工作示例把你的文件上根...........看到它很简单
#!/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
Answer 9:
CD C:\ Program Files文件(x86)的\的WinSCP
winscp.exe /控制台/命令“开放用户名:* * @server”“把文件路径”
Answer 10:
如果你想用它内部有一个“为”到最后生成的文件复制的每一天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
Answer 11:
该ftp
命令不适用于脚本,因此控制很尴尬,并得到它的退出状态更是尴尬。
卷曲被制成编写脚本,并且还具有可以很容易地通过只是修改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
。
Answer 12:
echo -e "open <ftp.hostname>\nuser <username> <password>\nbinary\nmkdir New_Folder\nquit"|ftp -nv