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 传送到系统日志,将 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 重定向的另一种方法是使用{...}操作,因此:

{
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 回答