我的目标是从lxc容器外部的ubuntu文件夹中执行两个命令。
我已经尝试了几件事,但是我认为这个示例是我最接近的工作。
如果我跑步
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变量以相同的方式填充?
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=/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
我还在.bashrc文件的底部注意到了该nvm代码。据我了解,听起来.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
答案 0 :(得分:1)
以下命令应该为您完成工作
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;;
如果非交互式bash,此代码将阻止执行.bashrc
的其余部分。因此,要使其具有交互性,您应该添加-i
标志