Mikes Antwort wird wahrscheinlich funktionieren. Es sei jedoch darauf hingewiesen, dass Sie auf diese Weise sorgfältig auswählen können, in welche Startdateien das ausführliche Material eingefügt werden soll.
Wenn bash als interaktive Anmeldeshell oder als nicht interaktive Shell mit der Option --login aufgerufen wird, werden zuerst Befehle aus der Datei / etc / profile gelesen und ausgeführt, sofern diese Datei vorhanden ist. Nach dem Lesen dieser Datei sucht sie in dieser Reihenfolge nach ~ / .bash_profile, ~ / .bash_login und ~ / .profile und liest und führt Befehle von der ersten Datei aus, die vorhanden und lesbar ist. Die Option --noprofile kann verwendet werden, wenn die Shell gestartet wird, um dieses Verhalten zu unterbinden.
Wenn eine interaktive Shell gestartet wird, die keine Anmeldeshell ist, liest bash Befehle von ~ / .bashrc und führt sie aus, sofern diese Datei vorhanden ist. Dies kann mit der Option --norc verhindert werden. Die Option --rcfile file erzwingt, dass Bash anstelle von ~ / .bashrc Befehle aus der Datei liest und ausführt.
Die sftp / scp-Tools starten eine interaktive Shell ohne Anmeldung, sodass .bashrc als Quelle verwendet wird. Viele Distributionen beziehen .bashrc aus .bash_profile oder umgekehrt, so dass es verwirrend werden kann. Ein guter Trick, um die Sauberkeit Ihrer Anmeldeumgebung zu testen, besteht darin, ssh mit einem Befehl einzugeben, der auf dieselbe Weise scp / sftp connect simuliert. Beispiel: ssh myhost /bin/true
Zeigt Ihnen genau, was scp / sftp sieht, wenn sie eine Verbindung herstellen.
Eine einfache Demo:
insyte@mazer:~$ echo "echo Hello from .profile" > .profile
insyte@mazer:~$ echo "echo Hello from .bashrc" > .bashrc
sazerac:~ insyte$ ssh mazer /bin/true
Hello from .bashrc
sazerac:~ insyte$
insyte@mazer:~$ rm .bashrc
sazerac:~ insyte$ ssh mazer /bin/true
sazerac:~ insyte$
Der erste Test führt zum Abbruch von scp / sftp / rsync usw. Die zweite Version wird gut funktionieren.
.bashrc
fürscp
oderssh host command
.Bash
aufgerufen vonscp
oderssh host command
ist in der Tat nicht interaktiv . Ich habe dies gerade im bash-Handbuch gefunden: "Bash versucht zu bestimmen, wann es mit seiner Standardeingabe ausgeführt wird, die mit einer Netzwerkverbindung verbunden ist , wie wenn es vom fernen Shell-Daemon ausgeführt wird, normalerweise rshd oder dem sicheren Shell-Daemon sshd . Wenn bash feststellt es wird auf diese Weise ausgeführt, es liest und führt Befehle aus~/.bashrc
, wenn diese Datei existiert und lesbar ist. " Hier ist die interessante Geschichte .Wenn Sie csh verwenden:
Und wenn es heftig ist:
oder alternativ mit bash regulären Ausdrücken:
Diese Zeilen sollten vor den Zeilen stehen, in denen Sie etwas zurückgeben / ausgeben.
quelle
$?var
in demcsh
Wert 1 zurück , wennvar
definiert ist , und 0 sonst.$-
inbash
would hat dasi
Zeichen in seinem Wert, wenn die Shell interaktiv ist.Mikes Lösung funktionierte auch für mich. Da meine Standardshell TCSH ist, musste ich das Update wie folgt leicht bearbeiten (in .tcshrc):
Ich dachte nur, ich würde zum Wohle aller teilen.
quelle
Ich mag einige der anderen hier erwähnten Lösungen besser, aber ich dachte, ich verwerfe die Lösung, die ich derzeit auf meinen Bash- und CSH-VMs verwende, um zu verhindern, dass SFTP-Verbindungen aufgrund von Echobefehlen in meinen Startskripten getrennt werden, falls jemand die Informationen hilfreich findet .
In der BASH:
In csh:
Es ist ein bisschen rohe Gewalt, aber es funktioniert.
quelle
Hier sind die ersten Zeilen meiner (Standard-)
.bashrc
Datei:Die Prüfung für eine interaktive Sitzung verhindert, dass SCP, SFTP oder der
ssh remote-host command
Modus durcheinander gebracht werden.Andernfalls kann es zu folgenden Fehlern kommen , wenn Ihre Datei stdout
.bashrc
verwendetecho
oder wenn andere Dinge auf stdout gedruckt werden:Received message too long 168435779
protocol error: unexpected <newline>
quelle