stdio가 아닌 경우 (mysql) 프로세스는 "해당" 터미널을 어떻게 알 수 있습니까?

stdio가 아닌 경우 (mysql) 프로세스는 "해당" 터미널을 어떻게 알 수 있습니까?

프로그램 중 한 가지가 mysql내 관심을 끌었습니다. 플래그를 사용하여 대화형으로 비밀번호를 요청하도록 지시할 수 있습니다 -p. 이 경우 예상한 대로 프롬프트가 터미널에 나타나고 입력된 내용이 비밀번호로 허용됩니다. 하지만 놀랍게도 세 가지를 모두 리디렉션하더라도 이런 일이 발생합니다 std{in,out,err}.

$ mysql -p </dev/null >/dev/null 2>/dev/null
Enter password:

또한 비밀번호를 올바르게 읽습니다. 파일로 리디렉션되면 stderr로그인 실패 여부를 확인할 수 있습니다.

어떤 터미널에서 비밀번호를 요청할지 프로세스가 어떻게 알 수 있나요? 상위 프로세스에 연결된 터미널을 확인합니까?

답변1

Unix 프로세스는 리디렉션을 우회하여 /dev/tty에서 데이터를 읽을 수 있습니다.

답변2

그것사용 getpass()libc(사용 가능한 경우)에서 매뉴얼 페이지는 다음을 설명합니다.

getpass() 함수는 /dev/tty(프로세스 제어 터미널)를 열고, 문자열 프롬프트를 인쇄하고, 에코를 끄고, 줄("password")을 읽고, 터미널 상태를 복원하고 /dev/tty를 다시 닫습니다.

답변3

isattyunistd 함수를 호출할 수 있습니다 .

NAME
       isatty - test whether a file descriptor refers to a terminal

SYNOPSIS
       #include <unistd.h>

       int isatty(int fd);

DESCRIPTION
       The  isatty()  function  tests  whether  fd  is an open file descriptor
       referring to a terminal.

/dev/tty아마도 @Gerard H. Pille이 지적 했듯이 mysql은 전혀 확인하지 않고 -p.

몇 가지 추가 세부정보

glibc 소스 코드를 확인했습니다.이사티 구현.

tcgetattr파일 설명자를 가져오기 위해 터미널 기능을 사용합니다 . 함수가 true를 반환하면 터미널입니다.

관련 정보