Điểm:0

Lỗi gần mã thông báo không mong muốn `(' nhưng sau đó quyền bị từ chối

lá cờ in

Tôi đang cố chạy plugin nagios này:

sudo /usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "SLAB=$$(cat /proc/meminfo | egrep "Slab:" | awk '{print $$2;}'); MEMTOTAL =$$(cat /proc/meminfo | egrep "MemTotal:" | awk '{print $2;}'); awk "BEGIN {print 100*$$SLAB/$$MEMTOTAL}"" -w '>50' - c'>80' -p "slab_mem"

Nó cho thấy lỗi này:

sh: -c: dòng 0: lỗi cú pháp gần mã thông báo không mong muốn `('
sh: -c: dòng 0: `SLAB=76876(cat /proc/meminfo | egrep "Slab:" | awk '{print 768762;}'); MEMTOTAL=76876(cat /proc/meminfo | egrep "MemTotal:" | awk '{print ;}'); awk BEGIN 1>/var/tmp/check_generic/check_generic_stdout_77319.64001 2>/var/tmp/check_generic/check_generic_stderr_77319.23364'
slab_mem CHƯA BIẾT - kết quả:đầu ra RC1: khớp:RC!=OK |slab_mem=;50.000000;80.000000;;

Tôi thấy rằng trốn thoát () có thể làm cho nó hoạt động, nhưng không được, sau đó nó báo lỗi này:

-bash-4.1$ /usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "SLAB=$$\(cat /proc/meminfo | egrep "Slab:" | awk '{print $$2; }'\); MEMTOTAL=$$\(cat /proc/meminfo | egrep "MemTotal:" | awk '{print $2;}'\); awk "BEGIN {print 100*$$SLAB/$$MEMTOTAL}" " -w '>50' -c '>80' -p "slab_mem"
sh: /proc/meminfo: Quyền bị từ chối
awk: {in 749962;})
awk: ^ lỗi cú pháp
sh: /proc/meminfo: Quyền bị từ chối
awk: {in;})
awk: ^ lỗi cú pháp

Thông tin duy nhất tôi tìm thấy khi cố đọc /proc/meminfo là do một số người đã cố thực thi nó (thay vì đọc bằng con mèo) Nhưng đây không phải là trường hợp.

CHỈNH SỬA: Cố gắng trốn thoát $$: Chỉ huy:

-bash-4.1$ /usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "SLAB=\$\$\(cat /proc/meminfo | egrep "Slab:" | awk '(in $ $2'\) MEMTOTAL=\$\$\(cat /proc/meminfo | egrep "MemTotal:" | awk '{print $2;}'\); awk "BEGIN {print 100*\$\$SLAB/\$ \$MEMTOTAL}"" -w '>50' -c '>80' -p "slab_mem"

Kết quả:

sh: /proc/meminfo: Quyền bị từ chối
awk: {in;})
awk: ^ lỗi cú pháp
awk: (in 499542)
awk: ^ lỗi cú pháp
awk: cmd. dòng:1: (in 499542)
awk: cmd.dòng:1: ^ dòng mới bất ngờ hoặc cuối chuỗi
slab_mem CHƯA BIẾT - kết quả:đầu ra RC1: khớp:RC!=OK [awk: cmd. dòng:1: Khối BEGIN phải có phần hành động]|slab_mem=;50.000000;80.000000;;
Bodo avatar
lá cờ pt
Giả sử bạn muốn chuyển một ký tự `$` theo nghĩa đen cho một số trình bao khác và muốn ngăn chặn sự mở rộng của trình bao cục bộ, bạn cần `\$` thay vì `$$`. `$$` là PID của tập lệnh hiện tại. Xem https://unix.stackexchange.com/q/291570/330217
lá cờ cn
`SLAB=76876(cat /proc/meminfo | ...` -- Tôi không chắc bạn đang cố làm gì ở đó. Bạn có thể giải thích đoạn mã cụ thể này không? Tôi đoán được, nhưng tôi muốn bạn giải thích giải thích trước khi tôi trả lời.
pLumo avatar
lá cờ in
Tôi đoán nó phải là `SLAB=76876$(cat ...)`. Bạn đang thiếu `$`.
aldegalan avatar
lá cờ in
@Bodo Nhưng \$ không hoạt động với tác nhân từ xa Nagios... phải là $$
Bodo avatar
lá cờ pt
@aldegalan Sau đó, bạn có thể cần `\$\$`.
aldegalan avatar
lá cờ in
@Bodo ok, nhưng vẫn bị từ chối cấp quyền awk: `{print 499542;}) awk: ^ lỗi cú pháp sh: /proc/meminfo: Quyền bị từ chối awk: {in;}) awk: ^ lỗi cú pháp`
Bodo avatar
lá cờ pt
@aldegalan Như bạn có thể thấy trong `{print 499542;})`, bạn gặp vấn đề về trích dẫn tương tự trong lệnh AWK. Trong `$$2`, `$$` được thay thế bằng PID của tập lệnh bằng trình bao cục bộ, theo sau là ký tự `2`.(Tôi không biết plugin nagios hoặc check_generic, vì vậy tôi không biết liệu điều này có cần trích dẫn bổ sung hoặc sao chép các ký tự `$` hay không.) Lỗi `Quyền bị từ chối` có thể là kết quả của các cách trích dẫn sai khác. Vui lòng [chỉnh sửa] câu hỏi của bạn và thêm tất cả các phiên bản đã sửa đổi của tập lệnh/lệnh của bạn cùng với thông báo lỗi. Sử dụng sao chép và dán thay vì nhập lại để tránh gây ra các lỗi không liên quan.
aldegalan avatar
lá cờ in
@Bodo Xong, tôi đã chỉnh sửa câu hỏi của mình
Bodo avatar
lá cờ pt
@aldegalan Dường như có vấn đề với các trích dẫn. Nếu tôi hiểu đúng, bạn thử sử dụng dấu ngoặc kép bên trong dấu ngoặc kép. Bạn có thể thêm liên kết vào một số tài liệu giải thích các đối số cho `-e` và trích dẫn cần thiết không? Tôi không tìm thấy bất kỳ liên kết nào đang hoạt động cho plugin `check_generic`. Bạn có thể giải thích danh sách lệnh `SLAB=...` bao gồm tất cả các lệnh `awk` phải làm gì không? Hoặc danh sách lệnh này đến từ đâu? Vui lòng [chỉnh sửa] câu hỏi của bạn để cung cấp thông tin này.
Bodo avatar
lá cờ pt
Nó sẽ giúp hiển thị danh sách lệnh khi bạn chạy nó trực tiếp trong trình bao mà không sử dụng nagios và một số ví dụ đầu vào (= đầu ra của `cat /proc/meminfo`) và đầu ra tương ứng. Tôi có hiểu đúng là bạn muốn trích xuất hai số từ `/proc/meminfo` và để tính Slab/MemTotal theo % không? Điều này có thể được thực hiện với một lệnh `awk` duy nhất. Thông tin về những gì bạn muốn đạt được sẽ thuộc về câu hỏi. (Câu hỏi của bạn có vẻ là về lập trình shell và không liên quan cụ thể đến Ubuntu, vì vậy nó có thể phù hợp hơn trên stackoverflow.com.)
Điểm:0
lá cờ cn
SLAB=76876(cat /proc/meminfo | egrep "Slab:" | awk '{print 768762;}')

Shell phân tích cú pháp đó thành những từ này

SLAB="76876(cat" /proc/meminfo | egrep "Slab:" | awk '{print 768762;}')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^..................... ..................^

Trong đó các ký tự "(cat" là một phần của giá trị cho biến môi trường tạm thời SLAB.

Sau đó, trình bao đang cố gọi /proc/meminfo dưới dạng chỉ huy.

Điều đó để lại một dấu ngoặc đơn đóng không ghép nối gây ra lỗi cú pháp awk


Tôi không rõ mục đích của phiến =$$(con mèo ...) Là. Bạn đang cố gắng đặt biến SLAB để giữ một giá trị nối pid và kết quả của mã được đặt trong ngoặc đơn?


Giải pháp của tôi: Tôi sẽ xây dựng nagios -e lệnh thành từng mảnh:

nagios_cmd=""
cho var trong Slab MemTotal; làm
    nagios_cmd+=$(printf '%s="${$}$(awk '\''/%s:/ {print $2}'\'' /proc/meminfo)"; ' $var $var)
xong

nagios_cmd+='awk -v s="$Slab" -v m="$MemTotal" '\''BEGIN {in 100*s/m}'\'

khai báo -p nagios_cmd

kết quả này

khai báo -- nagios_cmd="Slab=\"\${\$}\$(awk '/Slab:/ {print \$2}' /proc/meminfo)\"; MemTotal=\"\${\$}\ $(awk '/MemTotal:/ {print \$2}' /proc/meminfo)\"; awk -v s=\"\$Slab\" -v m=\"\$MemTotal\" 'BEGIN {print 100*s /m}'"

cho bạn thấy lớp vỏ sẽ bảo vệ tất cả các ký tự cần bảo vệ.

Sau đó, bạn gọi kiểm tra nagios như:

/usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "$nagios_cmd" -w '>50' -c '>80' -p "slab_mem"
# .................................................. .........^^^^^^^^^^^^^

Điều đó có thể được viết dưới dạng một lệnh awk mà không cần các biến shell tạm thời:

nagios_cmd='awk -F":" -v pid="$$" '\''
    $1 == "Sàn" {s = pid $2}
    $1 == "MemTotal" {m = pid $2}
    KẾT THÚC {in 100*s/m}
'\'' /proc/meminfo'

Hoặc, để giúp giải quyết vấn đề trích dẫn, một tài liệu ở đây:

nagios_cmd=$(mèo <<'END_CMD'
    awk -F":" -v pid="$$" '
        $1 == "Sàn" {s = pid $2}
        $1 == "MemTotal" {m = pid $2}
        KẾT THÚC {in 100*s/m}
    ' /proc/meminfo
END_CMD
)
aldegalan avatar
lá cờ in
Vì vậy, làm thế nào tôi có thể giải quyết nó? Và vâng, tôi đang cố gắng ghép nối pid và kết quả

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.