私たちのチームは何千ものLinux / Unixシステムを担当しているので、rootアカウントは当然管理者間で「共有」されます。私はviモードを好み、他の人はemacsモードを好みます。
他の誰もがviモードを使用することを強制せずにSSH経由でコンピュータにログインしたときにbashのreadlineをviモードに設定するにはどうすればよいですか?
set -o vi
本質的に毎回実際に入力せず、他人にそのように強制せずにログイン後の効果を望んでいます(Emacsモードが私に迷惑なように、viモードもそれらに迷惑です)。
誰もが自分のアカウントとsudoを使用して特権コマンドを実行すると問題にならないことがわかりますが、管理できない状況のために残念ながらこれはオプションではありません。
答え1
私は行きます:
ssh server -t "bash --login -o vi"
しかし、管理者なら、よりきれいな方法を試してみることができます。たとえば、SendEnv
クライアント側でsshオプションを使用して特定の変数を転送し、設定(サーバー側)AcceptEnv
でそれを使用sshd
してそれを受け入れ、それに基づいてルート.bashrc
ファイルを変更して、変数の値に応じて動作を調整できます。 。
これはsshd
、すべてのホストとそのホストを変更することを意味します.bashrc
。しかし、これはまさに「スタンドアロン」アプローチではありません。
答え2
これは愚かなアプローチであり、実際には公開鍵認証にのみ機能します。
まず、ローカルコンピュータにnc
このプログラムがインストールされていることを確認してください。
第二に、まだローカルコンピュータでスクリプトを作成し(これを呼び出す)、知っている場所にconnect-to-server
置いてください*:${PATH}
#!/bin/sh
# connect-to-server
ssh -q server-hostname "touch .yourname" </dev/null >/dev/null 2>&1
nc server-hostname 22
次に、.bashrc
どこかに含まれるようにリモートシステムを変更します。
# partial .bashrc
if [ -f "${HOME}/.yourname" ]; then
rm "${HOME}/.yourname"
set -o vi
fi
最後に、ローカルコンピュータに戻り、編集して以下を~/.ssh/config
追加します。
# partial ssh config
Host serverNickname
Hostname server-hostname
ProxyCommand connect-to-server
このアプローチの欠点(そして私がこれを愚かなものと呼ぶ理由):
- 実際のプロキシコマンドが必要な場合は、より複雑になります。
- 他の人があなたと同時にログインしている場合、
.yourname
ファイルはまだ削除されていない可能性があります。その場合、そのファイルもset -o vi
削除されます。 - 結論はこれで
ssh serverNickname command
実行されcommand
ますが(.bashrc
ソースをインポートしないため).yourname
ファイルはまだ存在するため、SSH構成で擬似プロキシを使用しない2番目のエイリアスを使用することは礼儀です。 。
実は、ただこのアプローチの利点は、ssh
コマンドが追加のパラメータを提供する必要がないことです。
*リモートシステムで何も変更したくない場合は、別の擬似プロキシを使用して一時プロキシを作成できます.bashrc
。
#!/bin/sh
# connect-to-server
ssh -q server-hostname 'ln .bashrc .bashrc.real; cat .bashrc.real <(printf "set -o vi; ln -f .bashrc.real .bashrc\n") >.bashrc.yourname; ln -f .bashrc.yourname .bashrc' </dev/null >/dev/null 2>&1
nc server-hostname 22
ssh
これは他の方法と同じ欠点があるため、疑似プロキシを呼び出さない構成で2番目のエイリアスを使用する必要があります。
答え3
単純なクライアントソリューションの場合:
alias connect='ssh -t root@server "bash -o vi"'
ルートのシェル初期化スクリプトが明示的にを有効またはに設定したset -o emacs
場合、またはルートのファイルがキーバインディングを呼び出すと、この操作は失敗します。EDITOR
emacs
.initrc
emacs
この回答の残りの部分は、サーバー側のソリューションを扱います。
ssh
機械に入ったら、以下を使用してくださいsudo -i
。
あなたのため/root/.bashrc
:
if [[ -n "$SUDO_USER" ]] && [[ -f /root/.bashrc-"$SUDO_USER" ]]; then
source /root/.bashrc-"$SUDO_USER"
fi
bashrc
これにより、.inというプライベートファイルを持つことができます。たとえば、必要な/root/.bashrc-patrick
ものは何でもできますset -o vi
。
これに基づいてrcファイルを選択するやや素朴なアプローチと組み合わせてください$SSH_CLIENT
。
if [[ -n "$SUDO_USER" ]]; then
person="$SUDO_USER"
elif [[ -n "$SSH_CLIENT" ]]; then
case "$SSH_CLIENT" in
192.168.216.100*) person="joe" ;;
192.168.216.120*) person="patrick" ;;
192.168.216.150*) person="lindsey" ;;
esac
fi
if [[ -n "$person" ]] && [[ -f /root/.bashrc-"$person" ]]; then
source /root/.bashrc-"$person"
fi
明らかに、これは常に同じIPアドレスから接続している場合にのみ機能します。
別の方法は、使用している特定のSSHキーの説明フィールドを使用することです。これは、SSH エージェントをサーバーに転送する場合に機能します。
ssh_comment="$( ssh-add -L | grep -f /root/.ssh/authorized_keys | awk '{ print $NF '} | head -n 1 )"
これにより、サーバーへの接続に使用するキーの説明フィールドが選択されます。ファイルhead -n 1
に複数のキーがある場合は、このボタンを使用できますauthorized_keys
。
$ssh_comment
その後、上記の方法(パス名の場合は$SUDO_USER
コメントを削除する必要があるかもしれません)を使用するか、この方法などのステートメントを使用してソースとして必要なrcファイルを直接選択できます。$ssh_comment
case
$SSH_CLIENT