Mon problème est que je dois définir quelques variables et produire quelques lignes chaque fois que je me connecte au shell ssh, et en même temps, je dois pouvoir utiliser sftp pour tarnfer des fichiers via Filezilla.
Maintenant, conformément à la FAQ openssh à http://www.openssh.org/faq.html , si vos scripts de démarrage font écho à n'importe quel type de sortie, cela gâche avec sftp. Il retarde donc indéfiniment, ou génère une erreur avec une "Connexion fermée par le serveur avec le code de sortie 128".
J'ai essayé des solutions comme déplacer .bashrc vers .bash_profile, ou utiliser le code suivant dans .bashrc:
if [ "$TERM" != "dumb" ]
then
source .bashc_real
fi
Et:
if [ "$TERM" = "xterm" ]
then
source .bashc_real
fi
Cependant, rien ne fonctionne. Mon terminal shell est bash, et je me connecte à sftp avec filezilla.
.bashrc
serait source pourscp
oussh host command
.Bash
invoqué parscp
oussh host command
est en effet non interactif . Je viens de trouver ceci dans le manuel bash: "Bash tente de déterminer quand il est exécuté avec son entrée standard connectée à une connexion réseau , comme lorsqu'il est exécuté par le démon shell distant, généralement rshd, ou le démon shell sécurisé sshd . Si bash détermine il est exécuté de cette façon, il lit et exécute les commandes de~/.bashrc
, si ce fichier existe et est lisible. " Voici l' histoire intéressante .Si vous utilisez csh:
Et si c'est bash:
ou en utilisant des expressions régulières bash:
Ces lignes doivent précéder les lignes où vous sortez / faites écho à quelque chose en arrière.
la source
$?var
encsh
retourne 1 sivar
est défini et 0 sinon.$-
inbash
aurait le caractèrei
dans sa valeur si le shell est interactif.La solution de Mike a également fonctionné pour moi. Mais comme mon shell par défaut est TCSH, j'ai dû modifier légèrement le correctif comme suit (en .tcshrc):
Je pensais juste que je partagerais pour le bénéfice de tous.
la source
J'aime mieux certaines des autres solutions mentionnées ici, mais j'ai pensé jeter la solution que j'utilise actuellement sur mes machines virtuelles bash et csh pour empêcher les déconnexions SFTP en raison des commandes d'écho dans mes scripts de démarrage, juste au cas où quelqu'un trouverait les informations utiles .
En BASH:
Dans csh:
C'est un peu brutal, mais ça marche.
la source
Voici les premières lignes de mon
.bashrc
fichier (par défaut) :La vérification d'une session interactive évite de gâcher SCP, SFTP ou le
ssh remote-host command
mode.Sans cela, si votre fichier
.bashrc
utiliseecho
ou d'autres éléments d'impression sur stdout, vous pouvez obtenir ce type d'erreurs:Received message too long 168435779
protocol error: unexpected <newline>
la source