Мне связали проблему с nodejs. У меня есть nodejs двоичные файлы здесь: ~/node-v8.5.0-linux-x64/
и у меня есть гибкая ссылка, что я создал использование: ln -s node-v8.5.0-linux-x64/ node
.
В моем .bashrc у меня есть это: export PATH=$PATH:$HOME/node/bin
.
node
и npm
работают отлично, когда я обычно зарегистрирован. Поскольку они оба установлены в моем доме, я не должен быть зарегистрирован как корень для установки пакета глобально.
Но я хотел попробовать; таким образом я работал:
sudo npm install -g angular-cli
sudo node app.js
и это не работало.
sudo: node : command not found
Я думал, возможно, $PATH
изменения, когда я использую sudo
но затем я проверил его использование sudo echo $PATH
:
/home/dc/bin:/home/dc/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/dc/node/bin
Оболочка должна знать, куда пойти, когда я ввожу node
команда, но кажется, что это не делает. Я также попробовал -H
, -i
и -u
опции для sudo
но ничего подобного не помогает также.
Кто-то может объяснить, что происходит здесь?
Нет, sudo
не сохраняет Ваш $PATH
переменная среды из соображений безопасности. Вместо этого это заменяется a secure_path
определенный в /etc/sudoers
, который Вы не должны изменять.
$ sudo grep secure_path /etc/sudoers
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Вы думаете, чтобы проверить что $PATH
переменная остается такой же с Вашей командой
sudo echo $PATH
но на самом деле Bash разворачивает переменные прежде, чем начать выполнять любого (здесь sudo
) команда, что означает строку выше, показывает Ваше собственное $PATH
значение. Получить тот как sudo
, используйте, например.
sudo bash -c 'echo $PATH'
То, что можно сделать, к, например, разрешите команду, которую Вы хотите выполнить (node
или npm
) в оболочке Вашего собственного пользователя использование обрабатывают замену с which
:
sudo "$(which npm)" install -g angular-cli
sudo "$(which node)" app.js
Это сначала работает which npm
или which node
как Ваш пользователь, который возвращает полный путь исполняемых файлов, принадлежащих указанным командам. Затем тот вывод буквально вставляется в Ваш sudo
команда, таким образом, sudo
на самом деле полагает, что это выполнялось с полными путями как ниже, устраняя необходимость искать что-либо в $PATH
:
sudo /home/dc/node/bin/npm install -g angular-cli
sudo /home/dc/node/bin/node app.js
Вы можете просто создать программную ссылку для узла, npm и npx в каталоге /sbin например
ln -s /usr/local/lib/nodejs/node-v12.14.1-linux-x64/bin/node /sbin/node
Синтаксис > ln -s (источник) (назначение)
Теперь запущенный sudo-узел
должен работать