3

簡単なスクリプトを使用して ftp を自動化しています。スクリプトは次のようになります。

ftp -nv $FTP_HOST<<END_FTP
user $FTP_USER $FTP_PASS
binary
mkdir $REMOTE_DIR
cd $REMOTE_DIR
lcd $LOCAL
put $FILE
bye
END_FTP

しかし、STDERR を syslog に、STDOUT をログファイルにパイプしたいと思います。通常、私はそのようなことをします:ftp -nv $FTP_HOST 1>>ftp.log | logger<<END_FTPしかし、この場合、<<END_FTP. スクリプトを機能させるにはどうすればよいですか? スクリプト全体ではなく、スクリプト内の FTP コマンドからの出力のみをリダイレクトすることに注意してください。

4

4 に答える 4

3

これは、エラー出力に一時ファイルを使用せずに機能します。2>&1は、エラー出力を標準出力の送信先 (パイプ) に送信します。標準エラーの>>出力先を変更せずに、標準出力の出力先 (現在はファイル) を変更します。したがって、エラーは にlogger、出力は に送られftp.logます。

ftp -nv $FTPHOST <<END_FTP 2>&1 >> ftp.log | logger
user $FTP_USER $FTP_PASS
binary
mkdir $REMOTE_DIR
cd $REMOTE_DIR
lcd $LOCAL
put $FILE
bye
END_FTP
于 2012-08-29T13:15:05.797 に答える
0

どうですか:

 exec > mylogfile; exec 2> >(logger -t myftpscript)

あなたの前でftpスクリプト

于 2012-08-29T13:00:39.203 に答える
0

この I/O リダイレクトを行うもう 1 つの方法は、次のように{...}操作を使用することです。

{
ftp -nv $FTPHOST <<END_FTP >> ftp.log
user $FTP_USER $FTP_PASS
binary
mkdir $REMOTE_DIR
cd $REMOTE_DIR
lcd $LOCAL
put $FILE
bye
END_FTP
# Optionally other commands here...stderr will go to logger too
} 2>&1 | logger

これは、多くの場合、すべてのコマンドではなく複数のコマンドが同じ I/O リダイレクトを必要とする場合に最適なメカニズムです。

ただし、コンテキストでは、このソリューションが最適だと思います(ただし、それは私のものではなく、他の誰かの答えです):

ftp -nv $FTPHOST <<END_FTP 2>&1 >> ftp.log | logger
...
END_FTP
于 2012-08-29T20:26:40.683 に答える
0

netrcファイルを作成し、それでログインしてファイルを配置してみませんか。

netrcファイルを使用すると、ログインして、必要なディレクトリを作成し、そこに必要なファイルを配置するinitマクロを定義できます。ほとんどの ftp コマンドでは、使用するnetrcファイルを指定できるため、さまざまなnetrcファイルをさまざまな目的で使用できます。

と呼ばれるnetrcファイルの例を次に示しmy_netrcます。

machine ftp_host
user ftp_user
password swordfish
macrodef init
binary
mkdir my_dir
cd my_dir
put my_file
bye

次に、これを行うことができます:

$ ftp -v -Nmy_netrc $FTPHOST 2>&1 >> ftp.log | logger
于 2012-08-29T20:54:14.120 に答える