為什麼這個簡單的 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腳本會破壞我的系統(順便說一句,這是無害的,因為我正在虛擬機器上測試它)。執行此操作時,螢幕會變黑,我必須強制關閉虛擬機器視窗。然後,當我嘗試再次運行虛擬機器時,我得到以下資訊:

死亡系統

我必須完全重新安裝 UBUNTU。

我想知道為什麼會發生這種情況,因為我可以在命令列上為每個文件手動執行,cp並且沒有發生任何不好的事情,文件只是複製到目的地。


編輯:

正如評論之一和XY問題,我試圖解決的問題是我正在我的機器上創建一個本機nodejs模組,該模組具有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

您可以再試一次,除了建立目錄“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”中

相關內容