Bagaimana cara memasukkan direktori dengan perintah 'cd' jika memiliki 700 izin dan bukan milik saya?

87

Saya mencoba menggunakan sudo cd name_of_dirtetapi menerima pesan kesalahan:

sudo: cd: command not found

Apakah ada cara lain untuk memasukkan direktori yang dimiliki oleh pengguna lain yang memiliki 700 izin?

Bakhtiyor
sumber
2
tolong tambahkan ls -ldirektori itu sendiri.
Rinzwind
7
Dan tolong jelaskan mengapa Anda terus meninggalkan komentar negatif terhadap jawaban yang valid di sini. Jika Anda berpikir ada (atau seharusnya) cara yang lebih baik, beri tahu kami apa itu.
Oli
1
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dirTampaknya menjadi satu-satunya jawaban yang akan membuat Anda senang.
Marco Ceppi
3
Jawaban yang diberikan di sini benar, tetapi Anda memilihnya dan mengatakan itu salah. Jangan hanya mengabaikan apa yang dikatakan karena sesuatu yang telah Anda lihat.
Richard Holloway
3
Itu lucu ... dia ingin sudo cdbekerja, tetapi dia memilih solusi menggunakan sudo atau su. Dia mengatakan dia tidak ingin bekerja sebagai root, tetapi dia masih ingin mengakses secara langsung dia tidak punya. Kedengarannya seperti troll bagi saya ...
MestreLion

Jawaban:

111

sudo cdtidak akan bekerja karena cdperintah dibangun ke dalam shell. Jadi yang Anda katakan menjadi root dan kemudian jalankan perintah ini. Anda menjadi root dan kemudian perintah setelah sudo dicari tetapi tidak ada cdperintah untuk menemukan.

Metode yang digunakan adalah beralih ke pengguna yang memiliki direktori. Izin 700dimaksudkan sebagai "pemilik dapat membaca, menulis, dan mengeksekusi".

Jadi jika root memiliki direktori sudo -i, kata sandi dan cd {dir}satu-satunya metode yang benar. Jika orang lain memiliki direktori Anda masih dapat menggunakan metode 1 tetapi juga dapat mengubah ke pengguna itu su {username}dan kemudian menggunakan cdsebagai pengguna itu.

Rinzwind
sumber
Pertanyaan sampingan: apakah root dapat memasukkan dir 700 bahkan jika dia bukan pemilik?
MestreLion
3
ya MestreLion, 700 tidak akan menghentikan root dari menghibur. Izin '000' akan menghentikan pengguna memasukkan dirinya sendiri (ya, pengguna dapat membuat direktori yang tidak dapat ia masukkan ...) tetapi root masih bisa memasukkan yang itu.
Rinzwind
1
gema adalah perintah built-in shell, mengapa saya bisa menjalankan "sudo echo" tetapi tidak "sudo cd"?
shoujs
Maaf, aturan yang sama berlaku untuk sudo echo: Anda perlu sesuatu seperti echo 'deb {text}' | sudo tee --append {file}menggunakan gema dengan sudo dan mengubah file.
Rinzwind
1
Mengapa tidak cddibangun ke dalam perintah yang tersedia untuk sudo?
Aaron Franke
44

sudo -i

untuk membuka "root console" lalu

cd /path/to/directory

( cdAdalah perintah shell builtin, jadi itu tidak bisa menjadi target sudo)

Vojtech Trefny
sumber
19

Untuk membuka direktori root, kita dapat menjalankan shell root, misalnya:

sudo su
# cd /root
Takkat
sumber
3
Saya tidak ingin bekerja sebagai root. TIDAK PERNAH!!! Dan juga para ahli merekomendasikan untuk tidak pernah login sebagai root. -1
Bakhtiyor
8
Yah itulah tepatnya mengapa Anda tidak ingin izin untuk membuka direktori root, bukan?
Takkat
10
Tidak ada salahnya masuk ke mode root. Para ahli akan selalu merekomendasikan untuk masuk ke root ketika itu dibutuhkan.
Rinzwind
2
Jika Anda bekerja dengan hal-hal yang dimiliki oleh root, kadang-kadang sudo suing (atau metode lain) adalah satu-satunya metode praktis atau bahkan mungkin. "Pakar" hanya memberitahu Anda untuk tidak menggunakan root sebagai kebiasaan - tidak apa-apa saat Anda benar-benar membutuhkannya. Dan @ Vojtech, tidak ada yang mustahil ...
Oli
2
@ Bakhtiyor: bekerja sepanjang waktu sebagai root memang tidak disarankan. Tetapi mengeluarkannya untuk satu (atau beberapa) perintah dapat diterima. Khususnya jika Anda mencoba memasuki direktori yang tidak diizinkan oleh pengguna Anda . Jadi Anda harus menjadi pemilik atau root.
MestreLion
10

Seperti yang orang lain tunjukkan - itu adalah built-in shell:

~ % which cd
cd: shell built-in command

Jadi, mengapa Anda tidak sudo shell itu sendiri?

~ % sudo $SHELL -c "cd name_of_dir"
Daniel Bauke
sumber
5
+1 untuk ide sudo bash -c ... dan saran: hindari menggunakan which. Ini hanya sebuah skrip, dan tidak akan menangani semua kemungkinan (biner, builtin, alias, dll). Gunakan typesebagai gantinya. Jauh lebih aman, kuat, dan portabel. Dan type -puntuk jalur yang dapat dieksekusi.
MestreLion
1
Yah, tergantung ;-) type [ -wfpams ] name ... Equivalent to whence -v., which [ -wpams ] name ... Equivalent to whence -c.(man zshbuiltins)
Daniel Bauke
1
Itu tidak tergantung. whenceis zsh-only ... tidak berfungsi di bash, bahkan tidak diinstal secara default di ubuntu. Sementara typeadalah POSIX , yang berarti ia akan bekerja di setiap modern yang shell ... bash, csh, ksh .. dan bahkan zsh.
MestreLion
Tentu, itu dan itu sebabnya saya membenarkan komentar Anda tepat ketika itu muncul, tetapi apa yang saya katakan adalah bahwa di zsh sebenarnya itu bukan skrip dan memberikan hasil yang sama typekarena keduanya alias untuk perintah yang sama.
Daniel Bauke
Oh, aku mengerti sekarang. Nah, tapi thats di zsh. Di bash, yang merupakan shell terminal default (dan biasanya hanya) di Ubuntu, whichbukan builtin ... jadi type(atau type -p) lebih disukai.
MestreLion
4

Anda juga dapat meningkatkan diri Anda untuk me-root pengguna dengan:

sudo -s

Kemudian Anda dapat melakukan cd ke direktori mana pun yang tidak mengizinkan pengguna normal seperti:

cd /root

Atau

cd /var/lib/

Kemudian setelah selesai di sana ketik:

exit

Untuk keluar dari hak pengguna root.

Untuk meninggikan diri Anda sebagai root, Anda juga dapat menggabungkan dua perintah oleh &&operator seperti di bawah ini, operator ini juga mempertahankan urutan eksekusi mereka, jika perintah saat ini dijalankan dengan sukses dan hanya kemudian perintah berikutnya diizinkan untuk menjalankan:

sudo -s && cd /var/lib

Atau

sudo -s && cd /root
Vicky Dev
sumber
2

Jika Anda benar-benar ingin membuat pekerjaan, Anda dapat menentukan fungsi shell yang disebut yang menjalankan shell root baru ketika menjalankan cara itu, dan hanya menjalankan perintah biasa jika tidak.sudo cd directorybashsudosudo

Seperti yang disajikan dalam jawaban lain, sebagian besar pengguna tidak ingin repot melakukan itu, tetapi sebaliknya ingin:

  1. Jalankan sudo -s, atau sudo -ijika Anda ingin shell login (ingat bahwa salah satu efeknya sudo -iadalah untuk memulai Anda di direktori home root), atau sudo bashjika Anda ingin memaksa bashatau dapat meneruskan opsi ke shell.
  2. Jalankan di shell baru.cd directory
  3. Lakukan tindakan apa pun (lainnya) yang perlu diambil sebagai root di shell baru.
  4. Setelah selesai, jalankan exituntuk meninggalkan shell baru. Penting untuk tidak melupakan ini, karena Anda tidak ingin melakukan lebih banyak tindakan sebagai root daripada yang Anda inginkan!

Jadi, jika Anda mau, maka Anda dapat menulis fungsi shell (atau skrip) yang melakukan dua tindakan pertama saat sudodiikuti oleh cd, dan hanya berjalan secara sudonormal jika tidak. Tolong jangan gunakan ini sebagai alternatif untuk belajar mengapa sudo cd tidak berhasil , karena jika Anda tidak mengerti apa yang sedang terjadi, maka Anda mungkin akan sangat bingung dengan berada di shell baru (dan Anda mungkin tidak mengerti pesan kesalahan apa pun) itu terjadi).

Inilah salah satu cara untuk menulis fungsi shell seperti itu, yang juga mengingatkan Anda bahwa Anda berada di shell baru dan bahwa Anda harus exitkeluar darinya ketika Anda selesai. (Pengingat Itu mungkin akan berguna bagi pengguna dari setiap tingkat keterampilan, karena salah satu umumnya tidak terbiasa berada di shell baru ketika salah satu berjalan sudotanpa -s, -iatau nama shell yang sebenarnya sebagai argumen.)

# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
    if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
        sudo bash -c '
                if cd -- "$2"; then # When cd fails, its own message is enough.
                    printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
                    printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
                    exec bash # Replace this bash shell with an interactive one.
                fi
            ' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
    else
        command sudo "$@"
    fi
}

Anda bisa memasukkan ini ke dalam Anda ~/.bashrc, meskipun ini adalah cara yang cukup aneh untuk digunakan sudosehingga Anda mungkin hanya ingin mengaktifkannya sesekali. Dalam hal ini, lebih baik untuk meletakkannya di file sendiri. Jika Anda membuat file yang disebut sudo.bashdi direktori home Anda dengan konten-konten itu, maka Anda dapat membuat sudofungsi tersedia - sehingga itu akan berjalan alih-alih sudoperintah biasa - dengan menjalankan . ~/sudo.bash. Itu berlaku di shell saat ini dan shell anaknya, tetapi tidak yang lain. Untuk alasan yang sama bahwa file seperti .bashrctidak dapat dieksekusi, jangan tandai sudo.bashdieksekusi dengan chmod. Ini benar-benar perpustakaan, bukan skrip shell mandiri. Jika Anda melakukannyajalankan sebagai skrip shell, itu akan mendefinisikan fungsi ... tetapi hanya di shell yang menjalankan skrip, bukan untuk Anda sebagai penelepon. (Tentu saja, Anda dapat menulis skrip untuk ini, itu tidak terjadi karena pendekatan yang saya ambil di sini.)

Untuk memeriksa dan melihat apakah sudosaat ini didefinisikan sebagai fungsi shell, dan untuk melihat definisi saat ini jika itu adalah salah satu, jalankan type sudo. Untuk menonaktifkan (mis. Undefine) fungsi setelah ditetapkan, jalankan unset -f sudo. Untuk secara manual menjalankan sudoperintah reguler secara langsung bahkan jika fungsi shell didefinisikan, jalankan command sudo. Namun, perhatikan bahwa Anda tidak harus melakukan itu, karena sudofungsi ini sebenarnya melakukan itu sendiri setiap kali ada lebih atau kurang dari dua argumen yang diteruskan ke sana atau argumen pertama yang diteruskan ke sana adalah apa pun kecuali cd. Itu sebabnya Anda masih bisa menggunakannya dengan cara yang biasa digunakan orang sudo.

Perhatikan juga bahwa fungsi shell yang ditunjukkan di atas masih memungkinkan Anda meneruskan argumen lain sudo, tetapi itu akan mencegahnya memperlakukan cdsecara khusus . Menjalankan khususnya tidak didukung, meskipun Anda dapat memperluas fungsi shell untuk mendukung kasing itu. Tidak juga . Shell yang dibuatnya mirip dengan apa yang Anda dapatkan . Kode tidak benar-benar berjalan , tetapi menggunakan , sehingga opsi berfungsi dengan baik. Ini benar-benar berjalan dua kali ketika Anda lulus dan argumen direktori untuk itu (dan nol kali sebaliknya). Saat Anda menjalankan , pertama itu memotong shell bash terpisah dari yang Anda menjalankan fungsi dan mengubah direktori. Jika itu berhasil, itu menggantikansudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo bash shell dengan yang baru dan interaktif yang bisa Anda gunakan.

Berikut adalah contoh bagaimana shell berfungsi secara otomatis "melakukan hal yang benar." Perhatikan bahwa sudo ls -A /rootberperilaku normal. Hanya ketika saya kemudian mencoba untuk cdke direktori dengan sudoshell baru dibuat, dan saya diingatkan secara eksplisit tentang apa yang terjadi.

ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude      .bashrc  .config  .emacs.d  .nano     .rpmdb
.bash_history  .cache   .dbus    .local    .profile
ek@Io:~$ sudo -k  # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$

Jika Anda mencoba ke sudo cddirektori yang tidak dapat Anda ubah bahkan sebagai root, maka Anda hanya akan mendapatkan pesan kesalahan:

ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$

Saya telah menggunakan sudo -kdi antara doa dalam contoh di atas untuk menunjukkan bahwa itu mengotentikasi Anda sebagai root sebelum mencoba mengubah direktori. Tetapi Anda sebenarnya tidak harus lari sudo -ksendiri. Karena fungsi shell hanyalah pembungkus tipis untuk sudoperintah sebenarnya , caching kredensial Anda dan sudoperilaku umum lainnya masih berfungsi secara normal.

Meskipun itu bekerja dengan baik dan agak rapi, saya akui bahwa membayangi sudoperintah sebenarnya dengan fungsi dengan nama yang sama adalah super aneh. Sebagian besar pengguna mungkin akan hanya ingin melakukan langkah-langkah sudo -s, sendiri. Tetapi kalau-kalau ada yang menginginkan ini - dan juga untuk menunjukkan bahwa itu mungkin - itu dia.cd directory

Eliah Kagan
sumber
0

Sejauh ke suatau tidak untuk suberdebat, saya pikir itu konyol. subertentangan dengan agama Ubuntu dan itu bukan sesuatu yang dilakukan dengan sembarangan. Sungguh menakjubkan apa yang rm -rf *bisa dilakukan jika Anda root. Tetapi, jika Anda merasa nyaman dengan antarmuka baris perintah (CLI) dan memiliki tugas-tugas tingkat sistem untuk dilakukan, tidak ada alasan untuk tidak menggunakannya su. Saya telah menggunakan beberapa distro di mana tidak ada yang menyebutkan menggunakan sudo. Ini hanya masalah pekerjaan apa yang Anda lakukan dan metode apa yang paling nyaman bagi Anda. Saya menggunakan keduanya.

Joe
sumber
1
"Dalam versi bash dan sudosaya miliki dengan kubuntu jernih, sudo cdsekarang berfungsi - tanpa ada solusi." Singkatnya, seperti itu , yang saya sangat yakin belum pernah di Ubuntu secara default, saya tidak mengerti caranya. (Juga, saya telah menggunakan 10,04; itu tidak melakukan itu.) Sudah bertahun-tahun sejak Anda memposting ini, tetapi apakah Anda ingat detailnya? Apakah sudo cdmasih bekerja untukmu? Apa output dari type -a sudosebuah shell di mana ia bekerja? Saya mengerti Anda mungkin tidak tahu - dan bagian kedua dari jawaban Anda tetap relevan - tetapi jika Anda melakukannya, Anda dapat mengeditnya .
Eliah Kagan
@EliahKagan Sudah pasti tidak berfungsi untuk saya sekarang di 16.10 dan saya tidak ingat apa yang saya lakukan saat itu. Merupakan pelanggaran terhadap agama saya untuk memodifikasi perintah dasar yang ada, jadi tidak mungkin saya melakukan itu. Bagaimanapun, bahkan jika itu berhasil, semua orang akan menyebutnya kebiasaan buruk karena itu tidak akan berhasil secara umum.
Joe