Permissions

在沒有 sudo 權限的腳本中處理 USB 驅動器讀/寫操作

  • June 5, 2019

我正在開發一個應用程序,它在某些時候需要寫入 USB 驅動器單元。該應用程序以非超級使用者權限執行,我認為在驅動器上寫入的最佳方法是在插入驅動器後立即使用刷新選項安裝它,這樣,理論上我不需要使用以下 udev 規則執行任何解除安裝操作:

ACTION="add", KERNEL="sd*[0-9]", SUBSYSTEMS="usb", RUN+="/bin/sh mymountscript.sh '%E{DEVNAME}'"

掛載腳本嘗試以這種方式呼叫命令:

mount -o --flush $1 /media/my-user/my-usb-unit

但我得到這個安裝錯誤

mount: wrong fs type, bad option, bad superblock on /dev/sdb1,
      missing codepage or helper program, or other error

對此感到好奇的是,只有在嘗試通過 udev 規則安裝它時才會出現此錯誤,如果我呼叫mymountscript.sh自己,則該單元會正確安裝在該點上。

除了這個問題的解決方案之外,我想知道這樣做是否有風險(我理解這是因為我沒有在寫入文件後解除安裝驅動器)。如果我採用另一種方​​式,我需要應用程序腳本(代表使用者執行)才能自己掛載/解除安裝單元。為此,我需要在插入設備名稱時將其保存在某處,並授予應用程序安裝權限。

作業系統是 Xubuntu 16.04。

我的解決方法是這樣管理它:

  1. USB 插入操作的一個 udev 規則。
  2. 同時進來的腳本本​​身掛載/解除安裝驅動器。
  3. USB 移除操作的一個 udev 規則。

USB 被插入

我執行一個腳本,它只是將設備名稱保存到一個文件中。我可以在此規則中附加任何其他腳本:

ACTION=”add”, KERNEL=”sd*[0-9]*”, SUBSYSTEMS=”usb”,  RUN+=”/bin/sh my-usb-inserted.sh”,  RUN+=”/bin/sh myownscript.sh” 

在這裡,myownscript.sh將使用pmount安裝設備,它允許標準使用者安裝/解除安裝可移動驅動器。我可以在這些之後呼叫任何其他腳本,只要我在下一個使用它之前在每個腳本中解除安裝該單元。

USB 被移除

在這裡,一個簡單的腳本刪除了由 創建的文件my-usb-inserted.sh,因此我們知道腳本中沒有插入任何快閃記憶體單元。

ACTION=”remove”, KERNEL=”sd*[0-9]*”, SUBSYSTEMS=”usb”,  RUN+=”/bin/sh usb-removed.sh” 

此解決方法沒有考慮必須處理多個 USB 驅動器的事實。

也可以看看:

引用自:https://unix.stackexchange.com/questions/522563