PERLLIB 已成功注入 @INC 数组,但不适用于非交互式 shell

PERLLIB succesfully injected in @INC array but does not work with non-interactive shell

我的目标是在 Perl 的 @INC 数组中注入它工作 always 并且在 any 条件下 perl 可能是调用

为了在 SpecialMoudle.pm 不在 default @INC 数组中时工作,我添加了:

PERLLIB=/path/to/special/module

/etc/environment 文件中,在 Linux 盒子上,它按原样使用:

$ perl -le "print for @INC"; perl -MSpecialMoudle -e "print qq/Yep SpecialMoudle.pm loaded\n/"
/path/to/special/module
/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl
/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/5.8.8
.

我得到:

Yep SpecialMoudle.pm loaded

但是当我 ssh 到相同机器

$ ssh $(hostname -i) 'perl -le "print for @INC"; perl -MSpecialMoudle -e "print qq/Yep SpecialMoudle.pm loaded\n/"'

我也一样:

/path/to/special/module
/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl
/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/5.8.8
.

但奇怪的是我还得到:

无法在@INC 中找到 SpecialMoudle.pm(@INC 包含:/path/to/special/module /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-l inux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .)。 BEGIN 失败--编译中止。

当然没有输出...

现在,我尝试用另一个装有 perl v5.10.1 的 Linux 框进行同样的操作,没有问题。在 this 框中,我有 perl v5.8.8 为什么它不起作用?特别是因为我在错误输出中 看到 /path/to/special/module?

编辑 为@pilcrow 添加,因为我在 Whosebug 中看不到任何其他方式来显示易于阅读的原始数据。

(env | sort; which perl) 原始:

_=/bin/env
CVSROOT=:ext:10.20.30.40:/home/cvs/repository/
CVS_RSH=ssh
EDITOR=vi
G_BROKEN_FILENAMES=1
HISTSIZE=1000
HOME=/home/stackop
HOSTNAME=sdcbatch2
INPUTRC=/etc/inputrc
LANG=en_US.UTF-8
LESSOPEN=|/usr/bin/lesspipe.sh %s
LOGNAME=stackop
LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:
MAIL=/var/spool/mail/stackop
PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin
PERLLIB=/path/to/special/module
PWD=/home/stackop
SHELL=/bin/bash
SHLVL=1
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_CLIENT=100.101.102.103 65279 22
SSH_CONNECTION=100.101.102.103 65279 10.30.50.70 22
SSH_TTY=/dev/pts/1
TERM=ansi
USER=stackop
/usr/bin/perl

(ssh $(hostname -i) 'env | sort; which perl') 原始:

_=/bin/env
HOME=/home/stackop
LANG=en_US.UTF-8
LOGNAME=stackop
MAIL=/var/mail/stackop
PATH=/usr/local/bin:/bin:/usr/bin
PERLLIB=/path/to/special/module
PWD=/home/stackop
SHELL=/bin/bash
SHLVL=1
SSH_CLIENT=10.30.50.70 39857 22
SSH_CONNECTION=10.30.50.70 39857 10.30.50.70 22
USER=stackop
/usr/bin/perl

要通过 ssh 识别 /etc/environment,我相信您需要在 /etc/ssh/sshd_config 中启用 UsePAM(这还有其他我不太熟悉的含义)。

您可以在 /etc/profile 中添加它(如 export PERL5LIB=...),但是您需要让 ssh 使用登录 shell (ssh foo 'sh -l -c command').

如果你的 perl 至少是 5.10 并且已经被构建为这样做(你可以检查 perl -V:usesitecustomize),每次 perl 启动时它都会 运行 一个系统范围的 sitecustomize.pl 脚本您可以在其中放置 use lib ...; 语句。参见 http://perldoc.perl.org/perlrun.html#*-f*

感谢@pilcrow 和跟进聊天,我 'think' 我发现了问题,运行:

$ diff <(ssh $(hostname -i) 'perl -V') <(perl -V)
40c40
<     PERLLIB="/path/to/special/module "
---
>     PERLLIB="/path/to/special/module"
42c42
<     /path/to/special/module
---
>     /path/to/special/module

GEEE:是额外的 space 吗?

$ cat -A /etc/environment
PERLLIB=/path/to/special/module $

我会用 root 权限与我的系统管理员确认,我会报告回来!