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を起動し、に設定された/tmp
Bashを起動できます。/tmp/myhome
ZDOTIDR
/tmp/myhome
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
より適切なパスを設定したり、リモートホストにすでに存在する場合は追加のファイルをインポートしたりすることができます。
このアプローチの最小適用(単一コマンドで圧縮)は次のとおりです。
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
か直接ログインしたかを確認できます。