sshログインがドロップしてプロンプトが表示されたら、ファイルをソースします

Aug 16 2020

ワンライナーの質問:要塞ホスト経由でSSH経由でログインした後、リモートホストでリモートファイルを自動的に取得するにはどうすればよいですか?

エイリアスのリストとシェルユーザー定義関数を含むファイルをリモートホストにSSH接続した後、ソースする必要があります。

このファイルは、リモートマシンの/ tmpフォルダー(例:/ tmp / my-rc)にあります。

私が見つけた他の投稿やインターネットを検索する

ssh -t [email protected] 'source /tmp/my-rc; bash -l'

問題は、ターミナルを取得することですが、新しいbashシェルであるため、エイリアスが設定されていません。

シェルを取り付けた後にソースを実行する必要があると考えて、以下を試しましたが、これも機能しません。エラーはありません。ターミナルを取得しましたが、ファイルがソースされたとは思いません(/ tmp / my-rcファイルからダミーメッセージをエコーし​​て確認しました)

ssh -t [email protected] 'bash -l; source /tmp/my-rc'

'。'で試してみました ソースの代わりに、運がありません。

どんな助けでも。

注1:任意のシェルソリューションで実行できるBashまたはZSH。

注2:実際のsshは、プロキシコマンド、つまり要塞ホストを介したホップを介して行われます(関連性があるかどうかだけを言及します)

注3:プロファイルrcまたはbashrcの特権はなく、リモートホストのホームディレクトリもありません。

注4:セキュアホストにログインするために使用した正確なコマンドは、以下のような要塞ホスト経由です

ssh -o ProxyCommand='ssh -W %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' 10.0.31.122  

回答

4 StéphaneChazelas Sep 01 2020 at 23:09

を使用するとbash、次のことができます。

ssh -t user@host '
  PROMPT_COMMAND="source /tmp/my-rc
                  unset PROMPT_COMMAND
                 " exec bash --norc'

これにより/tmp/my-rc、プロンプトの前にソースが生成され、PROMPT_COMMAND後で設定を解除したため、そのプロンプトのみがソースになります。

実際にそれを定義することになったunset PROMPT_COMMAND場合/tmp/my-rcは、削除する必要があります。

上記は、リモートユーザーのログインシェルがボーンに似ていることを前提としていますが、他のほとんどのタイプのシェル(csh / rc / fish)に適応できるはずです。

2 fra-san Sep 01 2020 at 22:30

リモートホストに書き込む/tmpことができるとすると、その上に/tmp/myhomeディレクトリを作成し、シェルのプロファイルと初期化ファイルをそこにZDOTIDR置いてから/tmp/myhome、Zshをに設定してBashをにHOME設定して起動できます/tmp/myhome

デフォルトでは、その初期設定ファイルのZshの検索$ZDOTDIR、をデフォルト$HOMEあればZDOTDIR設定されていません。

したがって、リモートホストで次のようにZshを起動できます。

ssh -t user@host ZDOTDIR=/tmp/myhome zsh

そしてBashとして:

ssh -t user@host HOME=/tmp/myhome bash

もちろん、プロファイル/初期化ファイルを工夫することもできます。たとえば、それらを使用してHOME、より適切なパスに設定したり、他のファイルを入手したりします(リモートホストのどこかにすでにドットファイルがある場合)。

このアプローチの最小限のアプリケーションは、1つのコマンドに凝縮され、次のようになります。

ssh -t user@host 'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

(リモートホストに再接続していて、ディレクトリがすでに存在することがわかっmkdir -p ...ている場合など、/tmp/myhomeすでに存在する場合にエラーが表示されないようにするために使用します)。

あなたProxyCommandを考慮に入れると、それは次のようになります。

ssh -t -o ProxyCommand='ssh -W \
  %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' \
  10.0.31.122 \
  'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

最後に、あなたの試みについて:対話型シェルが終了した後にのみコマンドが実行されるssh -t [email protected] 'bash -l; source /tmp/my-rc'ため、機能していませんsource

1 jakethefinn Sep 04 2020 at 19:40

リモートホストのsshd_configファイルでUsePAMyesに設定されている場合、構成ファイル/etc/pam.d/sshdを使用すると、認証プロセスの他のイベントの中でも、ログインが成功したときにコマンドの実行を自動化できます。このコード行を追加します

session    required     pam_exec.so /etc/myscripts/./sourcing-script

これらの線の真上

# SELinux needs to intervene at login time to ensure that the process starts
# in the proper default security context.  Only sessions which are intended
# to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so open

ここで、/ etc / myscripts / sourcing-scriptは、ログインに成功したときに実行するコマンドを含むリモートホスト上のファイルです。

#!/bin/bash
source /tmp/my-rc
#echo $(date) >> /etc/myscripts/sourcing-script.log
#cat /tmp/my-rc >> /etc/myscripts/sourcing-script.log

sshセッションを開く前に、このメソッドを使用してサービスを停止し、ログファイルに報告します。ログアウトする前に、サービスを開始するようにcrontabを設定したので、sshセッションと並行して実行されることはありません。

dirkt Aug 16 2020 at 13:40

通常、これは$HOME/.profileまたはバリアントで行います。

sshで始まる環境変数を設定します。SSH_これらを使用してssh、を介してログインしたか、直接ログインしたかを判別できます。