SSH를 통해 연결하는 CentOS 시스템이 2개 있습니다. 그 중 하나에서는 클립보드의 여러 명령을 붙여넣으면 sudo 명령이 없으면 해당 명령이 모두 실행됩니다. 그렇다면 해당 작업을 수행하고 다른 모든 명령을 건너뜁니다. 예를 들어. :
$ echo aa
sudo echo bb
echo cc
결과:
aa
bb
어떤 sudo 명령이 나오든, 앞뒤에 몇 개의 명령이 나오든 상관없습니다. 로 설정되어 bind -v
있습니다enable-bracketed-paste
off
다른 예시:
$ sudo echo dd ;\
echo ee
echo ff
결과:
dd
ee
다른 CentOS에서는 이런 일이 발생하지 않습니다. 이런 일이 발생하는 이유는 무엇이며 붙여넣은 명령을 수정하지 않고 문제를 해결하는 방법은 무엇입니까?
편집하다ksh
: 그런 일은 일어나지 않을 것임을 알아내세요 . 테스트할 다른 쉘을 설치할 수 없습니다.
답변1
이는 의도하지 않은 표준 입력 소비 사례처럼 보입니다.
대화형 세션에 붙여넣는 모든 항목은 당시 포그라운드에서 실행되는 명령에 사용할 수 있는 표준 입력 데이터이며 일반적으로 속도(또는 속도)에 관계없이 순서대로 실행할 수 있는 모든 명령에서 공유(및 사용 가능)됩니다. 입력/붙여넣기가 가능할 수도 있습니다. 각 명령에는 실행 시 사용 가능한 표준 입력 데이터의 일부 또는 전부를 사용할 수 있는 기회가 있습니다.
sudo
실제로 적극적으로 수행될 명령 중 하나입니다.식사 후 모두표준 입력만약에특히 기업 환경에서 보안상의 이유로 이 작업을 수행하도록 구성되어 있습니다. 이 경우 sudo
붙여넣은 텍스트(예: 후속 명령)가 사용됩니다.
/etc/sudoers*
이 동작이 발생하는 호스트의 파일을 볼 수 있는 경우 해당 파일에 또는(또는 둘 다)에 대한 줄 설정이 있는지 확인하거나 Defaults
귀하의 계정이나 그룹일 수도 있고 심지어 단지 당신이 정확한 명령을 실행하고 있는 것. 실제로 시스템 관리자가 그렇게 생각한다면 실제로는 또 다른 시스템 전체 플러그인이 설정되어 있을 수도 있습니다(가능성은 낮지만 가능함).use_pty
log_input
ALL
sudo
/etc/sudo.conf
어쨌든 붙여넣은 내용을 서브셸에 간단히 래핑하면 문제를 해결할 수 있습니다.
(사용 중인 쉘의 일반 프롬프트에서 여는 괄호를 입력하고 를 누르십시오 Enter. "PS2"("추가 입력 필요"라고도 함) 프롬프트가 표시됩니다. 이 프롬프트에서는 일반적으로 >
원하는 대로 명령을 입력하거나 클립보드에서 있는 그대로 붙여넣을 수 있습니다. 이러한 명령은 즉시 실행되지 않지만 명시적으로 종료할 때까지 여는 괄호로 시작된 하위 쉘에 "대기"됩니다. 입력/붙여넣기를 마친 후 )닫는 괄호를 입력하고 다시 입력하여 완료 하면 Enter하위 쉘이 종료됩니다.
sudo
그런 다음에만 붙여넣은 명령이 정상적인(또는 특수) 동작으로 표준 입력을 소비할 수 있는 이러한(또는 다른) 명령에 의해 "먹히지" 않고 최종적으로 실행됩니다. 이는 모든 관련 표준 입력(예: 붙여넣기)이 이미 "대기열에 있는" 하위 쉘에 의해 소비되었기 때문에 sudo
"먹을" 것이 아무것도 남지 않았기 때문입니다.
마지막으로 귀하의 경우에는enable-bracketed-paste on
회의bash
이것이 본질적으로 탐지를 하기 때문에 친구가 되어주세요붙여넣은텍스트를 결합하여타이핑된터미널 에뮬레이터의 지원을 받는 텍스트(터미널 에뮬레이터가 해당 기능을 제공하는 경우)
"올바르게" 작동하는 것처럼 보이는 이유에 대해서는 ksh
내부를 자세히 조사하지 않았지만 언뜻 보기에는 다음과 같은 내용을 strace
읽고 있는 것 같습니다.버퍼 크기표준 입력은 일반적인 단순화된 방식으로 표준 입력을 읽고 실행하는 대신 차례로 실행되는 개별 명령으로 표시될 수 있습니다.
완전히 screen
무시한다는 점을 말하자면 enable-bracketed-paste on
, 나 자신도 열성적인 사용자는 아니지만 screen
이렇게 말할 수 있습니다. 이것은 분명히 매우 "풍부한" 터미널 소프트웨어이며 아마도행동bash
터미널 에뮬레이터 자체이므로 대괄호 붙여넣기 기능을 위해 터미널 에뮬레이터로 전송/수신된 이스케이프 코드를 방해(예: 무시 및 제거)할 수 있습니다.
답변2
이 동작은 터미널에 붙여넣을 때 쉘이 명령 시퀀스를 해석하는 방법과 관련이 있을 수 있습니다. 한 가지 가능한 설명은 이 동작이 관찰되는 시스템의 쉘이 전체 명령 시퀀스를 단일 행으로 해석하고 해당 sudo
명령으로 인해 나머지 명령을 실행하기 전에 쉘이 종료된다는 것입니다.
붙여넣은 명령을 수정하지 않고 이 문제를 해결하려면 다음과 같은 몇 가지 방법을 시도해 볼 수 있습니다.
다른 쉘 사용: 언급한 대로 Korn 쉘(ksh)을 사용할 때는 이 문제가 발생하지 않습니다. 다른 셸(예: Bash 또는 Zsh)을 사용하여 동작이 변경되는지 확인할 수 있습니다.
서브셸 사용: 명령을 서브셸로 그룹화한 다음 다음을
sudo
사용하여 서브셸을 실행할 수 있습니다. 이렇게 하면 명령이sudo
셸을 종료하는지 여부에 관계없이 모든 명령이 하위 셸 내에서 실행됩니다. 예를 들어:
$ (echo aa ; echo bb ; echo cc)
$ sudo sh -c '(echo aa ; echo bb ; echo cc)'
특히 붙여넣은 명령에 복잡한 구문이나 변수 확장이 포함된 경우 서브셸 방법이 모든 경우에 작동하지 않을 수 있습니다.
이러한 방법 중 어느 것도 작동하지 않으면 붙여넣은 명령을 수정하여 올바른 순서로 실행되도록 해야 할 수도 있습니다. 예를 들어 일련의 명령을 여러 줄로 나누거나 쉘 스크립트를 사용하여 원하는 순서로 명령을 실행할 수 있습니다.
답변3
readline
쉘 , PS1
프롬프트 또는 프로그램 의 무언가가 PROMPT_COMMAND
보류 중인 문자를 삭제하고 있다고 추측할 위험이 있습니다.표준 입력.
이 두 줄을 입력해 보세요첫 번째 작업이 완료될 때까지 기다릴 필요가 없습니다.:
sleep 10
id
그렇지 않은 경우 id
에는 환경을 더 주의 깊게 조사해야 합니다.