我已经使用perl为mailx编写了一个包装器程序,它允许我轻松添加附件并执行一些其他漂亮的事情,这些事情对于mailx来说有点令人沮丧。
在我的前几行中:
use strict;
use warnings;
use Getopt::Long;
my ( $to, $from, $subject, $attachments, $body, $file ) = (undef) x 7;
GetOptions(
"to=s" => \$to,
"from=s" => \$from,
"subject=s" => \$subject,
"attachments=s" => \$attachments,
"body=s" => \$body,
"file=s" => \$file,
);
$to = getlogin unless $to;
$from = getlogin unless $from;
$subject = " " unless $subject;
到目前为止,这个包装器在被其他脚本调用时工作正常。但是现在我们有一个由Cron运行的脚本,一些有趣的事情正在发生。此Cron作业通过仅指定-t和-su来调用包装器,但省略-fr(正在使用标志的缩写)。生成的电子邮件正确设置为:但是发件人列为-s@blah.com,主题行为空。根据上面的代码,我只能假设Cron和Getopt :: Long模块之间存在一些奇怪的问题。有谁知道为什么Cron的工作可能导致这种奇怪的行为?如果它是其他错误的东西会是什么?
答案 0 :(得分:5)
Perl的getlogin
可能不会从cron返回任何有用的内容,引用getlogin(3)
:
getlogin() returns a pointer to a string containing
the name of the user logged in on the controlling
terminal of the process, or a null pointer if this
information cannot be determined.
我建议您更改crontab,以便始终为依赖getlogin
的任何选项明确包含用户名。您还可以更改包装器以使用getpwuid($<)
。 (有关perlvar(1)
和perlfunc(1)
的详细信息,请参阅$<
和getpwuid
。)
为什么搞砸了你的mailx,我不知道,但我猜你正在使用反引号,exec
或system
用字符串来启动mailx,而不是{ {1}}或exec
列表。