원격 SSH 명령-bash bind warning : line editing not enabled


17

bash 4.3.11 (1)을 사용하고 있으며 다음과 같은 히스토리 플러그인이 설치되어 있습니다 ( .bash_it 통해 ).

# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
bind '"^[[B":history-search-forward'

대화 형 세션에 로그인하면 모두 잘되지만 ssh host 'ls -als'예를 들어 원격 명령을 실행 하면 다음과 같은 출력이 표시됩니다.

: ssh host 'ls -als'
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 3: bind: warning: line editing not enabled
/home/ubuntu/.bash_it/plugins/enabled/history.plugin.bash: line 4: bind: warning: line editing not enabled

echo -e '\0033\0143'각 바인드 호출 후 히스토리 플러그인을 수정하면 더 이상 경고가 표시되지 않지만 콘솔이 지워집니다. 큰 단점은 아니지만 원격 명령에서 이것을 억제하는 더 확실한 방법을 아는 것이 좋습니다.

# Works, but annoyingly clears console
# enter a few characters and press UpArrow/DownArrow
# to search backwards/forwards through the history
bind '"^[[A":history-search-backward'
echo -e '\0033\0143'
bind '"^[[B":history-search-forward'
echo -e '\0033\0143'

답변:


28
ssh host 'ls -als'

ssh가 원격 시스템에서 명령을 실행하도록 요청하면 ssh는 일반적으로 원격 세션에 PTY (의사 -TTY)를 할당하지 않습니다. ssh를 사용 -t하여 tty를 강제로 할당 할 수 있습니다 .

ssh -t host 'ls -als'

항상 입력하지 않으려면이 줄을 로컬 호스트의 ".ssh / config"파일에 추가하십시오.

RequestTTY yes

또는 원격 시스템에서 ".bashrc"파일을 수정하여 세션이 대화 형이 아닌 것으로 간주되는 명령을 실행하지 않도록 할 수 있습니다. 한 가지 방법은 세션에 TTY가 있는지 테스트에서 명령을 묶는 것입니다.

if [ -t 1 ]
then
    # standard output is a tty
    # do interactive initialization
fi

1
실제로이 답변은 정확하지 않습니다. 아래 @ alexander-vorobiev의 답변을 참조하십시오.
Ahmed Masud

2

대화식 세션을 갖는 것만으로는 충분하지 않습니다 bind. 인스턴스 이맥스 쉘은 통과 대화식 세션 제공 if [ -t 1 ]테스트를하지만, 그래서 어떤 편집 라인이없는 bind당신에들 ~/.bashrc경고를 생성합니다. 대신 다음과 같은 방법으로 라인 편집이 활성화되어 있는지 확인할 수 있습니다 (더 간단하고 나은 방법이 있습니까?).

if [[ "$(set -o | grep 'emacs\|\bvi\b' | cut -f2 | tr '\n' ':')" != 'off:off:' ]]; then
  echo "line editing is on"
fi

이것은 정답 일 것입니다
Ahmed Masud

1
더 쉬운 방법은 사용하는 것입니다[[ ${SHELLOPTS} =~ (vi|emacs) ]] && echo 'line-editing on' || echo 'line-editing off'
Ahmed Masud

1

bash 세션이 라인 편집을 허용하는지 확인하는 'if'문에 바인드 명령을 넣으십시오.

if [[ ${SHELLOPTS} =~ (vi|emacs) ]]; then
    bind '"^[[A":history-search-backward'
    bind '"^[[B":history-search-forward'
fi

1

라인 편집이 없으면이 bind명령 자체는 무해합니다. 경고를 억제하십시오.

bind '"^[[A":history-search-backward' 2>/dev/null
bind '"^[[B":history-search-forward'  2>/dev/null

이것은 다소 우아하지 않지만 여전히 작동해야합니다. 다른 답변은 최선 / 충분한 테스트에 동의하지 않습니다. 나의 접근은 이것을 우회한다. 그래도 잘 확장되지 않습니다. 두 명령만으로는 큰 차이가 없어야합니다. 그러나 수십 개가 더 많으면 적절한 조건이 더 좋을 것입니다.


좋은 지적. 공감하십시오. :-)
Jonathan Hartley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.