부팅 시 Ubuntu Linux에서 USB 장치에 대한 사용자 읽기/쓰기 권한 부여

4085 단어 ubuntuusbudevlinux
나의 최근 프로젝트 중 하나는 금전 등록기가 영수증을 감열식 프린터로 인쇄하는 것과 관련된 것입니다. 이를 수행하기 위해 POST 요청을 수신하면 Sinatra 데이터를 인쇄하는 장치에서 부팅 시 실행되는 ESC/POS 서버가 있었습니다.

내가 한 방법은 다음 스크립트를 실행하는 부팅 시 자동으로 시작되는 Ubuntu에서 custom service을 만드는 것입니다.

  $ su - <NON_ROOT_USER> -l -c \
    "cd /path/to/code && \
    bundle exec ruby app.rb /dev/usb/lp0"



이 스크립트에서는 파일 경로/dev/usb/lp0를 서버에 전달합니다. 이것은 내가 인쇄하려는 열전사 프린터의 파일 설명자입니다.

이 모든 설정에서 장치의 전원을 켜고 POST 요청을 보내면 어떻게 됩니까?

안타깝게도 파일에 쓸 권한이 없다는 오류가 발생합니다/dev/usb/lp0. 하지만 다음 명령을 실행하여 이 문제를 해결할 수 있습니다.

  $ sudo chown <NON_ROOT_USER> /dev/usb/lp0



일단 입력하면 내 마음의 (그리고 종이 용량의) 내용을 인쇄할 수 있습니다! 그러나 장치가 재부팅되면 파일이 다시 생성되고 내가 할당한 권한이 없습니다. 글쎄, 젠장.

그래도 저를 도울 수 있는 솔루션을 찾았습니다!

사용자 정의 udev 규칙



데비안 시스템에서 장치를 관리하는 시스템 udev 에 대해 배웠습니다. 이를 통해 장치 인식을 위한 특정 규칙을 작성할 수 있습니다.

udev allows for rules that specify what name is given to a device, regardless of which port it is plugged into. For example, a rule to always mount a hard drive with manufacturer “iRiver” and device code “ABC” as /dev/iriver is possible. This consistent naming of devices guarantees that scripts dependent on a specific device’s existence will not be broken.



이것이 바로 나에게 필요한 것입니다! Linux 시스템에 연결된 모든 USB 장치를 NON_ROOT_USER 소유로 지정할 수 있습니다.

지침에 따라 /etc/udev/rules.d라는 디렉터리99-perm.rules에 다음 줄을 사용하여 파일을 만들었습니다.

  SUBSYSTEM=="usb", OWNER="<NON_ROOT_USER>"



이 규칙이 적용되면 시스템을 즉시 재부팅하면 작동합니다!

보안 강화



당신은 스스로에게 다음과 같이 묻고 있었을 것입니다:

Does this mean all USB devices will be owned by NON_ROOT_USER?



그리고 당신은 절대적으로 옳을 것입니다. 어쩌면 우리는 그 하나의 장치에 대해서만 권한을 부여하고 싶을 수도 있습니다. 우리는 완전히 할 수 있습니다! 장치의 일련 번호를 기반으로 할 수 있습니다. 예를 들어, 열전사 프린터의 경우 다음 명령으로 이를 찾을 수 있습니다.

  $ udevadm -a /dev/usb/lp0



다음 행을 포함한 일부 결과가 출력됩니다.

    ATTRS{serial}=="L29955839962630040"


/etc/udev/rules.d/99-perm.rules를 다시 열고 추가한 줄을 다음으로 교체합니다.

  SUBSYSTEM=="usb", ATTRS{serial}=="L29955839962630040", OWNER="<NON_ROOT_USER>"



이를 통해 우리는 이 특정 열전사 프린터를 소유하고 싶다고 구체적으로 말하고 있습니다udev. 빠른 재부팅 및 점수, 작동합니다!

무엇 향후 계획?



확고한 질문! 이 시스템이 제대로 작동하는지 확인하기 위해 우리가 할 수 있는 일이 더 많습니다.

예를 들어 장치에 여러 개의 열전사 프린터가 있는 경우 이름이 lp0라고 보장되지 않습니다. 이 경우 SYMLINK+= 속성을 사용하여 항상 확실히 가질 파일 이름을 지정할 수 있습니다. 따라서 lp0 또는 lp1 대신 내 스크립트를 thermal-printer 또는 다음과 같이 가리킬 수 있습니다.

  SUBSYSTEM=="usb", ATTRS{serial}=="L72010011070626380", OWNER="<NON_ROOT_USER>", SYMLINK+="usb/thermal-printer"



그러면 내 Ruby 서버를 가리킬 수 있는 /dev/usb/thermal-printer라는 symbolic link이 생성됩니다!
udev에 대한 규칙을 작성하는 방법에 대한 이 유용한 가이드를 제공한 Daniel Drake에게 큰 감사를 드립니다!

개선을 위한 여러분의 생각이나 아이디어를 듣고 싶습니다.

좋은 웹페이지 즐겨찾기