対話型モードを維持しながらSSH経由でbashコマンドを実行する

対話型モードを維持しながらSSH経由でbashコマンドを実行する

おそらくこれは私が達成しようとしている奇妙なことですが、
SSHを介してリモートホストに接続し、「alias」などのいくつかのbashコマンドを自動化してインタラクティブモードで使用したいと思います。リモートホストはプライベート環境を許可しません。

可能ですか?そうなると「予想」されますか?それともこれを達成する他の方法はありますか?
デフォルトでは、bashrcがリモートホスト上のファイルを変更しないことを願っています。

ベストアンサー1

つまり、リモコンが欲しいのですが、~/.bashrc別の名前でも持てないのです。 Bashは、初期コマンドをコマンドライン引数として渡したり、環境変数を介して渡したりすることをサポートしておらず、ファイル内になければなりません。しかし、ファイルがファイルシステムにある必要はありません!

bash --rcfile /dev/fd/3 3< <(echo 'alias foo="echo hello"')
$ foo
hello

LC_XXX多くのSSHサーバーはロケール設定を表すためによく使用され、ホスト間で転送する必要があり、セキュリティに影響を与えないため、名前付き環境変数の転送を許可します。許可する場合は、環境変数を介してコンテンツを転送し.bashrcてから、その環境変数をファイル記述子に提供できます。

LC_BASHRC=$(cat ~/.bashrc; exec 3<&-) \
ssh -t remote.example.com \
    'exec bash --rcfile /dev/fd/3 3< <(printf %s "$LC_BASHRC")'
  • ローカルコンテンツは~/.bashrc環境変数を介してサーバーに送信されますLC_BASHRC
  • exec 3<&-ファイルを読んだ後にファイル記述子を閉じるには、追加してください。
  • リモート側では、ログインシェルはexecファイル記述子3の初期化ファイルを読み取るための新しいbashインスタンスに置き換えられます()。
  • 3< <(…)ファイル記述子 3 の出力をコマンドでリダイレクトします。printf親プロセスにパイプされます。

サーバーのログインシェルが/bin/shbash または ksh でない場合は、そのシェルで直接プロセス置換を使用できないため、追加の階層が必要です。

LC_BASHRC=$(cat ~/.bashrc; exec 3<&-) \
ssh -t remote.example.com \
    'exec bash -c '\''exec bash --rcfile /dev/fd/3 \
                           3< <(printf %s "$LC_BASHRC")'\'

/etc/sshd_config /etc/ssh/sshd_config`AcceptEnv directive in its [設定を見つけて、SSHサーバーでどの環境変数が許可されているかを確認できます。](http://www.openbsd.org/cgi-bin/man.cgi?query=sshd_config&sektion=5) (or

3< <(…)コマンド置換を使用する代わりに、この文字列を使用できます。これはパイプではなく一時ファイル($TMPDIRまたは/tmp)を生成するため、一時ファイルの作成を気にしない場合にのみ機能します。

LC_BASHRC=$(cat ~/.bashrc; exec 3<&-) \
ssh -t remote.example.com \
    'exec bash --rcfile /dev/fd/3 3<<<"$LC_BASHRC"'

一時ファイルを生成しても問題ない場合は、次の簡単な方法があります。

  1. ファイルを.bashrc一時リモートファイルにコピーします。一時ファイルが削除されるまで、これは一度だけ実行できます。
  2. 対話型シェルを起動し、--rcfile一時ファイルをポイントします。
remote_bashrc=$(ssh remote.example.com 'bashrc=$(mktemp) && cat >>"$bashrc" && echo "$bashrc"' <~/.bashrc)
ssh -t remote.example.com "exec bash --rcfile '$remote_bashrc'"

SSH実装が古すぎない場合は、次のことができます。デフォルト接続の使用同じホストに対する複数のSSHコマンドの実行を高速化します。

鍵でログインして公開鍵ファイルを制御できる場合は、さらに自動化できます。存在する~/.ssh/authorized_keys、キーには、command=…コマンドラインで指定されたコマンド以外のコマンドを実行できるディレクティブがあります。バラよりリモートrsyncプロセスの環境変数を設定するには?もっと説明したい。

command="if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
           eval \"$SSH_ORIGINAL_COMMAND\";
         else exec bash -c 'bash 3<<<\"$LC_BASHRC\"'; fi" ssh-rsa …

または

command="if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
           eval \"$SSH_ORIGINAL_COMMAND\";
         else exec bash -c 'bash 3<<<\"alias foo=bar; …\"'; fi" ssh-rsa …

(これは一行に書く必要があります。読みやすくするために改行しました。)

おすすめ記事