リモートSSHコマンドを実行して常にロードするようにしたいと思います。サービス端末デフォルトの起動ファイル。解決策を探しています。確かに必要:
- ルートとして設定
- 毎回コマンドに定型句を追加します。
- 複数のファイルに環境変数をコピーする
はいいいえローカル環境変数をリモートシェルに転送したいと思います。ssh <host> <command>
一般的な構文を使用してリモートコマンドを実行したいと思います。リモートログインセッションは同じ環境を持ちます。。
背景
簡略化のために、以下は以下を使用すると仮定bash
します。
デフォルトでは、リモートsshコマンドは非対話型の非ログインシェルを起動します。マニュアルページを引用すると、次のようになります。
もし注文する指定すると、ログインシェルではなくリモートホストで実行されます。
以下を実行すると、シェルでこれをより明確に表示できます。
# the lack of 'i' indicates non-interactive
$ ssh localhost 'echo $-'
hBc
$ ssh localhost 'shopt login_shell'
login_shell off
しかし、リモートコマンドで特定の環境変数の設定が必要な場合はどうなりますか?非対話型、非ログインのシェルというのはどちらもありません .bash_profile
.bashrc
購入もできません。
たとえば、次のツールを使用すると問題になります。ペルブルまたは仮想環境リモートコマンドでカスタムインタプリタを使用したいです。
$ which perl
/home/calid/perl5/perlbrew/perls/perl-5.20.1/bin/perl
$ ssh localhost 'which perl'
/usr/bin/perl
上記の要件を満たさないソリューション
リモートコマンドでログインシェルを明示的に呼び出します。
$ ssh localhost 'bash --login -c "which perl"'
毎回追加の定型句が必要です
コマンドの前に構成ファイルを明示的にインポートします。
$ ssh localhost 'source ~/.bash_profile && which perl'
毎回追加の定型句が必要です
環境変数の設定~/.ssh/environment
サーバーでこの機能を有効にするには、ルートが必要です。
サーバー起動ファイルにすでに重複している環境変数が設定されています。
設定ENV
とBASH_ENV
動作しません。.bash_profile
ソース.bashrc
はありません。
設定は~/.ssh/environment
機能しますが、有効にするにはルートアクセスが必要です。
必要な環境変数をコマンドの前に付けます。
毎回追加の定型句が必要です(おそらくたくさん)。
サーバー起動ファイルにすでに重複している環境変数が設定されています。
関連記事
答え1
sshc
定型句コードの前に付くラッパーシェル関数を作成します。source ~/.bash_profile
function sshc {
local host=$1
local cmd=$2
ssh $host "source ~/.bash_profile && $cmd"
}
その後、次のように使用できます。
$ sshc localhost 'which perl'
/home/calid/perl5/perlbrew/perls/perl-5.20.1/bin/perl
答え2
bash
~/.bashrc
少なくともDebianとその派生物では、非対話式で呼び出されたときにも読みますssh
(#define SSH_SOURCE_BASHRC
私の考えではバグ機能ですが、ここでは便利です)。
~/.bashrc
したがって、リモートホストの上部に次を追加できます。
if [ -n "$SSH_CLIENT" ] &&
[ "$SHLVL" = 0 ] &&
[ -n "${-##*[il]*}" ]; then
. /etc/profile
. ~/.bash_profile
fi