Моя проблема в том, что мне нужно установить несколько переменных и выводить несколько строк каждый раз, когда я вхожу в оболочку ssh, и в то же время я должен иметь возможность использовать sftp для передачи файлов через Filezilla.
Теперь, в соответствии с часто задаваемыми вопросами openssh по адресу http://www.openssh.org/faq.html , если ваши скрипты запуска выводят какой-либо вывод, он ошибается с sftp. Таким образом, он либо задерживается на неопределенное время, либо выдает ошибки с «Соединением, закрытым сервером с кодом выхода 128».
Я пробовал такие решения, как перемещение .bashrc в .bash_profile или использование следующего кода в .bashrc:
if [ "$TERM" != "dumb" ]
then
source .bashc_real
fi
И:
if [ "$TERM" = "xterm" ]
then
source .bashc_real
fi
Однако ничего не работает. Мой терминал оболочки bash, и я подключаюсь к sftp с помощью filezilla.
.bashrc
будет дляscp
илиssh host command
.Bash
вызываетсяscp
илиssh host command
действительно не является интерактивным . Я только что нашел это в руководстве bash: «Bash пытается определить, когда он запускается со своим стандартным входом, подключенным к сетевому соединению , как при выполнении демоном удаленной оболочки, обычно rshd, или демоном защищенной оболочки sshd . Если bash определяет он запускается таким образом, он читает и выполняет команды~/.bashrc
, если этот файл существует и доступен для чтения ». Вот интересная история .Если вы используете csh:
И если это bash:
или альтернативно используя регулярные выражения bash:
Эти строки должны предшествовать строкам, в которых вы выводите / выводите что-то обратно.
источник
$?var
incsh
возвращает 1, еслиvar
определено, и 0 в противном случае.$-
inbash
бы имеетi
символ в своем значении, если оболочка является интерактивной.Решение Майка сработало и для меня. Но так как моя оболочка по умолчанию - TCSH, мне пришлось немного отредактировать исправление следующим образом (в .tcshrc):
Просто думал, что поделюсь всем на пользу.
источник
Мне больше нравятся некоторые другие решения, упомянутые здесь, но я подумал, что выброшу решение, которое я сейчас использую на своих виртуальных машинах bash и csh, чтобы предотвратить отключение SFTP из-за команд echo в моих сценариях запуска, на тот случай, если кто-то найдет эту информацию полезной. ,
В BASH:
В csh:
Это немного грубая сила, но она работает.
источник
Вот первые строки моего (по умолчанию)
.bashrc
файла:Проверка интерактивного сеанса позволяет избежать путаницы с SCP, SFTP или
ssh remote-host command
режимом.Без этого, если ваш файл
.bashrc
используетecho
или печатает что-то другое на stdout, вы можете получить такие ошибки:Received message too long 168435779
protocol error: unexpected <newline>
источник