SSH를 사용하여 스크립트를 실행할 때 stdin 입력이 내 변수를 대체하거나 손상시키는 이유는 무엇입니까?

SSH를 사용하여 스크립트를 실행할 때 stdin 입력이 내 변수를 대체하거나 손상시키는 이유는 무엇입니까?

GNU 배시, 버전 4.3.27

출력을 파일에 쓰는 스크립트에 이상한 문제가 있습니다. 서버 목록에 연결하고 일부 서비스의 상태/하위 상태를 기록하도록 ssh를 스크립트합니다. 그런 다음 결과를 배열에 저장합니다.

그런데 콘솔 창이 실행되는 동안 무언가를 입력하면 입력이 배열에 저장되는데 $result_arr그 이유를 모르겠습니다.

#!/bin/bash


check_services()
{
  server_number="$1"
  local result
  local result_arr
  local error_flag="OK"

  #Get service status
  result=$(ssh server.$host -t "$cmds_services")

  #trim carriage returns if present
  result=$(echo "$result" | tr -d '\r')

  #split result into array by line
  readarray -t result_arr <<<"$result" 

  echo "$server_number,${result_arr[0]},${result_arr[1]},${result_arr[2]},${result_arr[3]},${result_arr[4]},${result_arr[5]},${result_arr[6]},${result_arr[7]}" >> "$OUTFILE"
}

main()
{
  for server in $(cat /home/data/serverlist)
  do
    clear -x
    echo "Gathering Data...Server $server"
    check_services "$server"
  done

}

스크립트가 실행되는 동안 "a"를 스팸으로 보내고 입력하면 $OUTFILE다음과 같이 보입니다.

1234,active,mounted,active,mounted,a,,a,a 

바꾸다

1234,active,mounted,active,mounted,active,mounted,active,mounted

답변1

이는 원격 측에서 tty를 할당하기 위해 . 옵션을 사용했기 때문에 발생합니다 ssh -t.-t

원격 명령이 작동 중일 때 원격 tty는 에코 모드일 가능성이 높습니다. 로컬에서 실행 cat하고 입력할 때와 마찬가지로 tty(not)에 의해 에코된 입력을 볼 수 있으며, 또는 +가 이를 읽고 출력으로 인쇄할 cat때만 볼 수 있습니다.EnterCtrld cat

귀하의 경우, 원격 tty는 ssh로컬이 표준 입력에서 읽은 내용을 에코합니다. 그런 다음 result=$(ssh …)원격 명령의 "실제" 출력과 함께 캡처됩니다.

원격 tty가 필요하지 않은 경우 -t에 전달하지 마십시오 ssh.

원격 tty가 정말로 필요한 경우 전달 하되 로컬 stdin에서는 읽지 -t마세요 . 원격 명령은 전혀 입력할 수 없습니다.ssh</dev/null ssh -t …

원격 tty가 정말로 필요하고 로컬 stdin에서 원격 명령으로 무언가를 전달(입력)해야 하는 경우 -tstdin을 로 리디렉션하지 말고 /dev/null원격 tty에 에코를 끄라고 지시하십시오. stty -echo;에 추가하면 이 작업을 수행할 수 있습니다 . 어쨌든 원격 tty가 삭제되므로 마지막에 echo를 켤 $cmds_services필요가 없습니다 . stty echo의 모든 명령은 $cmds_services명령에 따라 tty를 재구성할 수 있으며 이를 방지할 수도 있고 불가능할 수도 있습니다.

매우 가혹한 경우에는 다음 질문이 유용할 수 있습니다.ssh별도의 stdin, stdout, stderr 및 tty가 있습니다.. 꼭 필요하지 않더라도 그 내용과 내 답변, 그 안에 있는 링크를 통해 인사이트를 얻을 수 있습니다.

관련 정보