Mengapa “sudo -u root echo` whoami` ”tidak mengembalikan root?

11

Bagaimana Anda menggunakan sudo untuk menjalankan perintah sebagai pengguna root yang sebenarnya di Ubuntu? Saya awalnya berpikir ini adalah perilaku default sudo, sampai saya berlari:

myuser@localhost:~$ sudo echo `whoami`
myuser

myuser@localhost:~$ sudo -u root echo `whoami`
myuser

Namun, ini adalah tipe perilaku yang saya inginkan, tetapi hanya dalam satu baris:

myuser@localhost:~$ sudo su -
root@localhost:~# echo `whoami`
root
Cerin
sumber
11
mengapa gema whoami? Katakan saja sudo whoami .. mengembalikan root
Neo

Jawaban:

26

Bahkan tidak menjalankannya sebagai root. Tetapi, apa yang terjadi pada Anda adalah bahwa tick kembali sedang dievaluasi sebelum sudo dijalankan, karena mereka diperlukan untuk mengevaluasi perintah. Lebih langsung, mengapa tidak hanya ini:

sudo whoami

Anda whoamikembali kutu sebenarnya dievaluasi dalam subkulit sebagai pengguna saat ini, itulah sebabnya mengapa Anda melihat apa yang Anda lakukan.

Kesalahan fatal
sumber
2
Ini salah. sudo berjalan dengan hak akses root tetapi tidak sebagai root.
Manfred Moser
@ Moser, Lalu mengapa perintahnya mencetak "root"?
Cerin
4
@ManfredMoser: Ini berjalan dengan UID dari 0(nol), yang merupakan apa yang orang sebut "root". (Anda akan benar jika sudohanya memperluas kemampuannya tanpa benar-benar mengubah UID. Tapi bukan itu yang dilakukannya.)
user1686
1
M. Moser mungkin telah membuat poin tentang set-UID hanya mengubah ID pengguna yang efektif dari proses, mengharuskan proses itu sendiri kemudian pergi tentang mengubah ID pengguna yang sebenarnya, seperti yang sudodilakukan. Tetapi dari membaca jawaban xyr, sepertinya ini tidak benar-benar terjadi.
JdeBP
7

Subshell ( whoami) dijalankan pertama kali, seperti Anda, dan hasilnya ( myuser) ditempatkan ke dalam sudoperintah; apa yang sudodilihat adalah echo myuser. Anggap saja sebagai jalan pintas untuk:

tmpvar=`whoami`
sudo echo "$tmpvar"
Kevin
sumber
1

Tampaknya ada beberapa dugaan yang terjadi di sini ...

Backticks jelas melakukan apa yang orang lain jelaskan, memperluas whoamisebelum memanggil 'sudo', dan meninggalkan backticks kembali 'root', seperti yang diharapkan.

Tetapi berguna untuk memahami apa yang sebenarnya terjadi dengan sudo (8). Jadi saya benar-benar melihat halaman manual!

"Uid dan gid yang nyata dan efektif diatur agar sesuai dengan pengguna target ..."

Jadi tampaknya perilaku yang diamati tidak ada hubungannya dengan perbedaan antara id pengguna efektif dan nyata.

Ini juga ilustratif untuk melakukan "sudo printenv" dan dibandingkan dengan hanya "printenv," yang sebenarnya sedikit mengejutkan saya. Ini menunjukkan bahwa [i] beberapa [/ i] variabel yang diekspor tersedia dan dan lainnya tidak: itu melaporkan pengguna, HOME, PATH, PS1, SHELL, TERM, dan EDITOR pengguna yang memohon, tetapi tidak yang lain seperti MANPATH, CVSROOT, LD_LIBRARY_PATH, atau ENV. Tampaknya agak aneh, karena dapat menyebabkan program berperilaku berbeda dari yang mereka lakukan baik sebagai pengguna asli, atau sebagai root.

Jan Steinman
sumber
0

sudo memungkinkan Anda untuk menjalankan perintah apa pun dengan hak akses root, tetapi tidak sebagai pengguna root. Alasan ini berguna adalah bahwa dengan pengaturan ini banyak orang dapat memiliki hak root namun semua logging dan sebagainya masih menunjukkan siapa yang melakukan perubahan.

Pengaturan ini lebih baik daripada berbagi kata sandi root. Karena itu telah diganti memiliki pengguna root di banyak distribusi termasuk Ubuntu.

sudo su di sisi lain menjadikan Anda pengguna root dan oleh karena itu sebaiknya tidak benar-benar digunakan.

Perbedaan ini juga menjelaskan perilaku Anda yang diamati (benar).

Manfred Moser
sumber
6
Tidak. Apa yang menjelaskan perilaku itu adalah masalah yang sangat sederhana tentang bagaimana penggantian perintah di shell bekerja. Sama sekali tidak ada hubungannya dengan hak istimewa.
JdeBP
-2

Sudo untuk sementara memberikan siapa Anda (mengingat Anda diizinkan untuk sudo sejak awal) hak istimewa tingkat root.

Untuk menjadi root, Anda harus masuk sebagai root yang diblokir di Ubuntu secara default.

Anda harus berhati-hati dengan ini, sudo bukan root. Jika Anda ingin menunjukkan bahwa Fred menjalankan sesuatu sebagai sudo, dan variabel lingkungan SUDO, SUDO_COMMAND mungkin yang paling berguna.

Tony Hopkinson
sumber
Root diblokir di Ubuntu? Apa kamu yakin akan hal itu? Saya tahu ini tidak disarankan, tetapi saya pikir mereka hanya membuatnya sedikit lebih sulit untuk seorang pemula dengan benar-benar mengatur kata sandi yang tidak jelas menggunakan UUID, yang dapat diubah menggunakan metode yang biasa.
Marty Fried