Dot-Datei, die beim Ausführen eines Befehls über ssh nicht bezogen wurde

11

Wenn ich mein Programm interaktiv starte, funktioniert es einwandfrei:

ssh somehost
$ ~/some/path/somescript.py

Wenn ich mein Programm direkt über ssh starte, funktioniert es nicht. Die Variable PYTHONPATHist nicht gesetzt, da .bashrckeine Quelle vorhanden ist.

ssh somehost ~/some/path/somescript.py

Wenn ich renne ssh somehost 'source ~/.bashrc; ~/some/path/somescript.py', funktioniert es gut.

Letzteres würde aber für einige andere Leute nicht funktionieren, zB mit tcsh und ohne a ~/.bashrc).

Was ist der Befehl, um eine Sache über ssh auf einem anderen Host auszuführen, der für alle Shells funktioniert?

bzdjamboo
quelle
1
Beantwortet hier stackoverflow.com/questions/820517/bashrc-at-ssh-login. Ssh gibt grundsätzlich kein .bashrc aus. Sie müssen Ihr .bashrc über .bash_profile oder andere Optionen ausgeben.
EightBitTony
1
@EightBitTony: Nein, das ist ein anderes Thema. Die Frage von bzdjamboo bezieht sich auf eine nicht interaktive Sitzung.
Gilles 'SO- hör auf böse zu sein'
Tatsächlich scheint die letzte Antwort in dem Link, den ich gepostet habe, wertvoll zu sein. Ssh gibt .bashrc als Quelle aus, wird jedoch aufgrund der Prüfung auf Interaktivität nicht ausgeführt. Ich weiß jedoch zu schätzen, dass Ihre Antwort alle Grundlagen abdeckt.
EightBitTony
3
@EightBitTony: Bei dieser Frage ist die akzeptierte Antwort eine gute Lösung für den Fragesteller, aber die Antworten erzählen nicht die ganze Geschichte. SSH selbst beschafft nichts. Wenn Ihre Login-Shell als Bash aufgerufen wird bash, wird sie als Quelle .bash_profileoder .profilefür ein interaktives Login und .bashrcfür ein nicht interaktives Login verwendet. Wenn Ihre Anmeldeshell mit bash as shoder ash oder ksh aufgerufen wird , wird .profileeine interaktive Anmeldung und eine nicht interaktive Anmeldung als Quelle verwendet .
Gilles 'SO - hör auf böse zu sein'

Antworten:

12

Es gibt keine Standarddatei pro Benutzer, die für nicht interaktive Anmeldungen ausgeführt wird. Sie müssen entweder das Programm in sich abgeschlossen machen, damit es seine Abhängigkeiten finden kann, ohne auf nicht standardmäßige Umgebungsvariablen angewiesen zu sein, oder die Umgebung explizit festlegen, normalerweise mit

ssh somehost '. ~/.profile; exec ~/some/path/somescript.py'

Sie sollten keine Umgebungsvariablen in setzen .bashrc: Diese Datei ist für interaktive Shells gedacht und wird in jeder Bash-Instanz gelesen. Es sollten Umgebungsvariablen festgelegt werden .profile, die beim Anmelden gelesen werden. Abgesehen von der sehr geringen Anzahl von Benutzern, die .profilekeine Bourne-Shell als Anmeldeshell verwenden, funktioniert dies für alle Benutzer , unabhängig davon, ob sie bash oder zsh oder verwenden csh oder fischen interaktiv. Siehe auch Unterschied zwischen .bashrc und .bash_profile . Welche Setup-Dateien sollten zum Einrichten von Umgebungsvariablen mit bash verwendet werden? .

Davon abgesehen gibt es eine Möglichkeit, jedes Mal ein Skript zu erstellen, wenn Sie sich mit einem bestimmten Schlüssel über ssh anmelden. Siehe Gibt es eine Möglichkeit, Shell-Konfigurationsinformationen zu übertragen, wenn SSH an einen Host gesendet wird? , sh Startdateien über ssh .

Gilles 'SO - hör auf böse zu sein'
quelle
Wie markiere ich es nun als "beantwortet"? :-)
bzdjamboo
Auf der linken Seite dieses Antwortbereichs sollten sich Abstimmungspfeile nach oben und unten sowie ein Abstimmungszähler befinden. Darunter sollte sich der Umriss eines Kontrollkästchens befinden. Sie können darauf klicken, um die Antwortannahmefunktion zu aktivieren.
Caleb
Nochmals vielen Dank, aber anscheinend haben Ihre Antworten mein Problem nicht gelöst.
bzdjamboo
Hier ist eine etwas neuere Formulierung des Problems und mein derzeitiges Verständnis der Wurzel davon.
bzdjamboo
Anscheinend kann ich hier nicht mehr als 60 Zeichen hinzufügen, daher muss ich meine Frage erneut separat stellen. Entschuldigung ab. Das. Auch dieses Problem ist nicht gelöst, und ein paar Tage lang viel mehr zu graben hat nicht geholfen.
bzdjamboo
0

Ich hatte das gleiche Problem, aber für mich war die Lösung anders. Mein Benutzer war nicht für die Verwendung von bash als Shell konfiguriert, sondern verwendete stattdessen zsh als Shell. Daher wurden die bash-Punktdateien beim Anmelden nicht ausgeführt. Öffnen Sie / etc / passwd mit einem Texteditor und suchen Sie nach Ihrem Benutzernamen und der verwendeten Shell:

root:x:0:0:root:/root:/bin/zsh

So sieht meine Benutzereingabe aus. Beachten Sie, dass / bin / zsh anstelle von / bin / bash steht. Für zsh lautet die richtige Punktdatei ~ / .zprofile. Der Inhalt wird jedes Mal ausgeführt, wenn Sie sich mit ssh anmelden.

Martin Hansen
quelle