SSH - 터미널 재정의 리디렉션에 대한 입력 프롬프트 인쇄

SSH - 터미널 재정의 리디렉션에 대한 입력 프롬프트 인쇄

두 개의 스크립트가 있습니다.

  • test_input.shSSH를 통해 실행되는 스크립트입니다. 이 스크립트에서는 사용자에게 무언가를 입력하도록 요청합니다.
  • test_ssh_connection.shlocalhost스크립트를 연결하고 실행하는 스크립트입니다.test_input.sh

test_ssh_connection.sh출력을 test_input.sh파일로 리디렉션하고 싶지만 test_input.sh프롬프트를 볼 수 있기 때문에 화면에 입력 프롬프트를 표시하고 싶습니다.

이 내 꺼야 test_ssh_connection.sh:

echo "Connecting to localhost and executing an input script."
ssh "localhost" "sh test_input.sh" >> "test.txt"

이것은 test_input.sh:

echo -n "Give me a value: "
read value
echo "You gave me [${value}]."

test.txt실제로 실행 후의 내용은 다음과 같습니다 test_ssh_connection.sh.

Give me a value: You gave me [asd].

현재 프롬프트 Give me a value:는 터미널에만 있고 test.txt터미널에는 없습니다. 대신 내가 원하는 것은 그것을 터미널에 표시하고 가능하다면 test.txt.

찾았어요이것>/dev/tty질문이 있는데 ssh/ 를 통해 호출하면 첨자가 작동하지 않는 것 같습니다 >$(tty).

답변1

이러한 이유로 응용 프로그램의 일반 출력에 속하지 않는 프롬프트와 기타 대화형 메시지는 일반적으로 표준 오류 스트림에 기록됩니다. 예를 들어 기본 프롬프트는 셸의 표준 오류 스트림에 기록됩니다.

다음 명령이 주어지면 read유틸리티는 bash표준 오류 메시지를 표시합니다 -p.

#!/bin/bash

read -r -p 'Give me a value: ' value
printf 'You gave me [%s].\n' "$value"

당신 과 /bin/sh비슷한 일을 해보세요

#!/bin/sh

printf 'Give me a value: ' >&2
read -r value
printf 'You gave me [%s].\n' "$value"

리디렉션은 >&2출력을 printf표준 오류로 리디렉션합니다.

관련된:


당신은 글을 쓰고 싶나요?TTY로 직접 연결그런 다음 이 두 가지 변형 중 두 번째 변형을 사용하고 리디렉션을 통해 메시지를 표시합니다 >/dev/tty. ssh -t이 작업을 수행하려면 의사 TTY 할당을 사용해야 합니다 . 또한 이렇게 하면 프롬프트에 표준 오류를 사용하지 않으므로 상당히 일반적인 습관이 깨집니다.

관련 정보