giá trị lệnh plistbuddy từ csv, tìm kiếm và chèn


1

Tôi có một lệnh plistbuddy mà tôi cần thực thi cho 100 người dùng khác nhau.

Giá trị tôi phải nhập cho 100 người dùng cá nhân tùy thuộc vào tên máy chủ.

Tôi đã nghĩ rằng tôi có thể sử dụng một csv có danh sách tên máy chủ / tên máy tính và giá trị plist tương ứng, sau đó sử dụng tập lệnh shell để:

  1. Kiểm tra tên máy chủ của Mac
  2. Tìm tên máy chủ trong csv
  3. tìm giá trị của mã tương ứng cần thiết cho lệnh plistbuddy và lưu nó vào một biến
  4. chèn giá trị đó vào lệnh plistbuddy và thực thi, thay đổi giá trị của tệp plist mong muốn.

Các csv sẽ chỉ được định dạng là:
hostname, code
hostname1, 2001
hostname2, 2002

Cụ thể tệp plist là tệp plist ưu tiên máy in.

Đây là lệnh plistbuddy:

/usr/libexec/PlistBuddy -c "Set :2ndfloor:com.apple.print.preset.settings:ManagementCodeValue 1001" ~/Library/Preferences/com.apple.print.custompresets.forprinter.CMI2ndFloorColor.plist

Giá trị cần thay đổi tùy thuộc vào tên máy chủ là giá trị "1001" trong lệnh đó.

Đó là những yếu tố duy nhất; kiểm tra tên máy chủ, tìm nó trong csv, thực thi lệnh plistbuddy bằng mã tương ứng trong csv.

Bất cứ ai có ý tưởng tốt cho việc này? Nó sẽ tiết kiệm hàng giờ và hàng giờ làm việc GUI.

Câu trả lời:


2

Đây là một kịch bản shell ba dòng cho bash. Giả sử tệp CSV được đặt tên hosts.csv.

h=`hostname -s`
c=`sed -nE -e "/^$h, ?/s/^.+, ?//p" hosts.csv`
/usr/libexec/PlistBuddy -c "Set :2ndfloor:com.apple.print.preset.settings:ManagementCodeValue $c" ~/Library/Preferences/com.apple.print.custompresets.forprinter.CMI2ndFloorColor.plist

Kịch bản lệnh đặt các biến shell $hcho tên máy chủ và $cmã phù hợp với máy chủ lưu trữ. Lấy tên của máy chủ lưu trữ từ hostnamelệnh. Sử dụng $cthay cho giá trị "1001" trong PlistBuddylệnh.

Theo mặc định, hostnamelệnh trả về thông tin tên miền. Do đó, nếu tệp CSV có tên máy chủ không có thông tin tên miền, hãy sử dụng h=`hostname -s`, nếu không thì sử dụng h=`hostname`.

Các sedlệnh phù hợp với một dòng từ tập tin CSV mà bắt đầu với $htên máy chủ theo sau bởi một dấu phẩy và một nhân vật không gian tùy chọn. Đối với dòng phù hợp, sedloại bỏ mọi thứ trừ mã khỏi dòng.


giải thích tuyệt vời. vẫn học tất cả các cú pháp, nhưng điều này có ý nghĩa. sẽ báo cáo để cho bạn biết nếu nó hoạt động trong thực tế hay không.
dns dave

nó hoàn toàn làm việc Bây giờ, vì cuối cùng chúng tôi phải làm tất cả những điều này dựa trên người dùng hiện tại, không phải tên máy chủ lưu trữ, tôi chỉ đổi lệnh tên máy chủ bằng "/ usr / bin / who | grep console | cut -d '' -f1" và thay đổi $ h đến $ u để có thể đọc được, nó vẫn hoạt động 100%
dns dave

1
Tôi rất vui vì lời giải thích đã giúp ngay cả khi bạn cần thay đổi. @nohillside có một ý tưởng tốt để kiểm tra "mã" trong câu trả lời của anh ấy. IfTuyên bố của ông là một cải tiến quan trọng.
creidhne

một điều tôi đang gặp phải là cả giải pháp này và giải pháp dưới đây thực sự đang khiến cho tập tin plist xml bị mất hiệu lực. Managementcodevalue có loại định dạng <chuỗi> 9999 </ chuỗi> cho giá trị của nó. nhưng sau khi chạy tập lệnh, các định dạng xml là </ string> <string> 9999 và hộp thoại in sẽ báo lỗi. bất cứ ý tưởng tại sao? Nếu tôi chỉ chạy các lệnh với một số thay vì một biến thì điều này không xảy ra.
dns dave

2

Bạn có thể sử dụng awkđể xử lý tệp và tìm giá trị mã phù hợp.

code=$(awk -F , '$1 == "'$(hostname -s)'" { print $2 }' hosts.csv)
if [[ -n "$code" ]]; then
    /usr/libexec/PlistBuddy -c "Set :2ndfloor:com.apple.print.preset.settings:ManagementCodeValue $code" ~/Library/Preferences/com.apple.print.custompresets.forprinter.CMI2ndFloorColor.plist
else
    echo "No code for $(hostname -s)"
fi

Phần awktìm kiếm dòng có giá trị đầu tiên bằng tên máy chủ và in giá trị thứ hai của dòng đó. Vì có thể không có kết quả khớp, if ...phần đảm bảo PlistBuddychỉ được gọi nếu tìm thấy giá trị mã.

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.