Наличие странной проблемы 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 вещь. И файл не передает. У кого-либо есть какие-либо идеи?
Фиксация для этого обычно проста. Обычно можно осмотреть .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
когда:
/etc/profile
или ~/.profile
получает его, но также и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
не сможет скопировать файлы.