Dlaczego odmowa dostępu dla npm zaczyna korzystać z node-dev?

9

Próbuję uruchomić aplikację node.js z użytkownikiem o niskim poziomie uprawnień. Wszystkie pliki, które znam, są własnością właściwego użytkownika i mają odpowiednio ustawione uprawnienia. Próbuję użyć do tego pliku skryptu. Wzywam skrypt za pomocą tego polecenia

sudo su - nodejs ./start-apps.sh

Skrypt powłoki uruchamia to polecenie, aby uruchomić aplikację

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

npm startjest tutaj udokumentowane . W zasadzie wyciąga polecenie do użycia z pliku package.json, który w naszej aplikacji wygląda następująco:

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

I wyrzuca błąd:

> [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

To shwydaje się mówić, że zgłasza błędy z polecenia powłoki. Nie sądzę, że problemem jest dostęp do npmsamej komendy, ponieważ gdyby tak było, odmowa uprawnień zostałaby podniesiona przed jakimkolwiek wyjściem z komendy npm. Ale żeby to wykluczyć, oto uprawnienia do samej komendy 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

Wygląda na to, że każdy powinien móc to wykonać.

Uprawnienia do node-devwygląda następująco:

$ 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

Próbowałem już chownpodać link do nodejs:nodejs, ale skrypt zawiera ten sam błąd.

Czy jest jakiś problem z uprawnieniami do plików, którego nie widzę w przypadku plików binarnych? Czy też jest to npm/ node-devspecyficzny błąd?

Patrick M.
źródło

Odpowiedzi:

10

Drugi node-devnie jest wykonywalny, a dowiązanie symboliczne wskazuje na to. Chociaż dowiązanie symboliczne jest wykonywalne (dowiązania symboliczne to zawsze 777), liczy się tryb pliku, który wskazuje; zwróć uwagę, że wywołanie chmodlinku faktycznie zmienia tryb pliku, na który wskazuje (uprawnienia do dowiązania symbolicznego nigdy się nie zmieniają).

Może więc musisz dodać bit wykonywalny dla wszystkich:

chmod 755 /home/nodejs/spicoli-authorization/node_modules/.bin/node-dev
Złotowłosa
źródło
O tak, nie wiedziałem za dużo o chmoddowiązaniu symbolicznym, po prostu próbowałem zmiany własności. Spróbuję teraz wykonać egzekucję - nie mogę uwierzyć, że to przegapiłem. Myślę, że myślałem, że kopia w moim .npmkatalogu na pewno zostanie wykonana. Nie mogłem wymyślić, jak to sprawdzić, ponieważ node-devnpm nie jest zainstalowany globalnie, więc bash nie rozpoznał node-devpolecenia; npm po prostu magicznie domyśla się, gdzie i jak zadzwonić.
Patrick M