私の問題の名前を正確に指定する方法がわかりません。
私のニーズに合ったTUIプログラムセットを含むサーバーがあるというシナリオです。
ネットワーク上の他のユーザーがraspiや恐竜コンピュータなどの小さなものを開くことを望み、起動すると、ユーザーは通常はローカルログインのgettyを見ることができませんが、代わりにサーバーにsshを表示します。サーバーが応答しない場合にのみ、ローカルログイン情報がユーザーに提供されます。
この種のシナリオは、新しくもラジカルではないようです...私の考えでは、基本的にSSHを介してtcp / ipに接続されたシンクライアントの概念です。
答え1
実際に可能です。私は1998年頃に大学で同様のことをしました。
デフォルトでは、標準プログラムではなくカスタムgetty
バージョンのプログラムを呼び出すようにRasPiのプロセスを設定する必要があります。login
/bin/login
login
特にセキュリティを必要としない場合、またはプロトタイプのみを作成する場合、カスタム代替エントリはスクリプトです。しかし、深刻な実装のためには安全のためにコンパイルされたプログラムでなければならないと思います。スクリプトインタプリタを削除すると、実行するコードの量が最小限に抑えられ、競合状態やその他の攻撃を設定するのが難しくなります。
ただし、あなたのデザインにはユーザーエクスペリエンスの問題があるかもしれません。ユーザーがすでにログイン名を入力している場合は、パスワードのプロンプトが表示されるとすぐに、ほとんど何もしなくても、ほとんど反射動作でパスワードを直接入力できます。 SSH接続の試行が失敗し、同じログインが自動的にローカルログイン試行に再利用される場合、ユーザーは自分がサーバーに接続されていると考えてローカルログインを使用していることを発見した場合、混乱する可能性があります。
getty
好ましくは、ローカルログイン用に変更されていない構成を使用して2番目の仮想コンソールに切り替えるなど、より慎重なアクションが必要です。ログインプロンプトの前に表示する/etc/issue
ために必要なキーストロークの手順を追加できます。getty
副作用として、カスタムlogin
スクリプトまたはバイナリは基本的に次のように大幅に簡略化できます。
#!/bin/sh
REMOTEUSER="$1"
exec ssh -oEscapeChar=none "$REMOTEUSER"@your.server.example
この-oEscapeChar=none
オプションはOpenSSHを使用してキーストロークがエスケープされるのを防ぎ、ユーザーはSSHクライアントを使用してポートフォワーディングを設定したり他の空腹を実行したりすることはできません。
(またはその代替項目の1つでも)rootとして実行されるため、このコマンドを実行する前に、rootではなく一部のユーザーに切り替えることをお勧めしますlogin
。ここでは、コンパイルされたプログラムがより柔軟になります。exec()
ssh
いくつかのプログラミング経験がある場合は、/bin/login
選択したLinuxディストリビューション用のソースコードパッケージをダウンロードしてハックできることを確認することをお勧めします。
getty
基本的には2つの変更が必要です。指定されたユーザー名をパラメーターとして使用してログインするユーザー名を選択する代わりに、交換ユーザーが発信SSH接続用に予約されているハードコーディングされたユーザー名を使用できるようにすることもできます。login
。exec()
ログインプロセスの終わりにユーザーのシェルを使用する代わりに、SSHコマンドを使用してパラメータとしてexec()
取得したユーザー名とサーバー名をgetty
指定します。
答え2
私は次のようなものを使用することに傾いています/etc/profile
(ユーザーのシェルがbash、ksh、または同様のものであると仮定します/etc/profile
)。
if [[ $(ps h -o cmd $(ps h -o ppid $$)) =~ $(basename "$SHELL") ]] \
|| id | grep -q '(sshgroup)' \
&& fping -q remotehost; then
set -e # exit on any error, incl. user pressing ^C during
# ssh-keygen or ssh-copy-id
# generate a key if it doesn't already exist
if [ ! -e ~/.ssh/id_rsa ] then
ssh-keygen
fi
# install it on remote host if ~/.ssh/key-installed doesn't exist
if [ ! -e ~/.ssh/key-installed ] ; then
ssh-copy-id -i ~/.ssh/id_rsa.pub remotehost
touch ~/.ssh/key-installed
fi
# rewrite the following if any users have a shell which doesn't
# support arrays (ash, dash, posix sh, etc)
ssh_args=(-oEscapeChar=none)
exec ssh "${ssh_args[@]}" remotehost
fi
中国語:親プロセスがユーザーのシェルではない場合そしてこのユーザーは次の組織のメンバーです。sshgroup
そしてリモートホストはpingに応答し、pingはリモートホストのsshに応答します(そして-edなので、ssh
sshexec
セッションが終了するとすぐにユーザーはログアウトします)。それ以外の場合は、通常どおりログインが行われます。グループメンバーシップは以前にテストされたため、fping
非会員は「fping」結果を待つ必要はありません。
ローカルホストとリモートホストのファイルにある適切なメッセージを/etc/motd
使用して、ファイルが最終的にどのコンピュータに存在するかを強調することができます。
ユーザーがリモートホストにSSHキーを持っていない場合~/.ssh/authorized_keys
でも、パスワードを要求します。スクリプトの断片ssh-keygen
とコンテンツは、ssh-copy-id
これを防ぐ方法の最小限の例です。また、ログインするたびにではなく、1日に1回だけキーのパスワードを入力するだけでssh-agent
実行する必要があるかもしれません。-t 86400
このようにグループメンバーシップを確認すると、特定のユーザー(たとえば、rootまたはroot以外の管理者アカウント)が自動的にリモートホストにSSHされることを簡単に除外できます。テストを元に戻し、自動的にすべてのユーザーにSSH経由で接続できます。いいえ特定のグループのメンバーです。