Я пытаюсь написать bash script, который загружает файл на сервер. Как я могу это достичь? Является ли bash script правильным для использования?
Как загрузить (FTP) файлы на сервер в bash script?
Ответ 1
Вы действительно должны использовать 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 [команда] Если задана команда, это выполненный на удаленном хосте вместо оболочки входа.
Итак, пример команды:
ssh [email protected] bunzip file_just_sent.bz2
Если вы можете использовать SFTP с ключами, чтобы получить преимущество защищенного соединения, есть два трюка, которые я использовал для выполнения команд.
Сначала вы можете передавать команды с использованием эха и канала
echo "put files*.xml" | sftp -p -i ~/.ssh/key_name [email protected]
Вы также можете использовать пакетный файл с параметром -b
:
sftp -b batchfile.txt ~/.ssh/key_name [email protected]
Если вы понимаете, что FTP небезопасен и более ограничен, и вы действительно хотите script его...
Там есть отличная статья на 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" to ftp гарантирует, что команда не попытается получить пароль от текущего терминала. Другая причудливая часть - использование heredoc: <<END_SCRIPT
запускает heredoc, а затем тот же самый END_SCRIPT
в начале строки сам по себе заканчивает heredoc. Команда binary
установит его в двоичный режим, который поможет, если вы переносите что-то, отличное от текстового файла.
Ответ 2
Вы можете использовать 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! Обратите внимание, что это экономит нереста отдельного процесса (эхо, кошка и т.д.). Не важно экономить ресурсы, но стоит иметь в виду.
Ответ 3
Установите ncftpput и ncftpget. Они обычно являются частью одного и того же пакета.
Ответ 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
Ответ 5
в одной строке:
ftp -in -u ftp://username:[email protected]/path/to/ localfile
Ответ 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
Ответ 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, если у вас много файлов...
Ответ 8
cd C:\Program Files (x86)\WinSCP
winscp.exe/console/command "открыть UserName: ** @Server" "положить путь к файлу"
Ответ 9
Рабочий пример для размещения файла на корне........... см. его очень простой
#!/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
Ответ 10
если вы хотите использовать его внутри 'for', чтобы скопировать последние сгенерированные файлы для ежедневного 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
Ответ 11
echo -e "open <ftp.hostname>\nuser <username> <password>\nbinary\nmkdir New_Folder\nquit"|ftp -nv