SSH - setze env vairables von jeder Verbindung - Godaddy Shared Host

16

Mein Problem ist, dass ich env-Variablen (wie GIT_EXEC_PATH) auf einem Server setzen muss. Ich brauche diese Variablen für jede Verbindung (also auch für Bash und Remote-Befehle). Ich habe es geschafft, diese Variablen durch Bash mit .bash_profile festzulegen, aber ich habe Probleme mit den Remote-Befehlen. Ich habe festgestellt, dass es möglich ist, Befehle in ~ / .ssh / authorized_keys vor dem eigentlichen rsa-Schlüssel zu schreiben, aber ich möchte nicht immer dort schreiben, ich brauche eine dauerhafte Lösung ... Ich habe festgestellt, dass ~ / .ssh Die / rc-Datei wird bei jedem ssh-Login ausgeführt, daher habe ich dort meine env-Variablendeklarationen abgelegt, aber es hat nicht funktioniert. Die Variablen werden in der RC-Datei festgelegt, aber danach sind sie verschwunden. : S Möglicherweise wird die RC-Datei in einer Subshell ausgeführt: S Gibt es eine Möglichkeit, diese Variablen in Bash und in Remote-Befehlen ohne Codeduplizierung zu definieren?

Bearbeiten:

Ich habe die Frage bearbeitet, da der Server ein von Godaddy gemeinsam genutzter Host ist und daher eine eindeutige Konfiguration hat. Die Dateien / etc / ssh / sshd_config und / etc / ssh / ssh_config sind leer. Es gibt Kommentare in diesen Dateien, wenn Sie neugierig sind, kann ich es hier kopieren.

  1. Das ~ / .bash_profile wird bezogen (nur über Bash-Verbindungen).
  2. das ~ / .bashrc wird nie bezogen,
  3. das ~ / .profil wird nie bezogen,
  4. Die ~ / .ssh / -Umgebung wird niemals bezogen.
  5. Das ~ / .ssh / rc wird bezogen (sowohl von Bash als auch von Remote), aber ich denke, es wird in Subshell aufgerufen, da die Variablen verschwinden.
  6. Die ~ / .ssh / autorisierten_Tasten werden jedes Mal von bezogen, aber ich muss die Befehle vor jedem rsa-Schlüssel schreiben (damit ich nicht damit konfigurieren möchte).

Zusammenfassung:

Ich kann die Bash gut konfigurieren (mit .bash_profile), aber ich kann die Remote-Aufrufe nicht konfigurieren. Das ist das Problem. Ich suche nach einer Datei, die sowohl von Bash- als auch von Remote-Befehlen stammt.

Beispielsweise:

Der Befehl git-upload-pack findet die exe-Datei, da die env-Variable GIT_EXEC_PATH festgelegt ist, aber mit remote: "git clone [email protected]: myrepo local / myrepo" findet der Server diesen Befehl nicht, da GIT_EXEC_PATH ist nicht eingestellt.

Edit2:

Nach diesem , und meinen printenv Protokollen: der ~ / .ssh / rc in der normal Shell ausgeführt wird , nicht in Subshell, so ist es ein Rätsel ist , warum die env Variablen nicht kleben ...

Ich habe eine ausführbare Datei erstellt: ~ / logenv :

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

Und füge dies in das ~ / .ssh / rc ein :

export AAA=teszt
source ~/logenv

Durch Bash Login & "Source Logenv" war das Ergebnis:

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

Per Remote "ssh [email protected] 'exec ~ / logenv'" war das Ergebnis:

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

Die RC-Datei wird also bezogen, aber danach verschwinden die Variablen ...: S.

inf3rno
quelle
Einige Optionen in diesem Thread - stackoverflow.com/questions/216202/…
EightBitTony
"Im Gegensatz zu / etc / sshrc, das immer von der Bourne-Shell (/ bin / sh) verarbeitet wird, wird Ihre RC-Datei von der normalen Login-Shell Ihres Kontos verarbeitet." - Das ist seltsam, weil es so aussieht, als würde es nicht von einer normalen Shell bezogen: S
inf3rno

Antworten:

12

Angenommen, Sie haben UsePAM yesin /etc/ssh/sshd_configund möchten, dass diese Umgebungsvariablen für jeden Benutzer festgelegt werden, können Sie pam Umgebungsvariablen für Sie festlegen. Wenn Sie die Umgebungsvariablen definiert haben, können /etc/gitenvSie diese Zeile hinzufügen/etc/pam.d/sshd

auth required pam_env.so envfile=/etc/gitenv

Wenn Sie diese Datei überprüfen, stellen Sie möglicherweise fest, dass bereits eine Datei pam_env.so verwendet wird und bereits eine Datei, zu der Sie Inhalte hinzufügen können. Seien Sie vorsichtig und stellen Sie sicher, dass Sie Ihre Änderungen gründlich getestet haben, bevor Sie Ihre SSH-Sitzung beenden. Wenn Sie mit Pam herumspielen, können Sie Ihre Anmeldefähigkeit bei Ihrem Server vollständig beeinträchtigen, wenn Sie nicht vorsichtig sind.

Eintopf
quelle
Ich habe ein von Godaddy freigegebenes Host-Konto, daher kann ich nur das Verzeichnis ~ ändern. (Es hat Centos Op-System.)
Inf3rno
@ inf3rno es schadet nicht, eine gute Antwort zu bewerten :) da die Lösung, die Ihr Problem löst, ohnehin durch einen anderen Mittelwert gekennzeichnet sein kann.
Huygens
In Ordnung. Ich werde, aber ich bin nicht der einzige, der abstimmen kann ... :-)
inf3rno
Unter Ubuntu scheint , dass /etc/environmentvon sourced ist pam_env.sostandardmäßig
rcoup
4

Ich setze eine Umgebungsvariable für meine SSH-Verbindungen mithilfe von ~/.ssh/environment. Die Datei kann Variablen im Formular enthalten VAR=value, ohne dass diese explizit exportiert werden müssen.

Diese Benutzerkonfigurationsdatei wird jedoch vom SSH-Serverprozess standardmäßig ignoriert, es sei denn, die Option PermitUserEnvironment ist auf yes gesetzt. Daher müssen Sie sicherstellen, dass Sie / etc / sshd_config auf dem SSH-Server bearbeiten, um diesen Parameter hinzuzufügen oder zu aktualisieren:

PermitUserEnvironment yes

Sie müssen die SSH-Serverkonfiguration neu laden. Unter RHEL oder Suse Linux tun Sie dies (als Root)

/sbin/service sshd reload

(Ersetzen Sie möglicherweise sshd durch ssh, wenn es nicht funktioniert)

Unter Ubuntu (mit Upstart) tun Sie dies

sudo reload ssh

Unter jedem anderen Linux können Sie es versuchen (als root)

/etc/init.d/sshd reload

(Ersetzen Sie sshd durch ssh oder openssh oder was auch immer dem SSH-Server-Init-Skript entsprechen würde.)

Huygens
quelle
Danke, aber ich kann nicht in das Verzeichnis / etc schreiben, die ~ / .ssh / -Umgebung wird nicht bezogen.
Inf3rno
2

Ich habe keinen gemeinsamen Godaddy-Host mehr, daher kann ich nicht überprüfen, ob die vorgeschlagenen Lösungen gültig sind. Dies bleibt die akzeptierte Antwort, da es von mir funktioniert hat, als ich die Frage gestellt habe. Die anderen Antworten könnten auch funktionieren. Ich habe die Community das mit Upvotes entscheiden lassen.

In Ordnung. Die Lösung ist, dass es auf einem gemeinsam genutzten Godaddy-Host keine Lösung gibt. Ich habe alles versucht, aber nichts funktioniert, also habe ich beschlossen, bei den ~ / .ssh / autorisierten_Tasten zu bleiben:

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

In der ~ / 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;

Und im ~ / .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

Also muss ich den Befehl = "..." auf jeden rsa-Schlüssel in den autorisierten Schlüsseln kopieren. Dies ist eine Codeduplizierung, aber ich glaube nicht, dass es eine andere Lösung für einen von Godaddy gemeinsam genutzten Host gibt.

inf3rno
quelle
1

Wenn Sie bashals Shell verwenden, fügen Sie die Umgebungseinstellungen hinzu .bashrc.

Überprüfen Sie zuerst, ob dies beim Anmelden ausgeführt wird. Möglicherweise nicht, da die Standarddateien häufig Folgendes enthalten:

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

am Anfang von ihnen. Jede Änderung, die Sie auch für nicht interaktive Anmeldungen vornehmen möchten, muss über eine solche Anweisung hinausgehen.

.profileEine allgemeinere Platz Konfiguration so zu setzen und wird von den meisten Schalen respektiert (auf einem Standard - Debian - Setup ist es , ~/.profiledass Anrufe ~/.bashrcan erster Stelle). Möglicherweise müssen Sie die Bearbeitung sorgfältiger durchführen, .profilefalls sie jemals von anderen Shells interpretiert wird. Versuchen Sie daher, die Verwendung bashbestimmter Erweiterungen zu vermeiden .

Bearbeiten

Wenn Sie eine .bash_profileBearbeitung haben, die anstelle von .profile: bash diese zugunsten der allgemeineren Datei verwendet, und Sie können dort sicher bash-spezifische Dinge verwenden.

David Spillett
quelle
Lesen Sie den Abschnitt "Bearbeiten". (.profile funktioniert nicht)
inf3rno
1

Sie können den Befehl für alle Benutzer / Schlüssel verwenden, ohne den Befehlsteil in den autorisierten Schlüsseln hinzuzufügen, indem Sie diese Zeile zur Datei sshd_config hinzufügen:

ForceCommand ~/connect.sh

In diesem Fall schlage ich vor, dass Sie einen absoluten Pfad für das Skript verwenden

GARCIN David
quelle
0

Ich schlage Ihnen einen anderen Ansatz vor.

Sie richten eine Datei mit der Deklaration Ihrer Umgebungsvariablen ein und beziehen sie jedes Mal, wenn Sie einen Remote-Befehl aufrufen.

Beispiel: Sie geben die erforderlichen Variablen in ~ / .my_var.rc und dann für jeden Remote-Befehl ein, den Sie ausführen ssh user@remote bash -c "source ~/.my_var.rc; <your command>"

Wenn dies zu Ihnen passt, können Sie dieses Konzept verfeinern und der Einfachheit halber skripten. Wenn Sie es nur für Git-Befehle benötigen, würde ich ein git.sh-Skript erstellen, das dies tun würde:

#!/bin/bash

source ~/.my_var.rc

git $@

Angenommen, dieses Skript befindet sich in Ihrem Home-Verzeichnis, würden Sie es aufrufen: ssh user@remote git.sh pull origin master

Hinweis: Dies ist ein einfacher Ausgangspunkt. Beispielsweise werden Parameter mit Leerzeichen nicht unterstützt.

Huygens
quelle
Ich kann das ofc tun, aber diese Konfiguration ist nicht nur für mich, und es sollte mit Git
GUI
Stellen Sie mit demselben Benutzer eine Verbindung zur SSH-Fernbedienung her? Wenn ja, dann wäre die Datei ~ / .my_var.rc benutzerspezifisch und die Datei git.sh für alle gleich. Wenn nein, können Sie git.sh einen zusätzlichen Parameter hinzufügen, mit dessen Hilfe Sie unterscheiden können, welche RC-Datei als Quelle verwendet werden soll (oder bei Verwendung einer festen IP-Adresse können Sie die env-Informationen von SSH_CLIENT verwenden, um Ihre Benutzer zu unterscheiden). Der Befehl sollte mit Git ssh -Y user@remote git.sh gui
Huygens
Ich benötige für jeden Benutzer die gleichen Env-Einstellungen. Ich werde den Befehlen keinen zusätzlichen Teil hinzufügen, es ist absurd ...
inf3rno
Wenn die Einstellungen für alle Benutzer gleich sind, ist die Antwort vollständig und Sie können meinen vorherigen Kommentar ignorieren. Sie müssten wahrscheinlich die .rc- und .sh-Dateien in einem Verzeichnis ablegen, das allen Benutzern gemeinsam zugänglich ist.
Huygens
@ inf3rno Wenn Sie weitere Antworten wünschen, sollten Sie sich bereits bei denjenigen bedanken, die gute Antworten vorgeschlagen haben, auch wenn dies für Ihren Fall nicht zutreffend ist, da in der ursprünglichen Frage Informationen fehlten. Oder die Leute werden es nicht versuchen.
Huygens
0

Dies beantwortet nicht die allgemeine Frage zu PATHS, ermöglicht es Ihnen jedoch, ein Git-Repository auf einem Remote-Server zu verwenden, dessen Pfad kein Git enthält und auf das Sie keinen Root-Zugriff haben. Diese Lösung stammt von dieser Seite .

git clone -u relative/path/to/bin/git-upload-pack [email protected]:relative/path/to/remote_repository.git

So schieben und holen Sie auch:

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

/ etc / profile wird bei jeder Verbindung mit ssh-client bezogen.

Jason416
quelle
Nur für Login-Shells.
RalfFriedl