Ssh

如何在沒有 /etc/passwd 的情況下連接到在嵌入式 linux 上執行的 ssh-server?

  • July 31, 2014

在我的遠端機器(執行嵌入式 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/somefile actually accesses the file/else/where/somefile ; any file in the “true”/else/where is hidden. However, you cannot directly make a file appear this way: both/else/where and/some/where have to exist (although they don't have to be directories). So you can't make/etc/passwd come into existence, but you can override/etc` 後。

  1. 創建一個目錄,其中將包含您的/etc. 假設它是/custom/etc.
mkdir /custom/etc
  1. 創建一個掛載點,您將在其中重新定位原始/etc/.
mkdir /custom/original-etc
  1. 在替換etc原始文件中創建符號連結。
cd /etc
for x in *; do ln -s "../original-etc/$x" "/custom/etc/$x"; done
  1. 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

引用自:https://unix.stackexchange.com/questions/147366