pipe道stderr到系统日志里面的自动ftp脚本

我正在使用简单的脚本来自动化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 

但我想pipeSTDERR到系统日志和STDOUT到一个日志文件。 通常我会这样做: ftp -nv $FTP_HOST 1>>ftp.log | logger<<END_FTP ftp -nv $FTP_HOST 1>>ftp.log | logger<<END_FTP但在这种情况下,由于<<END_FTP ,将<<END_FTP 。 我应该怎样做才能使脚本工作? 请注意,我只想在脚本中redirect来自FTP命令的输出,而不是整个脚本。

这可以在不使用临时文件的情况下工作。 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 

怎么样:

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

在你面前的ftp脚本

执行此I / O重定向的另一种方法是使用{}操作,因此:

 { 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 

为什么不创建一个netrc文件,让它做你的登录和把你的文件。

netrc文件可以让你登录,并允许你定义一个init宏来创建需要的目录,并把你想要的文件放在那里。 大多数ftp命令可以让你指定你想使用的netrc文件,所以你可以使用各种netrc文件来达到各种目的。

这是一个名为my_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