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