~ / .profile wird bei Verwendung von SSH (Ubuntu) nicht geladen

21

Bearbeitet, um das Problem widerzuspiegeln, das ich unbedingt lösen wollte:

Ich muss meine Ruby-Umgebung einrichten, damit ich sie über Capistrano bereitstellen kann.

export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"

Ich habe diese in ~ deploy / .profile abgelegt, aber wenn ich sie einsetze, werden sie nicht ausgeführt. Ideen?

Ich verwende Ubuntu 12.04.


Die ursprüngliche Frage war:

Wenn ich bei localhost ein anderes Konto eröffne, wird mein .profile nicht geladen. Wie kann ich ssh zum Laden zwingen? Ich verwende Ubuntu 12.04.

Charles R
quelle

Antworten:

15

Sie können explizit angeben, dass Sie eine interaktive Anmeldeshell starten möchten:

 ssh user@host bash --login -i 

Die "Rolle" von ~/.profile(oder ~. / Bash_profile) und .bashrcfür ssh haben einige andere Dateien (siehe man sshfür Details):

~ / .ssh / Umgebung

Enthält zusätzliche Definitionen für Umgebungsvariablen. siehe UMWELT oben.

~ / .ssh / rc

Befehle in dieser Datei werden von ssh ausgeführt, wenn sich der Benutzer anmeldet, unmittelbar bevor die Shell (oder der Befehl) des Benutzers gestartet wird. Weitere Informationen finden Sie auf der Manualpage sshd (8).


quelle
"Sie können" ist oft nicht wahr, da ssh von einem anderen Tool ausgeführt wird (Continuous Delivery) und der Befehl nicht einfach geändert werden kann.
Jan Hudec
6

.profilewird nur für Login-Shells geladen, bei denen eine SSH-Sitzung nicht erfolgt (Standardeinstellung). Wenn Sie möchten, dass beim Start für alle interaktiven Shells etwas ausgeführt wird, geben Sie es .bashrcstattdessen ein ( .zshrcoder was auch immer Ihre Shell verwendet).

Wenn Sie sich nur bei einem anderen Konto auf dem lokalen Computer anmelden möchten, ist ssh wahrscheinlich zu viel des Guten. Vielleicht möchten Sie sustattdessen oder etwas verwenden.

qmega
quelle
3
Es scheint auch .bashrcnicht geladen zu sein.
Kenorb
Das ist falsch. Es ist eine Login-Shell. Auf der Manpage: "Wenn ein Befehl angegeben ist, wird er auf dem Remote-Host anstelle einer Anmeldeshell ausgeführt."
mkj
~ / .zshenv arbeitet für mich. unix.stackexchange.com/questions/4921/sh-startup-files-over-ssh
user91155
Wenn ssh einen Befehl zum Ausführen erhält, wird standardmäßig kein tty zugewiesen, und die Shell ist auch nicht "interaktiv".
Jan Hudec
4

Die Verwendung von bash sollte zum Lesen führen ~/.bashrc. Folgendes kann bei ksh und sh (Bash im sh-Modus) hilfreich sein oder wenn Sie ~/.bashrcwährend der Anmeldung nicht ausgeführt werden.

Das sshd prüft ~/.ssh/environment(überprüfen Sie sshd_config (5) auf Berechtigungen) und ~/.ssh/sshrcoder ~/.ssh/rc. Dies gibt die Möglichkeit, ENV=~/.profileoder BASH_ENV=~/.profileund einzurichtenSSH_LOGIN=Y

In ~/.profilehabe ich folgendes Layout (Ersetzen ENVdurch BASH_ENVbei Verwendung von bash):


if [[ -n $SSH_LOGIN || -z $ENV ]]; then
     # Put here login initialization code
     unset SSH_LOGIN
     ENV=~/.profile
fi
 # Put here code thats get executed with each ksh/sh invocation

eremmel
quelle
0

Bash liest ~/.profilenur, wenn es sich um eine Anmeldeshell handelt und ~/.bash.bashrcnur, wenn es ein Terminal hat, von denen beim Aufrufen eines Befehls mit ssh keines standardmäßig wahr ist. Es gibt jedoch mehrere andere Optionen, um die Umgebung auf dem Server festzulegen, die leider alle vom System-Setup abhängen:

  • Zsh liest ~/.zshenvauch in diesem Fall; Es gibt jedoch keine entsprechende Konfigurationsdatei für Bash.
  • Wenn die PermitUserEnvironmentOption in /etc/sshd_configaktiviert ist, liest ssh ~/.ssh/environment. Leider ist diese Option standardmäßig deaktiviert.
  • Wenn das pam_env.somit user_readenv=1in aufgerufen wird /etc/pam.d/sshd, wird es gelesen ~/.pam_environment. Obwohl es nicht die Standardeinstellung des Moduls ist, heißt es zumindest in Ubuntu so .
  • Wenn alles andere fehlschlägt, können Sie command=in die Datei mit den autorisierten Schlüsseln eine Anweisung einfügen, die ein Wrapper-Skript aufruft, das die Umgebung festlegt und das $SSH_ORIGINAL_COMMANDam Ende ausführt. .
Jan Hudec
quelle
0

Sie haben wahrscheinlich eine ~/.bash_profile, die überschreibt ~/.profile.

Mehrdad
quelle