背景

背景

リモート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

サーバーでこの機能を有効にするには、ルートが必要です。

サーバー起動ファイルにすでに重複している環境変数が設定されています。

設定ENVBASH_ENV

動作しません。.bash_profileソース.bashrcはありません。

設定は~/.ssh/environment機能しますが、有効にするにはルートアクセスが必要です。

必要な環境変数をコマンドの前に付けます。

毎回追加の定型句が必要です(おそらくたくさん)。

サーバー起動ファイルにすでに重複している環境変数が設定されています。

関連記事

https://stackoverflow.com/questions/415403/whats-the-difference-Between-bashrc-bash-profile-and-environment

https://stackoverflow.com/questions/216202/why-does-an-ssh-remote-command-get-fewer-environment-variables-then-when-run-man#216204

SSH経由でコマンドを実行すると、ドットファイルはインポートされません。

答え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

関連情報