O que é armazenado nos arquivos / dev / pts e podemos abri-los?

73

De acordo com o meu conhecimento, os /dev/ptsarquivos são criados para sessões ssh ou telnet.

user2720323
fonte
6
echo Hello > /dev/pts/1... Veja o que acontece, é o seu terminal.
Sepahrad Salour
5
Veja também Como funciona um terminal Linux?
Gilles 'SO- stop be evil'
11
O @SepahradSalour deve adaptar o número de pontos ao seu contexto. meu sshd usou / dev / pts / 30 para minha sessão.
Gab是好人
2
@Gab是好人Para obter a localização do seu terminal atual, você pode usar o comando tty.
JeromeJ

Respostas:

110

Nada é armazenado /dev/pts. Este sistema de arquivos vive puramente na memória.

As entradas /dev/ptssão pseudo-terminais (pty para abreviar). Os kernels Unix têm uma noção genérica de terminais . Um terminal fornece uma maneira para os aplicativos exibirem saída e receberem entrada através de um dispositivo terminal . Um processo pode ter um terminal de controle - para um aplicativo em modo texto, é assim que ele interage com o usuário.

Os terminais podem ser terminais de hardware ("tty", abreviação de "teletype") ou pseudo-terminais ("pty"). Os terminais de hardware estão conectados através de alguma interface, como uma porta serial ( ttyS0,…) ou USB ( ttyUSB0,…) ou através de uma tela e teclado do PC ( tty1,…). Os pseudo-terminais são fornecidos por um emulador de terminal, que é um aplicativo. Alguns tipos de pseudo-terminais são:

  • Aplicativos de interface gráfica do usuário, como xterm, gnome-terminal, konsole, ... transformam eventos do teclado e do mouse em entrada de texto e exibem a saída gráfica em alguma fonte.
  • Aplicativos multiplexadores, como entrada e saída de retransmissão de tela e tmux de e para outro terminal, para desacoplar aplicativos de modo texto do terminal real.
  • Aplicativos shell remotos, como sshd, telnetd, rlogind, ... retransmitem entrada e saída entre um terminal remoto no cliente e um pty no servidor.

Se um programa abrir um terminal para gravação, a saída desse programa aparecerá no terminal. É comum ter vários programas emitindo para um terminal ao mesmo tempo, embora isso possa ser confuso às vezes, pois não há como saber qual parte da saída veio de qual programa. Os processos em segundo plano que tentam gravar em seu terminal de controle podem ser automaticamente suspensos por um sinal SIGTTOU .

Se um programa abre um terminal para leitura, a entrada do usuário é passada para esse programa. Se vários programas estiverem lendo do mesmo terminal, cada caractere será roteado independentemente para um dos programas; isso não é recomendado. Normalmente, há apenas um único programa lendo ativamente do terminal em um determinado momento; programas que tentam ler do terminal de controle enquanto não estão em primeiro plano são automaticamente suspensos por um sinal SIGTTIN .

Para experimentar, execute ttyum terminal para ver qual é o dispositivo do terminal. Vamos dizer que é /dev/pts/42. Em um shell em outro terminal, execute echo hello >/dev/pts/42: a string helloserá exibida no outro terminal. Agora execute cat /dev/pts/42e digite o outro terminal. Para eliminar esse catcomando (o que tornará o outro terminal difícil de usar), pressione Ctrl+ C.

Gravar em outro terminal é ocasionalmente útil para exibir uma notificação; por exemplo, o writecomando faz isso. A leitura de outro terminal normalmente não é feita.

Gilles 'SO- parar de ser mau'
fonte
Ou estou entendendo mal o que você está tentando dizer ou suas informações estão desativadas. Processos em background gravados no terminal não resultarão em um SIGTTIN. Nem vários programas podem ler do terminal ao mesmo tempo (sua declaração de que "cada caractere é roteado independentemente"). Somente um programa pode ler do terminal a qualquer momento, e uma tentativa de um programa em segundo plano de ler nesse terminal resultará em um SIGTTIN. Esse é o único caso em que o SIGTTIN é enviado automaticamente.
Patrick
Também não é possível ler de outro terminal. Fazer isso seria uma vulnerabilidade de segurança significativa, pois você seria capaz de interceptar dados. Você pode straceler a entrada do programa, mas é isso.
Patrick
4
Os processos @Patrick Background que gravam no terminal recebem o SIGTTOU, que foi um erro de digitação. Vários programas podem ler do terminal ao mesmo tempo (experimente e veja, da maneira que descrevo no próximo parágrafo; você deve fazê-lo a partir de um processo cujo terminal de controle não seja esse terminal). Sim, você pode ler de outro terminal, desde que ele pertença a você - por que você acha que isso seria impossível?
Gilles 'SO- stop be evil'
Os processos em segundo plano que gravam no terminal somente obtêm SIGTTOU se o tostopsinalizador tty estiver definido. Este sinalizador não está definido por padrão. E eu estou corrigido na leitura do anoter TTY. Eu tentei e funciona, mas é por leitura, não por caractere (quando sentado em um prompt de shell, eles são iguais aos shells que lêem 1 caractere por vez). Talvez seja bom esclarecer esse ponto, pois é assim que interpretei sua resposta.
Patrick
2
@ Patrick Claro, uma readchamada retornará apenas caracteres consecutivos (ou melhor, bytes, devo dizer), mas o aplicativo não tem controle sobre quantos bytes uma readchamada retornará, por isso não é melhor.
Gilles 'SO- stop be evil'
18

Os arquivos /dev/ptssão "pseudo-ttys". Eles são como pipes nomeados até certo ponto, mas também imitam terminais de conexão serial antigos, como o VT-100s. Os pseudo-ttys fazem o trabalho de transferir bytes do teclado para o programa e do programa para o dispositivo de saída, o que parece simples. Mas isso responde à sua pergunta explicita: o kernel não armazena nada, /dev/pts/0por exemplo. Somente fluxos de bytes do stdout de um programa conectado à pseudo-tty entram e programas cujo stdin está conectado à mesma pseudo-tty lê esses bytes.

Os pseudo-ttys também colocam uma camada de indireção nesses fluxos de bytes. O kernel pode inspecionar bytes para valores especiais como "Control-C" ou "Control-D" ou "Control-U" (que são todos configuráveis, consulte man stty) e enviar um SIGINT, definir final de arquivo em stdin ou apagar uma linha na entrada. Também há uma função de buffer em algum lugar, então meu "nada armazena" está um pouco errado, mas apenas em alguns kilobytes.

O kernel pode inspecionar valores de bytes na saída e fazer coisas como transformar uma nova linha (avanço de linha ASCII, LF ou "\n") em dois bytes, retorno de carro e avanço de linha (CRLF ou "\r\n"), ou quaisquer bytes que um hardware de terminal serial exigir. A indireção de uma pseudo-tty permite a independência do hardware.

Os pseudo-ttys também permitem todas as ioctl()chamadas "taxa de transmissão definida", "paridade de conjunto" e assim por diante , e provavelmente não fazem nada com elas. Isso permite que os programas que foram gravados no dia dos VT-100s, ADM-3 e Wyse, o que quer que seja, continuem funcionando sem erros. Software, o driver de dispositivo pseudo-ttys, atua como hardware.

Pseudo-ttys podem ser usados ​​por sshde telnet, mas também são usados ​​entre um emulador de terminal (como xtermou rxvt) e o shell que normalmente é executado dentro do xterm.

O Linux e muitos Unixes têm pseudo-ttys. O plano 9 não. Os pseudo-ttys são uma relíquia que sobrou dos dias dos terminais de hardware conectados por cabo serial.

Bruce Ediger
fonte
13

/dev/é um diretório especial para arquivos de dispositivos. Essas são abstrações, não são arquivos reais no disco. O diretório é preenchido na inicialização e sujeito a alterações para refletir as interfaces de dispositivos existentes, que são criadas e destruídas pelo kernel e um daemon do espaço do usuário udevd.

Muitos dos dispositivos assim representados são virtuais. Isso inclui as entradas /dev/pts, que são dispositivos de console. É por isso que um é criado para sessões remotas; eles também são criados quando você abre um terminal da GUI local.

Você pode abri-los como arquivos, embora não tenha muito valor de uso. Para obter o /dev/ptsnó em que seu shell está conectado, use tty:

> tty
/dev/pts/4

Agora mude para outro console e tente:

> echo "duck!" > /dev/pts/4

Esperto. Agora tente:

> cat /dev/pts/4

Em seguida, tente usar o shell em / dev / pts / 4. Você fica preso até sair do catoutro lado, mas a maioria do que você digita em pts / 4 passa (por exemplo, tentando "olá mundo", acabei hlem pts / 4 e ello wordno catconsole).

Meu palpite aqui é que o dispositivo está recebendo informações do shell e produzindo-as através do sistema, que é como as coisas acabam na tela - o shell não está lidando com hardware, o sistema está. Tente strace bash(e dê uma olhada man stracese você não sabe o que é); você recebe uma enxurrada preliminar de chamadas quando o bash é iniciado. Agora comece a pressionar as teclas:

read(0, "h", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "e", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "y", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0

Para cada letra digitada, há uma leitura da entrada padrão e uma gravação na saída padrão. Mas a que padrão o shell está conectado? Agora tente straceno seu terminal da GUI - você terá que descobrir o nome se não o souber, por exemplo, no KDE konsole, e o GNOME tem o gnome-terminal, eu acredito. A saída disso straceé provavelmente mais enigmática - a minha tem muitas poll()e recvfrom(). Não vejo gravações, mas se você usar o cattruque de outro terminal, notará que, quando digitar, os pressionamentos de tecla que são lidos por cat não causam nenhuma resposta na saída do strace - o terminal não está ' t os recebendo. Portanto, o aplicativo de terminal da GUI e o gato estão competindo para ler a partir do mesmo dispositivo, no qual o shell está enviando.

Cachinhos Dourados
fonte
qual é o uso de 'cat / dev / pts / 4' quando estamos presos e por que estamos atrapalhando enquanto executamos este comando.
user2720323
Adicionei alguns parágrafos para tentar explicar isso.
Goldilocks