3
votes

I am new to Perl so please bear with me. Thank you for your assistance.

I have an Ubuntu machine with Perl on it. I followed the local::lib bootstrapping guide

I used cpanm to install DBI and other modules to my system. I am concerned there may be other DBI modules available on my system which could be part of the problem. This is the result of find / -name 'DBI.pm' 2>/dev/null:

/home/ubuntu/.cpanm/work/16125643.6178/DBI-1.643/blib/lib/DBI.pm
/home/ubuntu/.cpanm/work/16125643.6178/DBI-1.643/blib/lib/Bundle/DBI.pm
/home/ubuntu/.cpanm/work/16125643.6178/DBI-1.643/DBI.pm
/home/ubuntu/.cpanm/work/16125643.6178/DBI-1.643/lib/Bundle/DBI.pm
/home/ubuntu/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/DBI.pm
/home/ubuntu/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/Bundle/DBI.pm

I added 2 lines to my .bashrc file. (I added the second line because I broke things for the non-root user and this fixed it; maybe I broke something with local::lib?)

eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"
PERL5LIB="/home/ubuntu/perl5/lib/perl5"

I can run my perl script as a non-root user. If I run with sudo perlScript.pl I get this error: Can't locate DBI.pm in @INC (you may need to install the DBI module)

I have been troubleshooting @INC for a while now and cannot figure out how to adjust it for the root user. I have tried various things including adding PERL5LIB to .profile and calling my script like so: sudo sh -c '. ~/.profile; perl ~/perlScripts/perlScript.pl "argForScript"' (I verified that PERL5LIB is being set with sudo sh -c '. ~/.profile; echo $PERL5LIB')

However I always get the @INC error. The most obvious thing I have noticed is comparing sudo perl -V and perl -V. The sudo call does not show any ENV vars and the @INC does not include the desired PERL5LIB location. The non-sudo call does show the desired ENV and @INC vars.

I am considering wiping things and doing a fresh install with root privileges for local::lib and cpan. Not really sure what else to try at this point.

1
For what reason do you build a local library for user 'ubuntu' and don't you install the Perl modules globally when at the end your scripts have to run as 'root'? - Tekki
"If I run with sudo ..." Why would you run it with sudo ? When you installed local::lib you installed it for user ubuntu so it will not work for another user like root - Håkon Hægland
Re "I am considering wiping things and doing a fresh install with root privileges for local::lib and cpan. Not really sure what else to try at this point.", That's not going to prevent sudo from not passing on PERL5LIB. Setting PERL5LIB inside of sudo will do the trick. - ikegami
I prefer to install my own Perl rather than using local::lib. perlbrew can help with that. - ikegami
If you install modules for / owned by the 'ubuntu' user and then let root user use them, you now have a security hole whereby the ubuntu user can escalate to root privileges. Stuff executed by root should be owned by root. - Dave Mitchell

1 Answers

0
votes

These are the commands that ended up working for me. I corrupted my first environment with local::lib / non-sudo cpan install, so I setup a fresh VM.

sudo apt install make
sudo apt install build-essential
sudo apt install libmysqlclient-dev
sudo cpan App::cpanminus
cpanm --sudo DBI
cpanm --sudo Array::Utils
cpanm --sudo DBD::mysql