web-dev-qa-db-ja.com

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

私の問題は、サーバーで環境変数(GIT_EXEC_PATHなど)を設定する必要があることです。接続ごとに(bashとリモートコマンドのいずれかで)その変数が必要です。 .bash_profileを使用してbashでこれらの変数を設定できましたが、リモートコマンドに問題があります。実際のrsaキーの前に〜/ .ssh/authorized_keysにコマンドを書き込むことが可能であることがわかりましたが、常にそこに書き込む必要はありません。永続的な解決策が必要です...〜/ .ssh/rcファイルはすべてのsshログインによって実行されるため、そこに環境変数宣言を配置しましたが、機能しませんでした。変数は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環境変数が設定されているため、git-upload-packコマンドはexeファイルを検出しますが、remote: "git clone [email protected]:myrepo local/myrepo"の場合、GIT_EXEC_PATHが原因でサーバーはそのコマンドを検出できません。設定されていません。

Edit2:

this と私のprintenvログによると:〜/ .ssh/rcはサブシェルではなく通常のシェルで実行されているため、環境変数が固定されないのはなぞなぞです...

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

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

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

export AAA=teszt
source ~/logenv

Bashログイン& "source 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 [email protected] '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

16
inf3rno

godaddy共有ホストがなくなったため、提案されたソリューションが有効かどうかを確認できません。これは、質問したときに私が機能していたため、受け入れられた回答のままです。他の回答も同様に機能する可能性があります。私はコミュニティに賛成投票で決定させます。

OK。解決策は、godaddy共有ホストには解決策がないことです。私はすべてを試しましたが、何もうまくいきませんでした。

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

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

2
inf3rno

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をいじっているときに、注意しないと、サーバーへのログイン機能が完全に破壊される可能性があります。

12
stew

~/.ssh/environmentを使用して、SSH接続用にいくつかの環境変数を設定しています。ファイルには、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では、(rootとして)試すことができます

/etc/init.d/sshd reload

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

4
Huygens

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

ForceCommand ~/connect.sh

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

1
GARCIN David

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

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

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

それらの最初に。非対話型ログインであっても加えたい変更はすべて、このようなステートメントよりも上にする必要があります。

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

編集

.bash_profileがある場合は、.profileの代わりに編集してください。bashは、より一般的なファイルを優先してそれを使用します。そこで、bash固有のものを安全に使用できます。

1
David Spillett

別のアプローチを提案します。

環境変数の宣言を含むファイルを設定し、リモートコマンドを呼び出すたびにそのファイルをソースします。

例:必要な変数を〜/ .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

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

0
Huygens

/ etc/profileは、ssh-clientとの各接続で提供されます。

0
Jason416

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

git clone -u relative/path/to/bin/git-upload-pack [email protected]: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
0
Ben