Existe alguma maneira de controlar qual pseudoterminal (/dev/pts/*) uma conexão é fornecida? Por exemplo, tenho vários thin clients, cada um executando sessões de terminal individuais em um servidor RHEL por SSH. Gostaria de configurar algo para que o thin client A seja sempre alocado /dev/pts/7 e o thin client B seja sempre /dev/pts /8. Tenho tentado criar uma regra do udev, mas o udevinfo só retorna "não foi possível obter o dispositivo de classe" quando o executo no ID do terminal. Não tenho certeza de como criar uma regra se o dispositivo não estiver realmente classificado no udev .
Responder1
O Linux normalmente usa a interface pseudoterminal Unix 98. As entradas /dev/pts
são atribuídas fora do controle do aplicativo. É aberta uma aplicação que deseja criar um pseudoterminal (aqui o servidor SSH) /dev/ptmx
, que aloca um pseudoterminal e retorna um descritor de arquivo para ele. O número do pseudoterminal (o número após /dev/pts/
) determinado quando o pseudoterminal é alocado; está vinculado ao índice do pseudoterminal em uma estrutura de dados do kernel.
(Se você estiver curioso, o código do kernel éptmx_open
emdrivers/tty/pty.c
, que convocadevpts_new_index
emfs/devpts/inode.c
, que utilizaida_get_new
emlib/idr.c
. Isso retorna o primeiro número disponível, embora não haja garantia de que sempre o fará.)
Nem a API C nem a API do kernel permitem que o criador do pseudoterminal passe um parâmetro que possa influenciar o resultado.
Pode ser possível obter um pty estático usando a API BSD legada que produz ptys no formato (mestre) e (escravo). Isso exigiria, no mínimo, a recompilação do servidor SSH sem a configuração para forçá-lo a usar ptys no estilo BSD. Você precisaria cuidar das permissões, mas se o SSH for o único usuário, poderá ser um pouco mais fácil. Então você precisaria corrigir o OpenSSH para adicionar algum mecanismo para vincular um número específico a um cliente específico./dev/ptyNUM
/dev/ttyNUM
HAVE_DEV_PTMX
Eu recomendo fortemente isso: é uma configuração fora do padrão, exigindo que você escreva algum código extra. É um esforço extra de manutenção e um risco à segurança.
De qualquer forma, não vejo sentido. Você pode executar last
para ver qual cliente está conectado em cada terminal.