Odpowiedź Mike'a prawdopodobnie zadziała. Warto jednak zaznaczyć, że można to dokładnie zrobić, wybierając pliki startowe, w których można umieścić pełne informacje. Ze strony podręcznika użytkownika bash:
Kiedy bash jest wywoływany jako interaktywna powłoka logowania lub jako nieinteraktywna powłoka z opcją --login, najpierw czyta i wykonuje polecenia z pliku / etc / profile, jeśli plik ten istnieje. Po odczytaniu tego pliku szuka ~ / .bash_profile, ~ / .bash_login i ~ / .profile, w tej kolejności, i odczytuje i wykonuje polecenia z pierwszego, który istnieje i jest czytelny. Opcji --noprofile można użyć, gdy powłoka zostanie uruchomiona w celu zahamowania tego zachowania.
Po uruchomieniu interaktywnej powłoki, która nie jest powłoką logowania, bash czyta i wykonuje polecenia z ~ / .bashrc, jeśli plik istnieje. Można temu zapobiec, używając opcji --norc. Opcja pliku --rcfile zmusi bash do odczytu i wykonywania poleceń z pliku zamiast ~ / .bashrc.
Narzędzia sftp / scp uruchamiają interaktywną powłokę niezalogowaną, więc źródłowy będzie .bashrc. Wiele dystrybucji pobiera .bashrc z .bash_profile lub odwrotnie, więc może to być mylące. Dobrą sztuczką do testowania czystości środowiska logowania jest ssh in z poleceniem, które symuluje w ten sam sposób połączenie scp / sftp. Na przykład: ssh myhost /bin/true
pokaże ci dokładnie to, co widzi scp / sftp podczas łączenia.
Proste 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$
Pierwszy test spowoduje uszkodzenie scp / sftp / rsync itp. Druga wersja będzie działać dobrze.
.bashrc
miałoby być źródłem dlascp
lubssh host command
.Bash
wywoływane przezscp
lubssh host command
faktycznie jest nieinteraktywne . Właśnie znalazłem to w podręczniku bash: „Bash próbuje ustalić, kiedy jest uruchamiany ze standardowym wejściem podłączonym do połączenia sieciowego , tak jak w przypadku wykonania przez zdalnego demona powłoki, zwykle rshd, lub bezpiecznego demona powłoki sshd . Jeśli bash określa jest uruchamiany w ten sposób, odczytuje i wykonuje polecenia z~/.bashrc
, jeśli ten plik istnieje i jest możliwy do odczytu. ” Oto interesująca historia .Jeśli używasz csh:
A jeśli to bash:
lub alternatywnie używając wyrażeń regularnych bash:
Te wiersze powinny poprzedzać wiersze, w których wypisujesz / echo coś z powrotem.
źródło
$?var
wcsh
zwraca 1 jeślivar
jest zdefiniowane, a 0 w przeciwnym razie.$-
inbash
mai
char w swojej wartości, jeśli powłoka jest interaktywna.Rozwiązanie Mike'a również zadziałało dla mnie. Ale ponieważ moją domyślną powłoką jest TCSH, musiałem nieznacznie edytować poprawkę w następujący sposób (w .tcshrc):
Pomyślałem, że podzielę się z korzyścią dla wszystkich.
źródło
Bardziej podoba mi się niektóre inne wymienione tutaj rozwiązania, ale pomyślałem, że wyrzucam rozwiązanie, którego obecnie używam na maszynach wirtualnych bash i csh, aby zapobiec rozłączaniu się SFTP z powodu poleceń echa w moich skryptach startowych, na wypadek, gdyby ktoś uznał te informacje za pomocne .
W BASH:
W csh:
To trochę brutalna siła, ale działa.
źródło
Oto pierwsze wiersze mojego (domyślnego)
.bashrc
pliku:Sprawdzenie sesji interaktywnej pozwala uniknąć bałaganu w SCP, SFTP lub
ssh remote-host command
trybie.Bez tego, jeśli twój plik
.bashrc
używaecho
lub jakieś inne rzeczy drukują na standardowym ekranie, możesz otrzymać tego rodzaju błędy:Received message too long 168435779
protocol error: unexpected <newline>
źródło