システムにログインするときにbash readlineをviモードに自動的に設定するには?

システムにログインするときにbash readlineをviモードに自動的に設定するには?

私たちのチームは何千もの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場合、またはルートのファイルがキーバインディングを呼び出すと、この操作は失敗します。EDITORemacs.initrcemacs

この回答の残りの部分は、サーバー側のソリューションを扱います。


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_commentcase$SSH_CLIENT

答え4

このガイドに従ってカスタム rc ファイルを作成できます。

ユーザーrcファイル|セキュリティシェル:最終ガイド

または、Authorized_keysファイルにコマンドラインアクションを挿入します。

リモートコマンドの実行を自動化するSSH設定| Unix および Linux Stack Exchange

関連情報