sudo -u tên người dùng -s chín cmd arg Trả về lệnh không tìm thấy


10

Tôi đã sử dụng để thực hiện lệnh:

sudo -u elasticsearch -s "ulimit -Hn"

và nó đã trả về giá trị của ulimit -Hn như người dùng đã tìm thấy cho đến khi tôi dùng thử trên Ubuntu 11.10. Nó trả lại:

/bin/bash: ulimit -Hn: command not found

Tôi đã thử một vài lệnh khác nhau và khi tôi sử dụng một đối số, tôi luôn nhận được "lệnh không tìm thấy":

$ sudo -u elasticsearch -s "ls all.sh"
/bin/bash: ls all.sh: command not found

Bất kỳ ý tưởng về làm thế nào tôi có thể thực hiện một lệnh yêu cầu đối số thông qua sudo?


tại sao -s? Chỉ cần giữ shell bình thường và sử dụng nó để thực hiện các lệnh. Chẳng hạn như sudo -u elasticsearch ls all.sh. Nếu elasticsearchcó shell mặc định không sử dụng được, hãy sử dụng -s bash trước lệnh thực tế.
glglgl

Câu trả lời:


16

Bạn cần loại bỏ dấu ngoặc kép. Nó đang cố chạy một lệnh gọi là "ulimit -Hn" dưới dạng một lệnh duy nhất, khoảng trắng và tất cả. -scần phải là sudotùy chọn cuối cùng trên sudodòng lệnh và tất cả các đối số sau đây được truyền $SHELL -cđể thực thi.

sudo -u elasticsearch -s ulimit -Hn

Tôi đoán cách -sxử lý đã thay đổi, vì cách hiện tại cho phép bạn chuyển các đối số có khoảng trắng sang $SHELLbằng cách thoát chúng trên dòng lệnh:

$ touch '/tmp/foo bar'
$ sudo -s rm '/tmp/foo bar'

Phương thức xử lý đối số cũ sẽ chia '/tmp/foo bar'đối số đó thành hai, phá vỡ lệnh.


Nơi mà bạn đã kiểm tra rằng nó sẽ không phân chia lệnh?
Zarathustra

@Zarathustra Đó là năm năm trước - Tôi không thể nhớ lại cho đến nay. Tôi khuyên bạn nên tìm hiểu lịch sử mã nguồn sudo - bạn sẽ có thể tìm thấy khi hành vi thay đổi.
camh
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.