sudo -u username -s "cmd arg" mengembalikan perintah tidak ditemukan


10

Saya biasa menjalankan perintah:

sudo -u elasticsearch -s "ulimit -Hn"

dan itu mengembalikan nilai ulimit -Hn seperti yang terlihat oleh pengguna elasticsearch sampai saya mencobanya di Ubuntu 11.10. Itu dia kembali:

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

Saya mencoba beberapa perintah berbeda, dan ketika saya menggunakan argumen saya selalu mendapatkan "perintah tidak ditemukan":

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

Ada ide tentang bagaimana saya bisa menjalankan perintah yang membutuhkan argumen melalui sudo?


mengapa -s? Simpan saja shell yang normal dan gunakan untuk menjalankan perintah. Seperti sudo -u elasticsearch ls all.sh. Jika elasticsearchmemiliki shell default yang tidak dapat digunakan, gunakan -s bash sebelum perintah yang sebenarnya.
glglgl

Jawaban:


16

Anda harus menghapus tanda kutip ganda. Ia mencoba menjalankan perintah yang disebut "ulimit -Hn" sebagai perintah tunggal, spasi, dan semuanya. -sharus menjadi sudoopsi terakhir pada sudobaris perintah, dan semua argumen berikut diteruskan $SHELL -cuntuk dieksekusi.

sudo -u elasticsearch -s ulimit -Hn

Saya kira cara -sdiproses telah berubah, karena cara saat ini memungkinkan Anda untuk melewati argumen dengan spasi ke $SHELLdengan melarikan mereka pada baris perintah:

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

Metode penanganan argumen yang lama akan membagi '/tmp/foo bar'argumen itu menjadi dua, melanggar perintah.


di mana Anda menguji bahwa itu tidak akan membagi perintah?
Zarathustra

@Zarathustra Itu lima tahun yang lalu - Saya tidak ingat sejauh itu. Saya sarankan menggali melalui sejarah kode sumber sudo - Anda harus dapat menemukan ketika perilaku berubah.
camh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.