この単純な bash スクリプトがなぜ私のコンピューターを破壊するのでしょうか?

この単純な bash スクリプトがなぜ私のコンピューターを破壊するのでしょうか?

私が持っている一見無害なスクリプトで奇妙なことが起こっています。一連のファイルをシステム内のいくつかの場所にコピーする必要があり、そのための次のスクリプトがあります。

#!/bin/bash

# Get all the files from the file
LINES=$(cat Release-Nodejs/dependencies.txt)

# Copy each file to its location as indicated in the file
for LINE in ${LINES}
do
    LIBRARY=$(basename ${LINE})
    LIBRARY=Release-Nodejs/${LIBRARY}
    LIB_PATH=$(dirname ${LINE})
    echo -e "Copying \e[38;5;10m${LIBRARY}\e[0m to \e[38;5;11m${LIB_PATH}\e[0m"
    cp ${LIBRARY} ${LIB_PATH}
done

dependencies.txtスクリプトは、次の内容のファイルからファイルと場所を取得します。

/usr/lib/x86_64-linux-gnu/libnode.so.72
/lib/x86_64-linux-gnu/libgcc_s.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
/lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libz.so.1
/usr/lib/x86_64-linux-gnu/libbrotlidec.so.1
/usr/lib/x86_64-linux-gnu/libbrotlienc.so.1
/usr/lib/x86_64-linux-gnu/libcares.so.2
/usr/lib/x86_64-linux-gnu/libnghttp2.so.14
/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1
/usr/lib/x86_64-linux-gnu/libssl.so.1.1
/usr/lib/x86_64-linux-gnu/libicui18n.so.67
/usr/lib/x86_64-linux-gnu/libicuuc.so.67
/lib/x86_64-linux-gnu/libdl.so.2
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/lib/x86_64-linux-gnu/libm.so.6
/usr/lib/x86_64-linux-gnu/libbrotlicommon.so.1
/usr/lib/x86_64-linux-gnu/libicudata.so.67

この行をコメントアウトするとcp ${LIBRARY} ${LIB_PATH}次のようになります:

スクリプト出力

ファイル名とパスが正しく取得されていることがわかります。cp ${LIBRARY} ${LIB_PATH}行のコメントを解除してスクリプトを実行すると、sudoスクリプトがシステムを破壊します。(ちなみに、これは VM 上でテストしているので無害です)これを行うと、画面が真っ黒になり、VM ウィンドウを強制的に閉じる必要があります。その後、VM を再度実行しようとすると、次のメッセージが表示されます。

デッドシステム

そして、UBUNTUを完全に再インストールする必要があります。

cp各ファイルに対してコマンドラインで手動で実行しても何も問題は起こらず、ファイルが宛先にコピーされるだけなので、なぜこのようなことが起こるのか疑問に思います。


編集:

コメントの1つとXY問題私が解決しようとしている問題は、 を持つマシンでネイティブ Node.js モジュールを作成しているのですがnode v12.18.1、それが を持つマシンで使用されることになりnode v 10.19.0、ターゲット マシンでノード バージョンを更新したり、依存関係を含む他のパッケージをインストールしたりすることが絶対にできないことです。

実行するとldd mymodule.node次のようになります:

linux-vdso.so.1 (0x00007ffe878c6000)
libnode.so.72 => /usr/lib/x86_64-linux-gnu/libnode.so.72 (0x00007f9bd34fb000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f9bd34e0000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9bd34be000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9bd32d4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9bd5b1e000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f9bd32b7000)
libbrotlidec.so.1 => /usr/lib/x86_64-linux-gnu/libbrotlidec.so.1 (0x00007f9bd32a9000)
libbrotlienc.so.1 => /usr/lib/x86_64-linux-gnu/libbrotlienc.so.1 (0x00007f9bd3215000)
libcares.so.2 => /usr/lib/x86_64-linux-gnu/libcares.so.2 (0x00007f9bd31fe000)
libnghttp2.so.14 => /usr/lib/x86_64-linux-gnu/libnghttp2.so.14 (0x00007f9bd31d2000)
libcrypto.so.1.1 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f9bd2ef5000)
libssl.so.1.1 => /usr/lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f9bd2e61000)
libicui18n.so.67 => /usr/lib/x86_64-linux-gnu/libicui18n.so.67 (0x00007f9bd2b4f000)
libicuuc.so.67 => /usr/lib/x86_64-linux-gnu/libicuuc.so.67 (0x00007f9bd2961000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9bd295b000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f9bd277a000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9bd262b000)
libbrotlicommon.so.1 => /usr/lib/x86_64-linux-gnu/libbrotlicommon.so.1 (0x00007f9bd2608000)
libicudata.so.67 => /usr/lib/x86_64-linux-gnu/libicudata.so.67 (0x00007f9bd0aed000)

そして、それが私がこの質問でやろうとしていることの理由です。つまり、ここでの本当の質問は、.nodeターゲット上で何も更新せずにこれを展開できるように、これらの依存関係をモジュールと一緒に含めるにはどうすればよいですか?

これらすべてをモジュールにリンクし、すべてが含まれ、システム ライブラリに依存しない .node ファイルを 1 つだけ持つことを希望しますが、それは可能ではないと思います。

答え1

もう一度試すこともできますが、ディレクトリ「mkdir -p /usr/local/lib/nodejs」を作成し、LIBPATH を「export LIBPATH=/usr/local/lib/nodejs/」に設定してください。ただし、実行する前に、Linux に nodejs をインストールする方法を読むことを強くお勧めします。たとえば、「https://github.com/nodejs/help/wiki/Installation#how-to-install-nodejs-via-binary-archive-on-linux」を参照してください。これは、「/usr/local/lib/nodejs」にインストールします。ディレクトリを作成した後に必要な唯一の面倒な作業は、バイナリをダウンロードしてディレクトリ「/usr/local/lib/nodejs」に抽出することです。

関連情報