Estou trabalhando nas perguntas do Unix The Textbook (capítulo 8, # 16, página 207) :
Forneça
chmod
linhas de comando que executem as mesmas tarefas que os comandosmesg n
emesg y
. (Dica: todo dispositivo de hardware, incluindo o seu terminal, tem um arquivo associado no/dev
diretório.)
Eu acredito que a resposta é:
mesg n
= chmod 770 /dev/stdout
mesg y
= chmod 777 /dev/stdout
Mas eu queria saber o que acontece se você usar chmod 000 /dev/stdin
?
Você fica impedido de digitar comandos no terminal?
mesg n
pode usar permissões para afetar os futuroswrite
somente porquewrite
ainda não possui o terminal aberto.Respostas:
Não,
/dev/stdin
e/dev/stdout
é o dispositivo errado. Estes não são dispositivos terminais, são alias para entrada e saída padrão, respectivamente. Entrada padrão e saída padrão são, por definição, descritores de arquivo que os aplicativos esperam que sejam abertos e tenham um significado convencional (descritor de arquivo 0 e 1 respectivamente, há também 2 que são erro padrão). Dispositivos como/dev/stdin
e/dev/stdout
são úteis quando um aplicativo requer um nome de arquivo, mas o usuário do aplicativo deseja que ele acesse um descritor de arquivo específico, em vez de abrir algum arquivo. Dependendo da variante unix, eles podem até não ser arquivos de dispositivo; por exemplo, no Linux, eles são links simbólicos para/proc/self/fd/0
e amigos, e esses são, por sua vez, links simbólicos "mágicos" para qualquer arquivo que o processo já tenha aberto no descritor de arquivo.Alterar as permissões de
/dev/stdin
e/dev/stdout
só mudaria o que acontece quando esses nomes de arquivo são usados explicitamente. Isso não afeta nada relacionado ao terminal e não afeta o uso normal de entrada e saída padrão, pois as permissões são importantes apenas ao abrir um nome de arquivo específico.O que
mesg
faz é alterar as permissões do terminal de controle do processo . Para um aplicativo que está sendo executado em um terminal, o terminal é aberto na entrada padrão, na saída padrão e no erro padrão (descritores de arquivo 0, 1 e 2). Você pode usar o comandotty
para ver qual é o dispositivo terminal.mesg n
é equivalente achmod g-w "$(tty)"
emesg y
é equivalente achmod g+w "$(tty)"
.fonte
tty
não relata o terminal de controle, mas o terminal abre no stdin, se houver. Portanto, no Linux, em que / dev / stdin não é um dispositivo, mas um link simbólico especial para o arquivo aberto em / dev / stdin,chmot "$(tty)"
seria mais ou menos o mesmo quechmod /dev/stdin
(se stdin for um dispositivo tty e tentar mudar o modo denot a tty
caso contrário, um arquivo no diretório atual). Veja/dev/$(ps -o tty= -p "$$")
para o terminal de controle.