如何在沒有 /etc/passwd 的情況下連接到在嵌入式 linux 上執行的 ssh-server?
在我的遠端機器(執行嵌入式 Linux)上安裝 ssh 伺服器後,我嘗試從主機連接到 ssh 伺服器,但失敗了。
這是因為我在連接 ssh-server 時無法指定使用者帳戶(ssh 連接需要輸入帳戶密碼),因為我的目標嵌入式 Linux 沒有
/etc/passwd
並且/etc
不可寫。因此,該系統上沒有使用者帳戶。我們是否有其他方法可以從主機連接到遠端機器上的 ssh-server?我想以 root 使用者身份登錄。
這個問題是我之前的問題How to check my account on embedded linux without “/etc/passwd”的後續問題?
Dropbear 呼叫
getpwnam
標準庫函式來獲取有關使用者帳戶的資訊。在帶有 GNU libc(非嵌入式 Linux 系統的標準庫)的系統上,該函式可以通過NSS 機制查詢多種類型的數據庫,包括/etc/passwd
. 嵌入式系統可能會執行各種 libc(uClibc、dietlibc,…),並且它們往往具有內置的路徑/etc/passwd
。如果沒有修補和重新編譯 dropbear(或您的 libc),您將不得不以
/etc/passwd
某種方式提供該文件。有一些方法可以讓額外的文件出現在只讀文件系統之上,而不是通過修改文件系統,而是通過指示核心在這些位置提供來自不同文件系統的文件。通用機制是union mount,但嵌入式 Linux 系統通常缺乏良好的 union mount 功能。使用不同內容覆蓋文件系統位置的一種相對簡單的方法是
mount --bind
. 執行命令mount --bind /else/where
/some/where, any access to a file
/some/where/somefileactually accesses the file
/else/where/somefile; any file in the “true”
/else/whereis hidden. However, you cannot directly make a file appear this way: both
/else/whereand
/some/wherehave to exist (although they don't have to be directories). So you can't make
/etc/passwdcome into existence, but you can override
/etc` 後。
- 創建一個目錄,其中將包含您的
/etc
. 假設它是/custom/etc
.mkdir /custom/etc
- 創建一個掛載點,您將在其中重新定位原始
/etc/
.mkdir /custom/original-etc
- 在替換
etc
原始文件中創建符號連結。cd /etc for x in *; do ln -s "../original-etc/$x" "/custom/etc/$x"; done
passwd
在替換etc
層次結構中創建一個文件。echo "root:x:0:0:root:/:/bin/sh" >/custom/etc/passwd
在啟動時,首先執行綁定掛載以在 處創建原始
/etc
層次結構的視圖,然後執行綁定掛載以在處/custom/original-etc
創建替換視圖。將這些命令放在啟動期間執行的腳本中(與啟動 dropbear 伺服器的腳本相同,顯然是在啟動 dropbear 之前)。/etc``/etc
mount --bind /etc /custom/original-etc mount --bind /custom/etc /etc