Por que a permissão negada para o npm start usa o node-dev?

9

Estou tentando iniciar um aplicativo node.js com um usuário com baixas permissões. Todos os arquivos que eu conheço pertencem ao usuário correto e têm permissões definidas razoavelmente bem. Estou tentando usar um arquivo de script para fazer isso. Eu invoco o script com este comando

sudo su - nodejs ./start-apps.sh

O script de shell executa este comando para iniciar o aplicativo

cd "/home/nodejs/my-app"
npm start

npm startestá documentado aqui . Basicamente, ele puxa o comando para usar fora do arquivo package.json, que em nosso aplicativo fica assim:

// snip
"scripts": {
    "start": "node-dev app"
  },

E cospe o erro:

> [email protected] start /home/nodejs/my-app
> node-dev app

sh: 1: node-dev: Permission denied

npm ERR! [email protected] start: `node-dev app`
npm ERR! Exit status 126

Isso shparece estar dizendo que está relatando erros do comando shell. Eu não acho que o problema esteja acessando o npmpróprio comando, porque, se fosse, a permissão negada seria aumentada antes de qualquer saída do comando npm. Mas apenas para descartar, aqui estão as permissões para o próprio comando npm:

$ sudo find / ! \( -type d \) -name npm -exec ls -lah {} \;
-rwxr-xr-x 1 root root 274 Nov 12 20:22 /usr/local/src/node-v0.10.22/deps/npm/bin/npm
-rwxr-xr-x 1 root root 274 Nov 12 20:22 /usr/local/lib/node_modules/npm/bin/npm
lrwxrwxrwx 1 root root 38 Jan 14 07:49 /usr/local/bin/npm -> ../lib/node_modules/npm/bin/npm-cli.js

Parece que todos devem ser capazes de executá-lo.

As permissões para node-devficar assim:

$ sudo find / ! \( -type d \) -name node-dev -exec ls -lah {} \;
-rwxr-xr-x 1 nodejs nodejs 193 Mar  3  2013 /home/nodejs/.npm/node-dev/2.1.4/package/bin/node-dev
-rw-r--r-- 1 nodejs nodejs 193 Mar  3  2013 /home/nodejs/spicoli-authorization/node_modules/node-dev/bin/node-dev
lrwxrwxrwx 1 root root 24 Jan 14 07:50 /home/nodejs/spicoli-authorization/node_modules/.bin/node-dev -> ../node-dev/bin/node-dev

Eu já tentei chowno link nodejs:nodejs, mas o script apresenta o mesmo erro.

Existe algum problema de permissão de arquivo que não estou vendo nos arquivos binários? Ou este é um npm/ node-devde erro específica?

Patrick M
fonte

Respostas:

10

O segundo node-devnão é executável e o link simbólico aponta para isso. Embora o link simbólico seja executável (links simbólicos são sempre 777), é o modo do arquivo para o qual ele aponta; observe que a chamada chmodno link realmente altera o modo do arquivo para o qual ele aponta (as permissões de link simbólico nunca são alteradas).

Então, talvez você precise adicionar o bit executável para todos:

chmod 755 /home/nodejs/spicoli-authorization/node_modules/.bin/node-dev
Cachinhos Dourados
fonte
Ah, sim, eu não sabia muito sobre chmodum link simbólico, apenas tentei a mudança de propriedade. Vou tentar a execução agora - não acredito que perdi isso. Acho que estava pensando que a cópia no meu .npmdiretório seria executada com certeza. Eu não conseguia pensar em como verificar isso, porque o node-devnpm não está instalado globalmente, então o bash não reconhece o node-devcomando; O NPM descobre magicamente onde e como chamar.
Patrick M