Làm cách nào để chạy tập lệnh khi ổ đĩa flash cụ thể được gắn?


46

Có cách nào để chạy tập lệnh khi thiết bị USB cụ thể được gắn không?

Tôi giữ các video của mình trên một USB riêng biệt và muốn chạy một tập lệnh sẽ gắn thư mục video trên thiết bị USB vào một trong thư mục nhà.

Câu trả lời:


31

Có nhiều giải pháp đẹp hơn với systemd . Bạn tạo một dịch vụ phụ thuộc và được bạn muốn phương tiện truyền thông, ví dụ:/etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/home/you/bin/triggerScript.sh

[Install]
WantedBy=media-YourMediaLabel.mount

Sau đó, bạn phải bắt đầu / kích hoạt dịch vụ:
sudo systemctl start your.service
sudo systemctl enable your.service

Sau khi mount, systemd kích hoạt tập lệnh kích hoạt của bạn. Ưu điểm so với quy tắc udev là tập lệnh thực sự kích hoạt sau khi mount chứ không phải sau khi thêm thiết bị hệ thống.

Trường hợp sử dụng : Tôi có một phân vùng được mã hóa mà tôi muốn sao lưu tự động. Sau khi thêm thiết bị tôi phải nhập mật khẩu. Nếu tôi nối tập lệnh sao lưu vào udev, tập lệnh sẽ cố chạy vào thời điểm tôi đang nhập mật khẩu, sẽ thất bại.

Tài nguyên: Viết kịch bản với udev

Lưu ý: Bạn có thể tìm thấy đơn vị thiết bị của mình với:systemctl list-units -t mount


Tôi hy vọng tháng 4 năm 2016 sẽ đến sớm. Ubuntu LTS tiếp theo sẽ được kích hoạt systemd. AFAIK giải pháp tốt đẹp từ trên cần Ubuntu 15.04 trở lên.
guettli

Ồ, tôi nghĩ systemd đã có trong Ubuntu. Tôi thực sự đang chạy debian kéo dài ;-)
sumid 4/11/2015

@sumid Nếu tôi muốn đặt nó dưới ~ / .config / systemd, nó có hoạt động không?
Khurshid Alam

4
Tuyệt quá! Đã thử nghiệm trong Debian Jessie. Đừng quên kích hoạt dịch vụ của bạn systemctl enable your.service. Các tập tin kịch bản phải được thực thi.
Corni

1
Đối với tôi, điều này thất bại. Khi tôi cố gắng bắt đầu dịch vụ, nó sẽ phàn nàn với "Đơn vị phương tiện-bb.mount không tìm thấy." Tôi đã gọi "bb" của ổ đĩa ngón tay cái của tôi là "bb" để đảm bảo không có ký tự lạ nào trong đó và nó không quá dài hoặc bất cứ thứ gì như thế này. Tôi đã cố gắng Requires=, After=WantedBy=dòng cả với media-bb.mountmedia-BB.mountvì Nautilus show cho tôi những khối lượng là "BB", không phải "bb". Thông báo lỗi tương tự, ngoại trừ viết hoa. Chuyện gì vậy? Tôi bằng cách nào đó phải tạo ra media-<something>.mountdịch vụ đó ?
UTF-8

29

Bắt đầu bằng cách tìm thiết bị của bạn trong lsusb. Lưu ý ID (ví dụ 0a81:0101)

Tạo một tệp quy tắc udev mới /etc/udev/rules.d/thông qua sudoedit /etc/udev/rules.d/100-mount-videos.rulesvà thực hiện một quy tắc mới trong đó như sau:

ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"

Lưu ý cách tôi sử dụng ID từ lsusb.

Sau đó, bạn chỉ cần viết kịch bản để thực hiện công việc. Một lệnh mount đơn giản sẽ hoạt động. Bạn có thể cần một sleep 5lệnh trong đó để chờ hệ thống tập tin khởi tạo (nếu bạn rời khỏi gnome để thực hiện việc gắn kết chính - nhưng bạn có thể tự do gắn kết nó trước và sau đó bạn có thể không cần ngủ).

Bổ sung từ Allan: Các tập lệnh chạy dài có thể chặn "tất cả các sự kiện tiếp theo cho thiết bị này hoặc thiết bị phụ thuộc". Trang người đàn ông Mint của tôi nói thêm "Các nhiệm vụ chạy dài cần phải được tách ra ngay lập tức khỏi quá trình sự kiện." Không có mẹo nào được đưa ra về nơi để đạt được kỹ năng để làm điều này.

Trả lời từ Oli: Gói nó như vậy: https://askubfox.com/a/106359/449


4
Tôi có thể đề xuất tiền tố lệnh "RUN" với "su your_user -c" để tập lệnh không chạy với quyền root.
Kees Cook

3
@Kees Vì mục đích ở đây là gắn kết, giữ quyền riêng tư gốc có thể là một ý tưởng tốt mặc dù. Có lẽ thay vì giữ tập lệnh trong nhà của người dùng, bạn giữ nó trong /root/hoặc ở nơi chỉ có root mới có thể chỉnh sửa tập lệnh.
Oli

2
Điều này không trả lời câu hỏi. Câu hỏi hỏi làm thế nào để chạy tập lệnh khi ổ USB được gắn . Câu trả lời này cho biết làm thế nào để chạy tập lệnh gắn ổ USB khi nó được cắm . Sự khác biệt quan trọng với tôi vì tôi có một kịch bản như vậy (đối với máy ảnh kỹ thuật số); không có tập lệnh, ổ đĩa có thể hoặc có thể được gắn vào phần chèn (tùy thuộc vào cài đặt của người dùng) và chỉ khi ổ đĩa được gắn mà tôi muốn làm gì đó (sao chép hình ảnh). Vì vậy, tập lệnh của tôi (chạy khi ổ đĩa được thêm vào) thường chạy không đúng lúc.
Rebier Post


đây là một cách cực kỳ cụ thể (dễ vỡ) để đạt được. @sumid trả lời áp dụng nhiều hơn cho các distro hiện đại bằng systemd
MrMesees

8

Một cách khác để nhận các giá trị cho ATTRS {idVendor} và ATTRS {id SẢNt} (đã thử nghiệm trong Ubuntu 12.04) là:

  1. Tìm nơi USB của bạn được gắn kết:

    $ mount | grep /dev/sd*
    

    Điều này cho thấy một cái gì đó như sau:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. Sử dụng udevadm để lấy thông tin thiết bị đó:

    udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
    

    đầu ra phải giống như:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. Bây giờ sử dụng id mô hình cho ATTRS {id SẢNt} và id nhà cung cấp cho ATTRS {idVendor}

    ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
    

1

Trong Nautilus trong Chỉnh sửa> Tùy chọn> Phương tiện, bạn có thể chọn "hành động khác" và thay vì "lệnh costum". cho các loại phương tiện truyền thông khác nhau được thực hiện. Vào thời điểm đó, ổ đĩa USB đã được gắn, nhưng tôi cho rằng bạn vẫn có thể liên kết nó (với lệnh costum) với thư mục mà bạn muốn ổ đĩa xuất hiện. Tôi không thể biết điều này dễ hơn hay tốt hơn sử dụng udev.


lệnh có mặc trang phục không? hoặc một trang phục?
erjoalgo

1

Nếu bạn không muốn can thiệp vào bộ điều khiển filemanager của bạn (nautilus, konquerer, gnome, v.v.) về việc gắn và ngắt kết nối thiết bị của bạn, tôi khuyên bạn không nên đi theo con đường udev.

Thay vào đó, hãy sử dụng keo dán udisks nếu hệ thống của bạn sử dụng udisks (hầu như tất cả đều được).

Sau khi cài đặt, chỉ cần tạo một tập tin cấu hình ~/.udisks-glue.conftrong thư mục chính của bạn như thế này.

Ví dụ sau đây của tôi cập nhật dữ liệu Hỗ trợ GPS trên máy ảnh của tôi mỗi khi tôi cắm thẻ SD.

filter BT16EXTREME {
  optical = false
  partition_table = false
  usage = filesystem
  label = BT16EXTREME
}
match BT16EXTREME {
  post_mount_command = "/home/bernhard/update-gps-assist-data.pl %mount_point"
}

Sau đó, chỉ cần đảm bảo udisks-keo bắt đầu khi bạn khởi động hoặc đăng nhập. Tức là thông qua các ứng dụng khởi động của gnome


1
Không hỗ trợ udev2 :-(
sumid


0

Câu trả lời của @ sumid có vấn đề. Bạn không nên bắt đầu dịch vụ. Bạn chỉ cần kích hoạt nó.

tập tin: /etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/any_path_even_inside_the_mount_point/script.sh

[Install]
WantedBy=media-YourMediaLabel.mount

Sau đó kích hoạt dịch vụ:

sudo systemctl enable your.service

Đó là tất cả.

Lưu ý: Bạn có thể tìm thấy nhãn trung gian của mình với:sudo systemctl list-units -t mount

Lưu ý2: Nếu dịch vụ bị lỗi bằng cách nào đó (ví dụ: tập lệnh không thể thực thi được), điểm gắn kết của bạn sẽ thay đổi sang <old_mount_point_name>1lần tiếp theo bạn gắn thiết bị usb. Để khắc phục sự cố này, bạn chỉ cần thực thisudo systemctl reset-failed

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.