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

lzc*_*lzc 2 unix ssh perl environment-variables

我的目标是在Perl的@INC数组中注入它始终可以工作的状态,并且在任何情况下都可以调用perl

为了使它SpecialMoudle.pm不在默认 @INC数组中时起作用,我添加了:

PERLLIB=/path/to/special/module
Run Code Online (Sandbox Code Playgroud)

/etc/environmentLinux盒子上的文件中,它按出售方式工作:

$ 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
.
Run Code Online (Sandbox Code Playgroud)

我得到:

Yep SpecialMoudle.pm loaded
Run Code Online (Sandbox Code Playgroud)

但是当我在同一台机器上SSH时

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

我得到相同的:

/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
.
Run Code Online (Sandbox Code Playgroud)

但是奇怪的是我也得到了:

在@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机器上尝试了同样的方法,并且在那里没有问题。在盒子上,我有perl v5.8.8,为什么它不起作用?特别是因为我在错误输出中看到/ path / to / special / module

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

(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
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

yst*_*sth 5

要通过ssh识别/ etc / environment,我相信您需要在/ etc / ssh / sshd_config中启用UsePAM(这对我不是很熟悉)。

您可以export PERL5LIB=...在/ etc / profile中添加它(作为),但是随后需要使ssh使用登录外壳程序(ssh foo 'sh -l -c command')。

如果您的perl至少为5.10且已为此建立(可以使用进行检查perl -V:usesitecustomize),则每次perl启动时,它将运行系统范围内的sitecustomize.pl脚本,您可以在其中放置use lib ...;语句。请参阅http://perldoc.perl.org/perlrun.html#*-f*