Link to home
Start Free TrialLog in
Avatar of Maarten Bruins
Maarten Bruins

asked on

What the purpose of /dev/tty?

See: https://stackoverflow.com/questions/6170598/can-anyone-explain-to-me-what-the-purpose-of-dev-tty


You can start with the POSIX spec. From there, read about the "controlling terminal" of a process.

But just for example... /dev/tty is how a command like "ssh" can read your password even if its standard input comes from somewhere else:

tar cf - . | ssh dest 'tar xf -'

Open in new window


If ssh decides to prompt you for a password, it will read it from /dev/tty instead of stdin.

Conceptually, /dev/tty is "the keyboard and text terminal". More or less.

Let's say my "terminal-file" of the current session is /dev/pts/1. In such a case, then what's the difference between "/dev/pts/1" and "/dev/tty"? And if they are basically the same, then why  "/dev/tty" is used instead of "/dev/pts/1"?

And:

/dev/tty is how a command like "ssh" can read your password even if its standard input comes from somewhere else

Let's say the standard input comes from somewhere else, so let's say we have:

FD 0 <- file
FD 1 -> /dev/pts/1
FD 2 -> /dev/pts/1

How I see it: the fact that the standard input comes from somewhere else doesn't mean that /dev/pts/1 can not be read? The password comes from the keyboard and /dev/pts/1 represents i.a. the keyboard, right? So I still don't see what exactly the purpose is of /dev/tty?

@noci: I know you know the answer, but I don't understand your explanation so I've made this post so maybe other people can explain it to me in a way that I understand it.
Avatar of mccarl
mccarl
Flag of Australia image

You can maybe just think of /dev/tty being like a link to whatever the actual terminal device is for that particular session, be it a /dev/pts/1 type of terminal, or /dev/tty1 or /dev/ttyS0, etc, etc.

So you next question then was...

Let's say the standard input comes from somewhere else, so let's say we have:

FD 0 <- file
FD 1 -> /dev/pts/1
FD 2 -> /dev/pts/1

How I see it: the fact that the standard input comes from somewhere else doesn't mean that /dev/pts/1 can not be read?

True, but how do you know that the terminal to read is /dev/pts/1 and not say, /dev/pts/5 or something. The FD 0 was redirected to the file by the shell before the program started to run, so how do you know which terminal to try and read from? You don't, but you can just read from /dev/tty and it will always be whatever FD 0 was going to be before the redirection.
Avatar of Maarten Bruins
Maarten Bruins

ASKER

Thanks a lot! That's clear to me.
Now noci just said something to me in another thread and that confuses me again ;). Let's say the shell is bash. Then I start with a bash process:

FD 0 (standard input)   <- /dev/pts/1 (terminal-file/keyboard)
FD 1 (standard output)  -> /dev/pts/1 (terminal-file/keyboard)
FD 2 (standard error)   -> /dev/pts/1 (terminal-file/keyboard)

When "less" is seen by bash, these file descriptors will be forked first right? Now you're saying:

The FD 0 was redirected to the file by the shell before the program started to run,

How I have to see this, because if less starts with a fork of the bash-process then "/dev/pts/1" is known, right?
ASKER CERTIFIED SOLUTION
Avatar of mccarl
mccarl
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thanks a lot! Sounds all logical, I'll go back to noci with it and then later on I'll close this question. What you're saying, totally makes sense to me. I still have to convince noci ;).