sshログインがドロップしてプロンプトが表示されたら、ファイルをソースします
ワンライナーの質問:要塞ホスト経由で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
回答
を使用すると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)に適応できるはずです。
リモートホストに書き込む/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
。
リモートホストのsshd_configファイルでUsePAMがyesに設定されている場合、構成ファイル/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セッションと並行して実行されることはありません。
通常、これは$HOME/.profile
またはバリアントで行います。
ssh
で始まる環境変数を設定します。SSH_
これらを使用してssh
、を介してログインしたか、直接ログインしたかを判別できます。