SSH-接続ごとに環境変数を設定する-goDaddy共有ホスト


16

私の問題は、サーバー上で環境変数(GIT_EXEC_PATHなど)を設定する必要があることです。すべての接続で変数が必要です(bashおよびリモートコマンドのいずれかで)。.bash_profileを使用してbashでこれらの変数を設定できましたが、リモートコマンドに問題があります。〜/ .ssh / authorized_keysに実際のrsaキーの前にコマンドを書くことができることを発見しましたが、いつもそこに書くことは望んでいません。永続的な解決策が必要です...〜/ .ssh / rcファイルはすべてのsshログインで実行されるため、そこにenv変数宣言を配置しましたが、機能しませんでした。変数はrcファイルで設定されますが、その後消えました。:S rcファイルはサブシェルで実行される可能性があります:S bashおよびコードの重複なしでリモートコマンドでこれらの変数を定義する方法はありますか?

編集:

サーバーはgodaddy共有ホストであるため、質問を編集しました。したがって、サーバーには一意の構成があります。/ etc / ssh / sshd_configおよび/ etc / ssh / ssh_configファイルは空です。これらのファイルにはコメントがあります。興味があれば、ここにコピーできます。

  1. 〜/ .bash_profileは(bash接続のみによって)ソースされます。
  2. 〜/ .bashrcはソースされません。
  3. 〜/ .profileが取得されることはありません。
  4. 〜/ .ssh / environmentは決してソースされません。
  5. 〜/ .ssh / rcは(bashとremoteの両方によって)ソースされますが、変数が消えるためサブシェルで呼び出されると思います。
  6. 〜/ .ssh / authorized_keysは毎回ソースされますが、すべてのrsaキーの前にコマンドを作成する必要があります(したがって、これで構成する必要はありません)。

概要:

(.bash_profileを使用して)bashを適切に構成できますが、リモート呼び出しを構成できません。それが問題です。bashコマンドとリモートコマンドの両方をソースとするファイルを探しています。

例えば:

GIT_EXEC_PATH env変数が設定されているため、git-upload-packコマンドはexeファイルを検出しますが、リモートで「git clone user@domain.com:myrepo local / myrepo」を実行すると、サーバーはそのコマンドを検出しません。設定されていません。

編集2:

よると、この、と私printenvのログ:の〜/ .ssh / rcがそう、それはENV変数が付着していない理由は謎ですが、通常のシェルではなく、サブシェルで実行されています...

実行可能ファイルを作成しました:〜/ logenv

echo "" >> mylog.txt
date >> mylog.txt
printenv >> mylog.txt
echo "" >> mylog.txt

そしてこれを〜/ .ssh / rcに入れます

export AAA=teszt
source ~/logenv

bashログインと「ソースlogenv」により、結果は次のようになりました。

Tue May 15 04:21:37 MST 2012
TERM=cygwin
SHELL=/bin/bash
SSH_CLIENT=censored
SSH_TTY=/dev/pts/2
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:21:41 MST 2012
HOSTNAME=censored
TERM=cygwin
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=censored

リモートの「ssh myuser@domain.com 'exec〜/ logenv'」では、結果は次のようになりました。

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
AAA=teszt
MAIL=/var/mail/myuser
PATH=/usr/local/bin:/bin:/usr/bin
PWD=/home/content/65/7962465
SHLVL=3
HOME=/var/chroot/home/content/65/7962465
LOGNAME=myuser
SSH_CONNECTION=censored
_=/usr/bin/printenv

Tue May 15 04:25:52 MST 2012
SHELL=/bin/bash
SSH_CLIENT=censored
USER=myuser
PATH=/usr/local/bin:/bin:/usr/bin
MAIL=/var/mail/myuser
PWD=/home/content/65/7962465
HOME=/var/chroot/home/content/65/7962465

したがって、rcファイルはソースになりますが、その後変数は消えます...:S


このスレッドではいくつかのオプション- stackoverflow.com/questions/216202/...
EightBitTony

「常にBourneシェル(/ bin / sh)によって処理される/ etc / sshrcとは異なり、rcファイルはアカウントの通常のログインシェルによって処理されます。」-それは奇妙なことです。というのは、通常のシェルから供給されていないようだからです:S
inf3rno

回答:


12

にがありUsePAM yes/etc/ssh/sshd_configこれらの環境変数をすべてのユーザーに設定すると仮定すると、環境変数をpamに設定できます。環境変数が定義されている/etc/gitenv場合、次の行を追加できます。/etc/pam.d/sshd

auth required pam_env.so envfile=/etc/gitenv

または、このファイルを調べて、すでにpam_env.soが使用されており、既にファイルを追加できるファイルがあることがわかります。気をつけてください、そしてsshセッションを終了する前に変更を徹底的にテストしたことを確認してください。pamをいじっているときは、注意しないとサーバーにログインする能力を完全に破ることができます。


godaddy共有ホストアカウントを持っているので、〜ディレクトリのみを変更できます。(centos opシステムがあります。)
inf3rno

とにかくあなたの問題を解決する解決策は別の平均でマークすることができるので、@ inf3rnoそれは良い答えを支持することを害しません:)
ホイヘンス

OK。投票することができるのは私だけではありません... :
inf3rno

Ubuntuでは、そのようだ/etc/environmentによって供給されpam_env.so、デフォルトで
rcoup

4

を使用してSSH接続の環境変数を設定しています~/.ssh/environment。ファイルには、フォームVAR=valueに変数を含めることができます。明示的にエクスポートする必要はありません。

ただし、このユーザー構成ファイルは、PermitUserEnvironmentオプションがyesに設定されていない限り、SSHサーバープロセスによってデフォルトで無視されます。したがって、SSHサーバー上の/ etc / sshd_configを編集して、このパラメーターを追加または更新する必要があります。

PermitUserEnvironment yes

SSHサーバー構成を再ロードする必要があります。RHELまたはSuse Linuxの場合(rootとして)

/sbin/service sshd reload

(動作しない場合は、おそらくsshdをsshに置き換えてください)

Ubuntu(upstartを使用)で

sudo reload ssh

他のLinuxでは、(ルートとして)試すことができます

/etc/init.d/sshd reload

(sshdをsshまたはopenssh、またはSSHサーバーのinitスクリプトに対応するものに置き換えます)


ありがとう、しかし/ etcディレクトリに書き込むことはできません。〜/ .ssh / environmentはソースされていません。
inf3rno

2

GoDaddyの共有ホストがなくなったため、提案されたソリューションが有効かどうかを確認できません。これは、私が質問をしたときに働いたため、受け入れられた答えのままです。他の答えもうまくいくかもしれません。私はコミュニティに賛成票でそれを決定させました。

OK。解決策は、godaddy共有ホストには解決策がないことです。私はすべてを試しましたが、何も機能しないので、私は〜/ .ssh / authorized_keysにとどまることにしました:

command="~/connect.sh" ssh-rsa AAAAB3NzaC...

〜/ connect.shで:

#!/bin/bash
if [ -f "${HOME}/.env_profile" ]; then
        source ~/.env_profile
fi;

if [ "x${SSH_ORIGINAL_COMMAND}x" == "xx" ]; then
        $SHELL --login
else
        eval "${SSH_ORIGINAL_COMMAND}"
fi;

そして〜/ .env_profileで:

export PATH=$PATH:$HOME/bin:$HOME/git/libexec/git-core
export LD_LIBRARY_PATH=$HOME/git/lib
export GIT_EXEC_PATH=~/git/libexec/git-core
export GIT_TEMPLATE_DIR=~/git/share/git-core/templates

したがって、command = "..."をauthorized_keysのすべてのrsaキーにコピーする必要があります。これはコードの重複ですが、godaddy共有ホストには別の解決策はないと思います。


1

bashシェルとして使用している場合は、環境設定をに追加してみてください.bashrc

最初にこれがログイン時に実行されることを確認してください。標準ファイルには次のようなものが含まれていることが多いためです。

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

それらの開始時に。非対話型ログインに対しても変更を加える場合は、そのようなステートメントの上に移動する必要があります。

.profileは、このような構成を置くより一般的な場所であり、ほとんどのシェルで尊重されています(デフォルトのDebianセットアップでは、最初に~/.profile呼び出すことです~/.bashrc)。.profile他のシェルによって解釈された場合には、より慎重に編集する必要がある場合がありbashます。つまり、特定の拡張機能を使用しないようにしてください。

編集

:bash .bash_profileではなく.profile、より一般的なファイルを優先して使用する編集がある場合は、bash固有の項目を安全に使用できます。


「編集」セクションを読んでください。(.profileが機能していません)
-inf3rno

1

この行をsshd_configファイルに追加することにより、authorized_keysにコマンド部分を追加せずに、すべてのユーザー/キーに対してコマンドを使用できます。

ForceCommand ~/connect.sh

この場合、スクリプトに絶対パスを使用することをお勧めします


0

私はあなたに別のアプローチを提案しています。

環境変数の宣言を使用してファイルを設定し、リモートコマンドを呼び出すたびにファイルを取得します。

例:必要な変数を〜/ .my_var.rcに入れてから、リモートコマンドごとに ssh user@remote bash -c "source ~/.my_var.rc; <your command>"

これが自分に合っている場合は、この概念を改良して、便利なスクリプトを作成できます。gitコマンドにのみ必要な場合は、これを行うgit.shスクリプトを作成します。

#!/bin/bash

source ~/.my_var.rc

git $@

このスクリプトがホームディレクトリにあると仮定すると、次のように呼び出します。 ssh user@remote git.sh pull origin master

注:これは簡単な出発点です。たとえば、スペースを含むパラメータはサポートしていません。


私はそのofcを行うことができますが、その構成は私だけのためではなく、コマンドが自動的に生成されるgit guiで動作するはずです
...-inf3rno

同じユーザーを使用してsshリモートに接続しますか?「はい」の場合、ファイル〜/ .my_var.rcはユーザー固有であり、git.shはすべてに共通です。いいえの場合は、ソースに追加する.rcファイルを区別するのに役立つ追加のパラメーターをgit.shに追加できます(または、固定IPを使用して、SSH_CLIENT環境情報を使用してユーザーを区別できます)。コマンドはgitのGUI、コールで動作するはずですssh -Y user@remote git.sh gui
ホイヘンス

すべてのユーザーに同じenv設定が必要です。私はコマンドに余分な部分を追加しません、それはばかげています
...-inf3rno

それでは、すべてのユーザーの設定が同じであれば、答えは完成しているので、以前のコメントは無視できます。おそらく、すべてのユーザーに共通/アクセス可能なディレクトリに.rcファイルと.shファイルを配置する必要があります。
ホイヘンス

@ inf3rnoより多くの回答が必要な場合は、元の質問に情報が欠けていたためにあなたのケースに当てはまらなくても、良い回答を提案した人にすでに感謝するべきです。または、人々はしようと気にしません。
ホイヘンス

0

これはPATHSに関する一般的な質問には答えませんが、パスにgitがなく、ルートアクセス権がないリモートサーバーでgitリポジトリを使用できます。このソリューションは、このページから来ています

git clone -u relative/path/to/bin/git-upload-pack username@host.com:relative/path/to/remote_repository.git

また、プッシュおよびフェッチするには:

git config remote.origin.receivepack relative/path/to/bin/git-receive-pack
git config remote.origin.uploadpack relative/path/to/bin/git-upload-pack

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.