リモートコンピュータ(内蔵Linuxを実行)にSSHサーバーをインストールした後、ホストコンピュータからSSHサーバーに接続しようとしましたが失敗しました。
/etc/passwd
これは、私のターゲット埋め込みLinuxにユーザーアカウントがなく、書き込みできないため、/etc
sshサーバーに接続するときにユーザーアカウントを指定できないためです(ssh接続にはアカウントパスワードが必要です)。したがって、システムにはユーザーアカウントはありません。
ホストシステムからリモートシステムのSSHサーバーに接続する他の方法はありますか? rootユーザーとしてログインしたい。
この質問は、前の質問に対する後続の質問です。「/etc/passwd」なしで組み込みLinuxで自分のアカウントをどのように確認できますか?
答え1
ドロップベアコールgetpwnam
ユーザーアカウントに関する情報を取得するための標準ライブラリ関数。 GNU libc (非組み込み Linux システム用の標準ライブラリ) を備えたシステムでは、この機能は以下からアクセスできます。国家安全保障サービスメカニズム、含む/etc/passwd
。組み込みシステムはさまざまなlibcs(uClibc、Dietlibcなど)を実行でき、/etc/passwd
内部にパスが組み込まれている傾向があります。
/etc/passwd
dropbear(またはlibc)をパッチして再コンパイルせずに、何らかの方法でこのファイルを提供する必要があります。ファイルシステムを変更するのではなく、これらの場所にある他のファイルシステムからファイルを提供するようにカーネルに指示して、読み取り専用ファイルシステムの上に追加のファイルを表示する方法はいくつかあります。一般的なメカニズムは共同設置しかし、組み込みLinuxシステムはしばしば良い共同マウント機能を欠いています。
ファイルシステムの場所を他のコンテンツで上書きする比較的簡単な方法はです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`コマンドを実行した後。
/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