SSHログインプロンプト後にファイルを取得する

SSHログインプロンプト後にファイルを取得する

1行の質問:バスチャンホスト経由で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:セキュアホストへのログインに使用した正確なコマンドは、以下のようにBaschenホストを介して行われました。

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

答え1

を使用すると、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

上記は、リモートユーザーのログインシェルがBourneに似ていると想定していますが、他のほとんどの種類のシェル(csh / rc / Fish)に適用できるはずです。

答え2

リモートホストに書き込むことができることを考慮すると、その上にディレクトリを作成し、そこにシェルの設定ファイルと初期化ファイルを入れてから、Zshに設定されたZshを起動し、に設定された/tmpBashを起動できます。/tmp/myhomeZDOTIDR/tmp/myhomeHOME/tmp/myhome

デフォルトでは、Zshはから初期化ファイルを検索し、$ZDOTDIR設定されていない場合はデフォルト値になります。$HOMEZDOTDIR

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

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

Bash:

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

もちろん、構成/初期化ファイルを創造的に活用できます。たとえば、そのファイルを使用してHOMEより適切なパスを設定したり、リモートホストにすでに存在する場合は追加のファイルをインポートしたりすることができます。

このアプローチの最小適用(単一コマンドで圧縮)は次のとおりです。

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

答え3

もしPAMの使用に設定されていますはいリモートホストのsshd_configファイルの設定ファイル/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/source-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セッションと並行して実行されません。

答え4

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

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

関連情報