node.js 无法使用 curl 安装 NPM

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15508118/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 13:55:35  来源:igfitidea点击:

Cannot install NPM using curl

bashnode.jsnpm

提问by Ryan Rich

Receiving this error when attempting to install NPM. Any help on this error is greatly appreciated.

尝试安装 NPM 时收到此错误。非常感谢对此错误的任何帮助。

$ curl http://npmjs.org/install.sh | sh
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
100    85    0    85    0     0   2226      0 --:--:-- --:--:-- --:--:--  4473
sh: line 1: syntax error near unexpected token `newline'
sh: line 1: `<html>Moved: <a href="https://npmjs.org/install.sh">https://npmjs.org/install.sh</a>'

Changed the command from http://... --> https:// and still no luck.

从 http://... --> https:// 更改了命令,但仍然没有运气。



Other info:

其他信息:

OS: Mac OSX 10.8.2

操作系统:Mac OSX 10.8.2

CURL: curl 7.24.0 (x86_64-apple-darwin12.0)

卷曲:卷曲 7.24.0 (x86_64-apple-darwin12.0)



So I attempted the install as a superuser and was promptly met with this mountain of text. I'm completely lost here.

因此,我尝试以超级用户身份进行安装,并立即遇到了大量文本。我完全迷失在这里。

$ sudo curl https://npmjs.org/install.sh | sh
Password:
#!/bin/sh

# A word about this shell script:
#
# It must work everywhere, including on systems that lack
# a /bin/bash, map 'sh' to ksh, ksh97, bash, ash, or zsh,
# and potentially have either a posix shell or bourne
# shell living at /bin/sh.
#
# See this helpful document on writing portable shell scripts:
# http://www.gnu.org/s/hello/manual/autoconf/Portable-Shell.html
#
# The only shell it won't ever work on is cmd.exe.

if [ "x
curl -O https://npmjs.org/install.sh
sudo sh install.sh
" = "xsh" ]; then # run as curl | sh # on some systems, you can just do cat>npm-install.sh # which is a bit cuter. But on others, &1 is already closed, # so catting to another script file won't do anything. curl -s https://npmjs.org/install.sh > npm-install-$$.sh sh npm-install-$$.sh ret=$? rm npm-install-$$.sh exit $ret fi # See what "npm_config_*" things there are in the env, # and make them permanent. # If this fails, it's not such a big deal. configures="`env | grep 'npm_config_' | sed -e 's|^npm_config_||g'`" npm_config_loglevel="error" if [ "x$npm_debug" = "x" ]; then (exit 0) else echo "Running in debug mode." echo "Note that this requires bash or zsh." set -o xtrace set -o pipefail npm_config_loglevel="verbose" fi export npm_config_loglevel # make sure that node exists node=`which node 2>&1` ret=$? if [ $ret -eq 0 ] && [ -x "$node" ]; then (exit 0) else echo "npm cannot be installed without nodejs." >&2 echo "Install node first, and then try again." >&2 echo "" >&2 echo "Maybe node is installed, but not in the PATH?" >&2 echo "Note that running as sudo can change envs." >&2 echo "" echo "PATH=$PATH" >&2 exit $ret fi # set the temp dir TMP="${TMPDIR}" if [ "x$TMP" = "x" ]; then TMP="/tmp" fi TMP="${TMP}/npm.$$" rm -rf "$TMP" || true mkdir "$TMP" if [ $? -ne 0 ]; then echo "failed to mkdir $TMP" >&2 exit 1 fi BACK="$PWD" ret=0 tar="${TAR}" if [ -z "$tar" ]; then tar="${npm_config_tar}" fi if [ -z "$tar" ]; then tar=`which tar 2>&1` ret=$? fi if [ $ret -eq 0 ] && [ -x "$tar" ]; then echo "tar=$tar" echo "version:" $tar --version ret=$? fi if [ $ret -eq 0 ]; then (exit 0) else echo "No suitable tar program found." exit 1 fi # Try to find a suitable make # If the MAKE environment var is set, use that. # otherwise, try to find gmake, and then make. # If no make is found, then just execute the necessary commands. # XXX For some reason, make is building all the docs every time. This # is an annoying source of bugs. Figure out why this happens. MAKE=NOMAKE if [ "x$MAKE" = "x" ]; then make=`which gmake 2>&1` if [ $? -eq 0 ] && [ -x $make ]; then (exit 0) else make=`which make 2>&1` if [ $? -eq 0 ] && [ -x $make ]; then (exit 0) else make=NOMAKE fi fi else make="$MAKE" fi if [ -x "$make" ]; then (exit 0) else # echo "Installing without make. This may fail." >&2 make=NOMAKE fi # If there's no bash, then don't even try to clean if [ -x "/bin/bash" ]; then (exit 0) else clean="no" fi node_version=`"$node" --version 2>&1` ret=$? if [ $ret -ne 0 ]; then echo "You need node to run this program." >&2 echo "node --version reports: $node_version" >&2 echo "with exit code = $ret" >&2 echo "Please install node before continuing." >&2 exit $ret fi t="${npm_install}" if [ -z "$t" ]; then # switch based on node version. # note that we can only use strict sh-compatible patterns here. case $node_version in 0.[0123].* | v0.[0123].*) echo "You are using an outdated and unsupported version of" >&2 echo "node ($node_version). Please update node and try again." >&2 exit 99 ;; v0.[45].* | 0.[45].*) echo "install [email protected]" t=1.0 ;; v0.[678].* | 0.[678].*) echo "install [email protected]" t=1.1 ;; *) echo "install npm@latest" t="latest" ;; esac fi # the npmca cert cacert=' -----BEGIN CERTIFICATE----- MIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x IjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w bUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y MTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV BAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj YXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA aXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE OgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz Gn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl y0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC l7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv yNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl ZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op -----END CERTIFICATE----- ' echo "$cacert" > "$TMP/cafile.crt" cacert="$TMP/cafile.crt" # need to echo "" after, because Posix sed doesn't treat EOF # as an implied end of line. url=`(curl -SsL --cacert "$cacert" https://registry.npmjs.org/npm/$t; echo "") \ | sed -e 's/^.*tarball":"//' \ | sed -e 's/".*$//'` ret=$? if [ "x$url" = "x" ]; then ret=125 # try without the -e arg to sed. url=`(curl -SsL --cacert "$cacert" https://registry.npmjs.org/npm/$t; echo "") \ | sed 's/^.*tarball":"//' \ | sed 's/".*$//'` ret=$? if [ "x$url" = "x" ]; then ret=125 fi fi if [ $ret -ne 0 ]; then echo "Failed to get tarball url for npm/$t" >&2 exit $ret fi echo "fetching: $url" >&2 cd "$TMP" \ && curl -SsL --cacert "$cacert" "$url" \ | $tar -xzf - \ && rm "$cacert" \ && cd "$TMP"/* \ && (req=`"$node" bin/read-package-json.js package.json engines.node` if [ -d node_modules ]; then "$node" node_modules/semver/bin/semver -v "$node_version" -r "$req" ret=$? else "$node" bin/semver.js -v "$node_version" -r "$req" ret=$? fi if [ $ret -ne 0 ]; then echo "You need node $req to run this program." >&2 echo "node --version reports: $node_version" >&2 echo "Please upgrade node before continuing." >&2 exit $ret fi) \ && (ver=`"$node" bin/read-package-json.js package.json version` isnpm10=0 if [ $ret -eq 0 ]; then req=`"$node" bin/read-package-json.js package.json engines.node` if [ -d node_modules ]; then if "$node" node_modules/semver/bin/semver -v "$ver" -r "1" then isnpm10=1 fi else if "$node" bin/semver -v "$ver" -r ">=1.0"; then isnpm10=1 fi fi fi ret=0 if [ $isnpm10 -eq 1 ] && [ -f "scripts/clean-old.sh" ]; then if [ "x$skipclean" = "x" ]; then (exit 0) else clean=no fi if [ "x$clean" = "xno" ] \ || [ "x$clean" = "xn" ]; then echo "Skipping 0.x cruft clean" >&2 ret=0 elif [ "x$clean" = "xy" ] || [ "x$clean" = "xyes" ]; then NODE="$node" /bin/bash "scripts/clean-old.sh" "-y" ret=$? else NODE="$node" /bin/bash "scripts/clean-old.sh" </dev/tty ret=$? fi fi if [ $ret -ne 0 ]; then echo "Aborted 0.x cleanup. Exiting." >&2 exit $ret fi) \ && (if [ "x$configures" = "x" ]; then (exit 0) else echo "./configure "$configures echo "$configures" > npmrc fi) \ && (if [ "$make" = "NOMAKE" ]; then (exit 0) elif "$make" uninstall install; then (exit 0) else make="NOMAKE" fi if [ "$make" = "NOMAKE" ]; then "$node" cli.js rm npm -gf "$node" cli.js install -gf fi) \ && cd "$BACK" \ && rm -rf "$TMP" \ && echo "It worked" ret=$? if [ $ret -ne 0 ]; then echo "It failed" >&2 fi exit $ret

回答by user568109

You are getting the install.sh script, you just have to execute it. Do this

您正在获取 install.sh 脚本,您只需执行它。做这个

curl -O -L https://npmjs.org/install.sh


Update

更新

If you get a 301 Moved Permanently file instead, try adding -L option to follow the redirect like this:

如果您得到的是 301 Moved Permanently 文件,请尝试添加 -L 选项以跟随重定向,如下所示:

curl https://npmjs.org/install.sh | sh

回答by emem

The original command would work if you use the current location (and not the old one) (at least on my system, same settings). Meaning, use:

如果您使用当前位置(而不是旧位置)(至少在我的系统上,相同的设置),原始命令将起作用。意思是,使用:

curl http://npmjs.org/install.sh | sh

instead of:

代替:

$curl https://npmjs.org/install.sh | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    93    0    93    0     0     78      0 --:--:--  0:00:01 --:--:--    79
sh: line 1: syntax error near unexpected token `newline'
sh: line 1: `<html>Moved: <a href="https://www.npmjs.org/install.sh">https://www.npmjs.org/install.sh</a>'

回答by Esa

This is still broken somehow? Trying following:

这仍然以某种方式被打破?尝试以下:

$curl https://www.npmjs.org/install.sh | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
100  6707  100  6707    0     0   6446      0  0:00:01  0:00:01 --:--:--  6442
npm-install-606.sh: line 1: syntax error near unexpected token `newline'
npm-install-606.sh: line 1: `<html>Moved: <a href="https://www.npmjs.org/install.sh">https://www.npmjs.org/install.sh</a>'

and with (https) www.npmjs.org :

和 (https) www.npmjs.org :

$uname -a
Darwin Esan-iMac.local 13.0.0 Darwin Kernel Version 13.0.0: Thu Sep 19 22:22:27 PDT 2013; root:xnu-2422.1.72~6/RELEASE_X86_64 x86_64

$curl --version
curl 7.30.0 (x86_64-apple-darwin13.0) libcurl/7.30.0 SecureTransport zlib/1.2.5

Using OS X Maverics 10.9.1

使用 OS X Maverics 10.9.1

curl -k -O -L https://npmjs.org/install.sh

Should it work with similar env; someone tested??? Am I missing something. Remembering that it is discouraged to run with sudo? Not yet tried separate download and 'sh'-command.

它是否适用于类似的环境;有人测试???我是不是错过了什么。还记得不鼓励使用 sudo 运行吗?尚未尝试单独下载和 'sh' 命令。



Edit: yes, separate download curl -O https://www.npmjs.org/install.shand sh install.shworks fine, after changing owner for /usr/local/lib/node_modules/npmbecause previously installed with sudo. But it has nothing to do with error message, or can it?

编辑:是的,在更改所有者后,单独下载curl -O https://www.npmjs.org/install.sh并且sh install.sh工作正常,/usr/local/lib/node_modules/npm因为之前安装了sudo. 但这与错误消息无关,或者可以吗?

回答by Rituparna sonowal

I have tried many times with various curl options. But the main problem is npm site's https certificate verification. Finally this has worked for me:

我已经尝试了很多次使用各种卷曲选项。但主要问题是npm站点的https证书验证。最后这对我有用:

curl -L http://www.npmjs.org/install.sh | sh

Hope it will help somebody else.

希望它会帮助别人。

回答by Toki Wartooth

Adding -Lhelped me. For example:

添加-L帮助了我。例如:

ln -s /usr/bin/nodejs /usr/bin/node

回答by Pascal Nitcheu

If you have already install nvm, all you have to do is run nvm install version For example if you are willing to install version 8.0.0, then you run ->$ nvm install 8.0.0 then ->$ nvm use 8.0.0 and you can run all your npm commands....

如果你已经安装了 nvm,你只需要运行 nvm install version 例如,如果你愿意安装 8.0.0 版本,那么你运行 ->$ nvm install 8.0.0 然后 ->$ nvm use 8.0.0你可以运行你所有的 npm 命令......

回答by Vyacheslav

In addition to this url: https://stackoverflow.com/a/15508817/1979882In my case, for Debian OS it is important to create a symbol link:

除了这个 url:https: //stackoverflow.com/a/15508817/1979882就我而言,对于 Debian 操作系统,创建一个符号链接很重要:

##代码##

More detailed installation workflow is here.

更详细的安装工作流程在这里