Проблема и как ее решить

Проблема и как ее решить

Возникла странная проблема с SCP:

$ scp [email protected]:~/test.txt ./
Password:
\033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H

Пароль принимается нормально, но получаю эту странную штуку \033H. И файл не передается. Есть у кого-нибудь идеи?

решение1

Исправление этого обычно простое. Обычно вы можете проверить .bashrc, найти строку или несколько строк вверху, которые вызывают проблему, и переместить или удалить их. Самое сложное — убедить людей, что эта проблема действительно существует. Подробности ниже, но если вы просто хотитеисправитьэтой проблемы, то вам нужно будет использовать только этот более короткий первый раздел.

Проблема и как ее решить

Это происходит, когда .bashrcв домашнем каталоге пользователя на удаленной машине содержатся команды, которые производят выводи которые работают даже в неинтерактивных оболочках.Реже это также может произойти, если systemwide /etc/bash.bashrcсодержит такие команды. Конкретный вывод зависит от того, что его производит. Но сочетание получения неожиданного вывода инетиметь какие-либо переводы успешными или даже начатымиоченьявно указывает на эту причину (особенно когда сервер представляет собой систему Debian или Ubuntu). scpиспользуетстандартный ввод и выводдля отправки и получения данных, и если через них передаются несвязанные данные, то они не могут передавать файлы.

Если вы думаете,«Это невозможно, .bashrcэто только для интерактивных оболочек!»или иным образом заинтересованы в подробном объяснении того, почему это происходит, см. второй раздел ниже.

Эта проблема не нарушает нормальный SSHing. Поэтому, если система настроена так, чтобы разрешить вам sshуспешно войти в интерактивную оболочку входа, вы можете сделать это, открыть .bashrcдомашний каталог удаленного пользователя и либо удалить, либо закомментировать (с помощью #) проблемную команду или команды, если они вам не нужны. Или, если они вам нужны, переместите их под другую команду, которая прерывает работу, когда оболочка неинтерактивна. Такая команда может уже присутствовать.В Ubuntu и некоторых других дистрибутивах файлы пользователей .bashrcи всей системы /etc/bash.bashrcобычно начинаются с таких проверок.

Файл по умолчанию .bashrcв Ubuntu, скопированный из/etc/skel при создании учетной записи пользователя, содержит этот код для проверки того, является ли запущенная оболочка интерактивной, и для предотвращения запуска любых дальнейших команд в файле, если это такнет:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Другой распространенный метод, который некоторые люди используют в своих .bashrcфайлах и который в настоящее время применяется в общесистемном /etc/bash.bashrcфайле для всех пользователей, это:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Если файлы были заменены или изменены по сравнению с файлами по умолчанию, то вы можете увидеть использование любого из этих методов в любом из файлов. Существуют и другие возможные способы проверки интерактивной работы, но они не распространены. Если пользователь написал свой собственный .bashrcфайл с нуля или перенес его из другой операционной системы, которая не является Debian, Ubuntu или другой производной Debian, то, скорее всего, у него вообще нет такого кода. Но если он вам нужен, вы все равно можете его добавить.

Любая команда, которая создает вывод и появляется в .bashrcили/etc/bash.bashrc , если только она не отображаетсяпослеКод, подобный показанному выше, приведет к отправке непредвиденных данных в начале сеанса scpи не позволит scpпередавать файлы.

Если вы недавно сами отредактировали один из этих файлов, добавив команду в начало, то вам должно быть легко выяснить конкретное изменение, вызвавшее проблему. Даже если нет, описание выше может дать вам достаточно информации.

Однако я рекомендую вам отредактировать свой вопрос с полными подробностями, включая содержимое этих файлов, независимо от того, сможете ли вы решить проблему на основе объяснения выше. Помните, чтоэто файлы на удаленном сервере, а не на клиентской машине. Это должно помочь другим, кто найдет ваш вопрос, понять проблему, а также дать возможность дать более конкретный совет, если это необходимо.

Я считаю, что вероятность того, что ваша проблема вызвана чем-то совершенно другим, очень мала, но в любом случае дополнительная информация должна позволить узнать наверняка.Другие людичем автор этого вопроса, у которого есть похожие проблемы и которому нужна помощь в их решении, конечно, долженнетотредактировать этот вопрос, но следует опубликовать свой собственный вопрос.


Почему возникает проблема

Люди часто говорят, что .bashrcэто касается только интерактивных оболочек, но это заблуждение или, в лучшем случае, сильное упрощение. bashзапускает команды из ~/.bashrcи /etc/bash.basrhcкогда:

  1. оболочка интерактивна,или
  2. другой скрипт запуска, например /etc/profileили~/.profile источники это,но и
  3. когда bashне работает ни в интерактивном режиме, ни как оболочка входа в систему, но определяет, что она, вероятно, запускается как начальная оболочкав удаленном соединении.

Что bashпринимает в качестве достаточного доказательства, что это удаленная оболочка, и, таким образом, возникает ли на практике этот эффект с SSH или нет, зависит в основном откак он был скомпилирован, что отличается в разных операционных системах, и во вторую очередь по версии bashиверсияsshdкоторый используется.

В текущих системах Debian и Ubuntu при bashзапуске в качестве неинтерактивной оболочки без входа в систему проверяется, SSH_CLIENTустановлена ​​ли переменная окружения и не является ли она пустой. (Он также проверяет и другие параметры, но для SSH в текущих системах Ubuntu они ничего не показывают.) Если это так, и SHLVLпеременная окружения установлена ​​на значение меньше 2, что указывает на то, что это сеансисходныйshell-- bashзапускает команды в /etc/bash.bashrcи ~/.bashrc.

Чтобы быстро проверить это, не изменяя файлы конфигурации, читатели могутвручную передайте эти переменные в bash -c ''среду и отследите, что она читает, или изучить run_startup_filesфункцию вshell.c(которая в этой версии начинается со строки 1022).

Неинтерактивная bashоболочка без входа в систему — это то, что вы получаете, когда запускаете скрипт с помощью bash, либо выполняя его после установки необходимых разрешений и предоставления емусоответствующая строка хэшбэнгаили запустив явно. Это также то, что вы получаете, когда делаете запуск однострочника с опцией, например:bash your-scriptbash-c

bash -c 'echo hello world'

Как и следовало ожидать, оболочка, которую вы получаете, когда выавторизоватьсячерез SSH дляинтерактивная сессияэто интерактивная оболочка входа. Вот что вы получите, если выполните команду вроде этой (при условии, что она будет успешной):

ssh [email protected]

Но вот тут-то и появляется неинтуитивная часть: оболочка, которую вы получаете, когда выавторизоватьсячерез SSH длянеинтерактивныйсессия не является интерактивнойне-логинshell. Вот что вы получите, выполнив одну команду через SSH:

ssh [email protected] command args...

То есть запуск одной команды через SSH выполняется bashкак та же оболочка — неинтерактивная, не требующая входа в систему, — что и при запуске одной команды локально (или в рамках уже установленного удаленного сеанса) с использованием bash -c.

Как и sshв целом, scpзапускает оболочку на удаленной машине от имени удаленного пользователя. Это все еще то, что они настроили в качестве своей оболочки, т. е. оболочка, указанная в записи пользователя в /etc/passwdили выводе getent passwd(которая также устанавливается как значение $SHELLпеременной окружения при входе в систему). Если они не изменили ее, запустив chsh, это оболочка пользователя по умолчанию, которая в Ubuntu — bash.

Вот почему такие команды, какэтоттакже запустите неинтерактивную bashоболочку без входа на удаленном сервере:

scp [email protected]:~/test.txt ./

Если они не защищены кодом, останавливающим, если оболочка неинтерактивна, команды в .bashrcили /etc/bash.bashrcзапускаются такой оболочкой. Если они производят вывод — намеренно или ненамеренно — тоscpне сможет копировать файлы.

Связанный контент