문제 및 해결 방법

문제 및 해결 방법

이상한 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원격 시스템의 사용자 홈 디렉토리에 출력을 생성하는 명령이 포함되어 있을 때 발생합니다.비대화형 쉘에서도 실행됩니다../etc/bash.bashrc덜 일반적이지만 시스템 전체에 이러한 명령이 포함되어 있는 경우에도 발생합니다 . 구체적인 출력은 이를 생성하는 대상에 따라 달라집니다. 하지만 예상치 못한 출력을 받는 것과~ 아니다전송이 성공하거나 시작되는 경우매우그 원인을 강력히 지적합니다(특히 서버가 Debian 또는 Ubuntu 시스템인 경우).scp 용도표준 입력 및 출력데이터를 주고 받을 수 있으며, 관련 없는 데이터를 전송하면 파일을 전송할 수 없습니다.

생각하고 계시다면,"그건 불가능해..bashrc 대화형 쉘에만 해당됩니다!"또는 왜 이런 일이 발생하는지에 대한 자세한 설명에 관심이 있는 경우 아래 두 번째 섹션을 참조하세요.

이 문제는 일반적인 SSHing을 중단하지 않습니다. 따라서 시스템이 ssh대화형 로그인 셸에 성공적으로 로그인 할 수 있도록 구성되어 있다고 가정하면 .bashrc원격 사용자의 홈 디렉터리를 열고 제거하거나 주석 처리할 수 있습니다(# 문제가 되는 명령을 )할 수 있습니다. 필요하지 않습니다. 또는 필요한 경우 쉘이 비대화형일 때 중단되는 다른 명령 아래로 이동하십시오. 이러한 명령이 이미 있을 수 있습니다.Ubuntu 및 기타 배포판에서는 사용자 .bashrc파일과 시스템 전체가 /etc/bash.bashrc일반적으로 이러한 검사로 시작됩니다.

.bashrc우분투의 기본 파일은 다음에서 복사됩니다./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환경 변수가 설정되어 있고 비어 있지 않은지 확인합니다. (다른 사항도 확인하지만 현재 Ubuntu 시스템의 SSH의 경우 아무것도 공개하지 않습니다.) 그렇다면 환경 SHLVL변수는 2보다 작은 값으로 설정됩니다. 이는 세션의 변수임을 나타냅니다.초기의쉘-- 및 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를 통해비대화형세션은 비대화형입니다.비로그인껍데기. 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파일을 복사할 수 없습니다.

관련 정보