scp \033H сообщение

Наличие странной проблемы scp:

$ scp user@server.org:~/test.txt ./
Password:
\033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H \033H

Пароль берет прекрасный, но получение что странная \033H вещь. И файл не передает. У кого-либо есть какие-либо идеи?

3
задан 14 November 2017 в 12:01

1 ответ

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

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

Это происходит когда .bashrc в корневом каталоге пользователя на удаленной машине содержит команды, которые производят вывод и то выполнение даже в неинтерактивных оболочках. Реже, это также произошло бы если в масштабе всей системы /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 - указание, что это - начальная оболочка сессии-bash выполняет команды в /etc/bash.bashrc и ~/.bashrc.

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

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

bash -c 'echo hello world'

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

ssh user@server.org

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

ssh user@server.org command args...

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

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

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

scp user@server.org:~/test.txt ./

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

5
ответ дан 1 December 2019 в 15:33

Другие вопросы по тегам:

Похожие вопросы: