Pertanyaan Mengapa pekerjaan `sudo cd / var / named` tidak berfungsi? [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

aku ingin cd ke /var/named tetapi memberi saya izin ditolak kesalahan, dan ketika saya ingin menggunakan sudo untuk melakukan ini saya tidak diizinkan. Apa alasan teknis untuk ini, dan apakah mungkin untuk melakukan ini dengan cara lain?


148
2018-05-06 19:02


asal




Jawaban:


Alasan Anda tidak bisa melakukan ini adalah sederhana dan dua kali lipat

1

cd bukan sebuah program tetapi sebuah perintah yang dibangun dan sudo hanya berlaku untuk program.

sudo foo berarti menjalankan program foo sebagai root

sudo cd /path kembali

sudo: cd: command not found

karena cd bukan sebuah program.

2

Jika memungkinkan untuk digunakan sudo untuk cd ke direktori yang dilindungi kemudian setelah menjalankan perintah sudo cd /var/named Anda akan berada di direktori itu sebagai pengguna normal tetapi pengguna normal tidak diizinkan berada di direktori itu.

Ini tidak mungkin.

Solusi:

Kamu dapat memakai sudo -i untuk meningkatkan diri Anda menjadi pengguna super. Sebagai contoh:

sudo -i
cd /var/named 

Anda sekarang logon sebagai root dan dapat menggunakan perintah apa pun yang Anda inginkan. Saat selesai mengetik exit dan Anda kembali untuk masuk sebagai pengguna biasa.


206
2018-05-06 19:30



Secara teknis cd adalah sebuah perintah bawaan dan eksternal. unix.stackexchange.com/questions/50058/… - kojiro
@kojiro Ubuntu tidak; setidaknya dalam instalasi yang bersih; memiliki /usr/bin/cd hanya yang dibangun - Warren Hill
Mengenai poin 2: Jika Anda sudo -i (atau sudo su) kemudian cd /var/named lalu su normaluser... Bisakah Anda melakukan itu? - Alvin Wong
@AlvinWong Mengapa tidak mencobanya dan mencari tahu? Baru diuji jika Anda sudo -i kemudian cd ke direktori yang seharusnya tidak ada di su normal_user kemudian pwd menunjukkan Anda berada di direktori yang dilindungi tetapi ls tidak bekerja ls: cannot open directory.: permission denied - Warren Hill
Solusi bekerja. - Nino Škopac


Itu karena cd bukan dieksekusi, itu adalah fungsi shell untuk mengubah direktori.

Jika Anda menjalankan:

type cd

Anda akan mendapatkan:

cd adalah fungsi shell

Kamu dapat memakai sudo -s untuk membuka shell interaktif dan kemudian cd untuk ke direktori yang Anda inginkan:

sudo -s
cd /var/named

Untuk kembali ke shell normal Anda cukup tekan Ctrl+D.


25
2018-05-06 19:29





Ini juga perlu diingat bahwa, cdstatusnya sebagai shell builtin atau eksternal biner meskipun, sudo bekerja dengan memunculkan proses baru untuk menjalankan perintah yang ditentukan.

Mengapa ini penting? Karena aliran eksekusi dasar sudo menjadi sesuatu yang sangat mirip dengan ini:

  1. Shell memunculkan subprocess untuk menjalankan sudo dengan parameter yang diberikan
  2. sudo mengotentikasi pengguna dan menegaskan hak mereka untuk mengeksekusi perintah yang ditentukan
  3. sudo memunculkan subproses untuk mengeksekusi perintah yang ditentukan
  4. sudo menunggu subproses yang muncul di langkah 3 untuk keluar
  5. sudo keluar, kembali ke shell
  6. Subproses spawn di langkah 1 keluar, mengembalikan pengguna ke prompt shell

(Ini mungkin menjadi secara teknis sedikit salah; ada panggilan sistem yang sebenarnya menggantikan proses yang berjalan dengan yang baru (itu adalah perpustakaan C execve()). Namun, untuk tujuan penjelasan ini, keduanya setara.)

Ini menjadi penting ketika Anda menganggap bahwa direktori kerja saat ini adalah milik dari setiap proses dan itu diwarisi tetapi tidak dipromosikan. Jadi, jika proses A memunculkan proses baru B, maka proses B dimulai dengan direktori kerja yang sama yang memproses A. (Inilah sebabnya sesuatu seperti biasa ls ./melakukan apa yang Anda harapkan.) Tetapi jika proses B berubah -nya direktori kerja, maka kecuali proses A keluar dari jalannya mencari itu, A benar-benar tidak menyadari perubahan itu. (Ini, pada gilirannya, adalah mengapa jika Anda menjalankan sesuatu seperti itu find / dan batalkan setengah jalan, Anda tidak akan berakhir di beberapa lokasi yang tampak acak di sistem file hanya karena kebetulan menemukan di sana pada saat itu dibatalkan.)

Jadi, bahkan jika sudo cd /somewhere melakukan persis apa yang tertulis di kaleng, pada saat itu sudo keluar, Anda dibawa kembali ke tempat Anda mulai. Oleh karena itu secara efektif dari sudut pandang pengguna, itu menjadi tidak ada operasi. Fakta bahwa cd, ketika sedang mengeksekusi, memanggil chdir() sistem fungsi perpustakaan untuk mengatur direktori kerja baru, tidak membantu Anda, pengguna.

Sebagai Warren Hill disebutkan, solusi yang tepat (Saya sebenarnya tidak akan menyebutnya sebagai solusi) adalah untuk digunakan sudo -i yang menjatuhkan Anda ke shell root di mana Anda dapat menavigasi di sekitar filesystem dengan bebas dan menjalankan perintah apa pun yang Anda inginkan. Namun perlu dicatat bahwa ketika Anda keluar dari shell ini, Anda masih dibawa kembali ke tempat Anda memulai hierarki direktori untuk alasan yang persis sama seperti yang saya jelaskan di atas.


16
2018-05-07 07:27



Penjelasan ini bagus dan sedikit tentang Anda "Jadi bahkan jika sudo cd /somewhere melakukan persis apa yang tertulis di kaleng, pada saat itu sudo keluar, Anda dibawa kembali ke tempat Anda mulai. "sangat membantu. +1 - harperville


Semua jawaban di atas benar; inilah solusi meskipun

sudo sh -c "cd restricted-dir; some_command"

12
2017-11-07 06:00



Saya paling suka solusi ini karena Anda melakukan root stuff, lalu segera kembali ke mode non-root sehingga Anda tidak lupa dan membuat Big Mistakes. - GlenPeterson


Anda juga dapat mengubah izin sementara. jalur chmod 0775. Pastikan Anda mengembalikannya jika perlu.


3
2017-11-07 17:14



Selamat datang di Tanya Ubuntu! saya merekomendasi suntinging jawaban ini untuk mengembangkannya dengan rincian spesifik tentang cara melakukan ini. (Lihat juga Bagaimana saya menulis jawaban yang bagus? untuk saran umum tentang jenis jawaban apa yang dianggap paling berharga di AskUbuntu.) - David Foerster
Saya tidak memiliki hak untuk menjalankan shell interaktif dengan sudo, jadi ini cukup cara untuk pergi .. - Guillaume