Eu estou trabalhando na criação de um conjunto de regras do udev que grava em um arquivo de log cada vez que uma determinada unidade USB é inserida. Meu conjunto de regras, armazenado em /etc/udev/rules.d /99-log-USB-drive.rules
, contém atualmente o seguinte:
# Skip if not the expected USB drive
ENV{ID_FS_UUID}!="SOMEUUID", GOTO="end"
# Try different ways of interacting with the file system
ACTION=="add", RUN+="/usr/bin/touch /home/myusername/udevtest.txt"
ACTION=="add", RUN+="/bin/chmod 664 /home/myusername/udevtest.txt"
ACTION=="add", RUN+="/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt"
ACTION=="add", RUN+="/bin/echo 2 >> /home/myusername/udevtest.txt"
# Exit
LABEL="end"
Os comandos touch e chmod funcionam como esperado, mas quando tento gravar no arquivo, não recebo nada. Ativando a depuração para o udev usando
udevadm control --log-priority=debug
processa a seguinte saída em /var/log/syslog
:
Dec 3 18:00:49 Hostname systemd-udevd[9629]: starting '/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt'
Dec 3 18:00:49 Hostname systemd-udevd[9612]: '/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt'(out) '1 | /usr/bin/tee /home/myusername/udevtest.txt'
Dec 3 18:00:49 Hostname systemd-udevd[9612]: Process '/bin/echo 1 | /usr/bin/tee /home/myusername/udevtest.txt' succeeded.
Dec 3 18:00:49 Hostname systemd-udevd[9630]: starting '/bin/echo 2 >> /home/myusername/udevtest.txt'
Dec 3 18:00:49 Hostname systemd-udevd[9612]: '/bin/echo 2 >> /home/myusername/udevtest.txt'(out) '2 >> /home/myusername/udevtest.txt'
Dec 3 18:00:49 Hostname systemd-udevd[9612]: Process '/bin/echo 2 >> /home/myusername/udevtest.txt' succeeded.
após a inserção da unidade USB. Portanto, os comandos são bem-sucedidos, mas a saída não é gravada no arquivo por algum motivo que não consigo ver. Esta questão indica que escrever para arquivos deve funcionar.
Termo aditivo
Um dos requisitos para este projeto é que eu seja capaz de escrever asteriscos ( *
) no arquivo. Usando as informações da excelente resposta de @Kamil Maciorowski, posso escrever no arquivo, mas não consigo impedir que o shell expanda o asterisco.
ACTION=="add", RUN+="/bin/sh -c 'echo * >> /home/myusername/udevtest.txt'"
grava uma listagem do conteúdo da pasta raiz no arquivo após a inserção da unidade USB.
ACTION=="add", RUN+="/bin/sh -c 'echo "*" >> /home/myusername/udevtest.txt'"
não grava nada no arquivo e processa a seguinte saída em /var/log/syslog
:
Jan 1 12:26:45 Hostname systemd-udevd[12359]: starting '/bin/sh -c 'echo '
Jan 1 12:26:45 Hostname systemd-udevd[12346]: '/bin/sh -c 'echo '(out) ''
Jan 1 12:26:45 Hostname systemd-udevd[12346]: Process '/bin/sh -c 'echo ' succeeded.
enquanto
ACTION=="add", RUN+="/bin/sh -c 'echo '*' >> /home/myusername/udevtest.txt'"
também escreve nada no arquivo e processa a seguinte saída em /var/log/syslog
:
Jan 1 12:30:48 Hostname systemd-udevd[12477]: starting '/bin/sh -c 'echo '*' >> /home/myusername/udevtest.txt''
Jan 1 12:30:48 Hostname systemd-udevd[12464]: '/bin/sh -c 'echo '*' >> /home/myusername/udevtest.txt''(out) ''
Jan 1 12:30:48 Hostname systemd-udevd[12464]: Process '/bin/sh -c 'echo '*' >> /home/myusername/udevtest.txt'' succeeded.
fonte
sh
Regras gerais se aplicam no script. Previne citando único shell englobamento, então isso deve ecoar um asterisco literal:echo '*'
. Redirecione para um arquivo como você deseja.Quando o udevd começa a rodar, o rootfs ainda é montado com opções de somente leitura. Então você não pode mudar nada para um arquivo com a chave de execução do udev.
Aqui estão os processos de inicialização. init -> monte o sistema de arquivos virtual do kernel (etc / run /) -> udev executando -> mount all (/ etc / fstab)
fonte
Respondendo o adendo da minha própria pergunta: Escapando o asterisco funciona.
escreve um asterisco no arquivo.
fonte