web-dev-qa-db-ja.com

bashスクリプトでサーバーに(FTP)ファイルをアップロードする方法は?

ファイルをサーバーにアップロードするbashスクリプトを作成しようとしています。どうすればこれを達成できますか?これにはbashスクリプトを使用するのが適切ですか?

48
Andrew

以下は2つの答えです。 1つ目は、ssh/scp/sftpなどのより安全で柔軟なソリューションを使用することです。 2番目は、バッチモードでftpを実行する方法の説明です。

安全なソリューション:

FTPではなく、SSH/SCP/SFTPを使用する必要があります。 SSH/SCPには、より安全であり、公開キー/秘密キーを操作できるという利点があり、ユーザー名またはパスワードなしで実行できます。

単一のファイルを送信できます:

scp <file to upload> <username>@<hostname>:<destination path>

またはディレクトリ全体:

scp -r <directory to upload> <username>@<hostname>:<destination path>

キーを設定し、RSYNCを使用してサーバーにファイルを移動する方法の詳細については、移動するファイルがたくさんある場合や、ランダムファイルのセットの中から新しいファイルを1つだけ取得する場合に便利です:

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

サーバーに投入した後、単一のコマンドを実行することもできます。

man sshから

ssh [... snipped ...] hostname [command] commandを指定すると、ログインシェルの代わりにリモートホストで実行されます。

したがって、コマンドの例は次のとおりです。

ssh [email protected] bunzip file_just_sent.bz2

キー付きのSFTPを使用してセキュリティで保護された接続の利点を得ることができる場合、コマンドの実行に使用した2つのトリックがあります。

まず、エコーとパイプを使用してコマンドを渡すことができます

echo "put files*.xml" | sftp -p -i ~/.ssh/key_name [email protected]

-bパラメーターでバッチファイルを使用することもできます。

sftp -b batchfile.txt ~/.ssh/key_name [email protected]

本当に必要な場合の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

Ftpの「-n」は、コマンドが現在の端末からパスワードを取得しようとしないようにします。もう1つの派手な部分は、ヒアドキュメントの使用です。<<END_SCRIPTがヒアドキュメントを開始し、行の先頭でまったく同じEND_SCRIPTが単独でヒアドキュメントを終了します。 binaryコマンドは、テキストファイル以外のものを転送する場合に役立つバイナリモードに設定します。

61
greggles

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プロセスは、End-Of-Session。 ftpだけでなく、あらゆるプロセスを生成するための便利なヒントです!これにより、別のプロセス(echo、catなど)の生成が節約されることに注意してください。大幅なリソース節約ではありませんが、留意する価値があります。

77
Brian Agnew

Ncftpputとncftpgetをインストールします。通常、これらは同じパッケージの一部です。

18
Paul Tomblin

1行のコマンド:

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

これを使用してファイルをリモートの場所にアップロードします

#!/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
6
Shal
#/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
4
ennuikiller

物を複雑にする必要はありません-これは動作するはずです:

#/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を使用できます...

3
Martin Hvidberg

ファイルをルートに置くための作業例...........その非常にシンプルな例を見る

#!/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
1
Shal

「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
0
oso_togari

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を使用して、コマンドラインでユーザー名とパスワードを直接指定できます。

0
Pelle Nilsson

cd C:\ Program Files(x86)\ WinSCP

winscp.exe/console/command "ユーザー名を開く:** @ Server" "ファイルパスを置く"

0
Naveen Sharma