Как использовать lxc exc для выдачи нескольких команд от имени конкретного пользователя - PullRequest
0 голосов
/ 19 июня 2019

Моя цель - выполнить две команды в определенной папке как ubuntu вне его контейнера lxc.

Я пробовал пару вещей, но я подумал, что этот пример наиболее близок к работе.

Если я запускаю

root@host$  lxc exec my-containter -- sudo --login --user ubuntu eval "cd /home/ubuntu/mydir && pwd && whoami && env && npm install && echo done"

Я получаю сообщение об ошибке установки npm, которое не может найти какой-либо модуль, но похоже, что я правильный пользователь

Однако еслиЯ вручную делаю это, как два шага, это работает ... но я пытаюсь поместить это в скрипт bash, чтобы я мог продолжать выполнять операции на хосте, поэтому я думаю, что он мне нужен как один.

root@host$  lxc exec my-containter -- sudo --login --user ubuntu 
ubuntu@my-container$  eval "cd /home/ubuntu/mydir && pwd && whoami && env && npm install && echo done";

Я обнаружил, что моя переменная окружения PATH отличается в этих двух ситуациях, а в той, где происходит сбой, отсутствует конкретный путь для nvm / npm.Я попытался экспортировать его во время команды eval, но кажется, что доступные мне ресурсы уже найдены?Что можно сделать, чтобы переменная PATH заполнялась одинаково в однострочном сценарии?

PATH из 1 строки (неинтерактивно)

PATH=/home/ubuntu/bin:/home/ubuntu/.local/bin:/home/ubuntu/bin:/home/ubuntu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/snap/bin:/snap/bin

PATH из 2 строк (интерактивный)

PATH=/home/ubuntu/bin:/home/ubuntu/.local/bin:/home/ubuntu/.nvm/versions/node/v8.9.4/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/snap/bin

Я также заметил этот код nvm внизу моего файла .bashrc.Из того, что я прочитал, звучит так, что файл .bashrc выполняется только в интерактивном режиме.

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

1 Ответ

1 голос
/ 24 июня 2019

Следующая команда должна выполнить эту работу за вас

lxc exec my-containter -- sudo --login --user ubuntu bash -ilc "cd /home/ubuntu/mydir && pwd && whoami && npm install && echo done"

Файл .bashrc находится внизу вверху

case $- in
    *i*) ;;
      *) return;;

Этот код предотвращает оставшуюся часть .bashrc для выполнения в случае неинтерактивного bash.Поэтому, чтобы сделать его интерактивным, вы должны добавить флаг -i

...