ファイルをサーバーにアップロードするbashスクリプトを作成しようとしています。どうすればこれを達成できますか?これにはbashスクリプトを使用するのが適切ですか?
以下は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が安全ではなく、より制限されていることを理解し、本当にスクリプトを作成したい場合...
これに関するすばらしい記事が 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
コマンドは、テキストファイル以外のものを転送する場合に役立つバイナリモードに設定します。
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など)の生成が節約されることに注意してください。大幅なリソース節約ではありませんが、留意する価値があります。
Ncftpputとncftpgetをインストールします。通常、これらは同じパッケージの一部です。
1行のコマンド:
ftp -in -u ftp://username:password@servername/path/to/ localfile
これを使用してファイルをリモートの場所にアップロードします
#!/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
#/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
物を複雑にする必要はありません-これは動作するはずです:
#/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を使用できます...
ファイルをルートに置くための作業例...........その非常にシンプルな例を見る
#!/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
「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
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
を使用して、コマンドラインでユーザー名とパスワードを直接指定できます。
cd C:\ Program Files(x86)\ WinSCP
winscp.exe/console/command "ユーザー名を開く:** @ Server" "ファイルパスを置く"