PS1プロンプトをsshでプッシュする


19

好きな特定の「PS1」プロンプトを使用します。いくつかのログインを、いくつかの異なるサーバー上の他のユーザーと共有します。ローカルbashプロファイルでリモートプロンプトを指定する方法、またはリモートで接続するたびにコピーアンドペーストする他の方法があるかどうか疑問に思っていました。

回答:


17

たとえば~/.my_custom_bashrc、各リモートマシンにカスタムbash構成でファイルをアップロードし(この場合PS1=...)、次のコマンドsshで起動します:

ssh user@host -t "bash --rcfile ~/.my_custom_bashrc -i"

bash関数を読みやすくするためのラッパーとして簡単に使用できます。


10

PS1変数を送信したいだけで、'(単一引用符)が含まれていない場合は、次を試してください:

ssh targethost -t "PS1='$PS1'; exec bash"

ただし、ローカル.bashrcは上書きする可能性がありますPS1(これを指摘してくれたDennis Williamsonに感謝します)。

sshを介して環境変数を送信する方法がありますが、通常はサーバー構成で無効になっています。場合PermitUserEnvironmentディレクティブがで有効になっているサーバーの構成および各ユーザーが(ええ、あなたはとても幸運ではないかもしれません)、自分の鍵ペアを持っている、あなたは追加することができenvironment="PS1=…"、ラインに~/.ssh/authorized_keysあなたの鍵に対応します。

共有ユーザーアカウントで独自の構成を保持する場合は、独自の構成ファイルディレクトリを作成し、HOMEそのディレクトリを指すように環境変数を設定できます。

ssh targethost mkdir mrstatic.home
scp .bashrc targethost:mrstatic.home/

mrstatic.home他のユーザーとファイルを共有する場合は、親ディレクトリの対応するエントリを指すシンボリックリンクをディレクトリに作成します。

次に、でログインします

ssh targethost -t 'HOME=~/mrstatic.home; exec bash'`

リモート.profile(または他の初期化ファイル)を変更する場合は、おそらく設定を自動化できます。多くのサイトでは、LC_*環境変数を使用できます(通常はロケール設定に使用されます)。これらの両方の条件が満たされている場合、たとえばLC_USERクライアント側で実際にロケールに使用されていない変数を設定し、サーバーでテストできます.profile

(もちろん、共有アカウントは悪い考えですが、あなたはその状況を変える立場にないかもしれません。)


3
ssh -t user@host "remote='$PS1' bash -i"

次に、プロンプトで:

PS1=$remote

1
洗練されたbashプロンプトは、引用されていない場合に壊れる可能性があります(あなたから来て、私は驚いています)。そして、なぜ余分なコマンドで"PS1='$PS1' bash -i"はなくexec、なぜですか(そして、なぜそうではないのですか)?
ジル「SO-悪であるのをやめる」

1
@Gilles:引用の欠落:ずさんな。追加コマンド:PS1シェルの起動中に上書きされることは珍しくありません。役員なし:私のシステムでのテスト中、それは何の違いももたらさないようでした-追加のプロセスはありません。
追って通知があるまで一時停止します。

1
ああ、はい、それは良い点です、ローカル.bashrcが上書きする可能性が高いPS1です。
ジル 'SO-悪であるのをやめる'

2

PS1プロンプトを〜/ .ssh / environmentに入れると、sshセッションはログインするすべてのホストにそれを伝えます。openssh 4.3p2で動作します。


1
これは、サーバーの構成が有効PermitUserEnvironmentになっている場合にのみ機能します。デフォルトではオフになっています。
フリム

1

クライアント側で環境変数を指定できます。ssh-serverで許可されている場合(man sshd-configを確認)、マシンにログインするときにこれらの変数がセッションにコピーされます。

そのため、既存のPS1(または任意の変数)をチェックし、PS1がまだ設定されていない場合にのみ設定するように、サーバーで.bashrcを構成する必要があります。

または、簡単にするために、設定を関数にバンドルし、その関数をオンデマンドのソースとして特殊ファイルとしてデプロイする(source joes_bashrc)か、直接.bashrcにデプロイします。独自のファイルを持つ方がもう少し堅牢に思えます。他の人々はあなたの設定を使用するかもしれませんが、そうすることを強制されません。


1

ログインを共有しないでください。自分のようにSSHを実行しますsudo -su shareduser-s「シェル」を意味します)。

sudoホームディレクトリを保持します。

Defaults env_keep += "HOME"

昇進したら、私はそのポリシーを実行しようとしますが、今のところこれに固執しています。
Unfundednut

1

追加のscpを必要とせずにやりたい場合は、次のようなことができます。

ssh -t srvname ' cp ~/.bashrc ~/.bashrc.n &>/dev/null ; echo "LS_COLORS=\"no=00:fi=00:ETC:ETC:ETC\";" >> ~/.bashrc.n ; echo "export LS_COLORS" >> ~/.bashrc.n ; echo "alias ls=\"ls --color=auto\";" >> ~/.bashrc.n ; exec bash --rcfile ~/.bashrc.n'

これにより、サーバーbashrcに基づいているが、オーバーライドを含む.bashrc.nが生成されます。


これは、一部の人々が端末を恐れている理由です。

0

あなたがあなたの同僚にいつの間にか侵入し喜んでいる、そして、あなたの好みに干渉しないようにそれらを信頼することができた場合は、その後、私はの組み合わせ示唆サイラスの答えアキラの答えデニスウィリアムソンの答えを

  1. 各サーバーで、編集~/.bashrcして追加します
    if ["$ Unf" = 1]#Unfundednutの特別なコード
    それから
        PS1 = " (希望するプロンプト) "
         (必要なその他のカスタマイズ) 
    fi
    最後に。あなたの同僚は「基本プロファイルに上書きすることを感謝しません」が、彼らはそれを探しに行かない限り、これに気付かないでしょう。
  2. リモートサーバーにログインするとき、
    ssh -t user @ host "Unf = 1 bash -i"
    ローカルアカウントのエイリアスまたはシェル関数に入れたいと思うかもしれませんが、それは十分に短く、他のどの回答よりも短いので、簡単に手動で入力できます。

これはかなり明確だと思いますが、sshコマンドをUnf実行すると、リモートサーバーにログインすると変数が設定されます。これにより、リモート.bashrcでコードが呼び出され、カスタマイズが有効になります。コードをの最後に配置するため.bashrc、ファイルの前の一般的な設定が上書きされます。

開示:これはテストしていません。


-1

最も簡単な方法は私見です:

ssh user@server 'PROMPT_COMMAND=export PS1="changeme $" bash -li;'

それが機能するかどうかはわかりません。引用符のレイヤーが欠落しているようです。たとえそれが行われたとしても、設定PROMPT_COMMAND(シェルがプロンプトを出すたびに実行される)は、この問題を解決する非常に手間のかかる方法のようです。そして、それはやや不可解であるため、実際にそれを示唆する回答には、それがどのように機能するかの説明が必要です。
スコット

-2

sshfs / nfsを介してホームをマウントするようなこともできますが、最も簡単な解決策は、bashrcを新しいマシンにscpすることです。これはエイリアスやものももたらします。


私の質問で述べたように、私はこれらのログインを他の人と共有します。私は彼らが基本プロフィールを書いていることに感謝しないだろうと確信しています。
Unfundednut

1
NFSで$ HOMEをマウントするのは正気ではありません。言ってるだけ'。
ウェスリーライス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.