Saya telah memperbarui beberapa profil default untuk bash, dan melihat dari tutorial saya mengikuti bahwa saya bisa memuat ulang profil baru dengan pengaturan lingkungan baru dengan menggunakan:
source /etc/bash.bashrc
Satu-satunya adalah - variabel lingkungan baru hanya tersedia untuk pengguna saya saat ini - dan diabaikan ketika saya menggunakan sudo. Mereka hanya tersedia untuk sudo ketika saya menutup sesi terminal saya dan bergabung kembali.
Ketika saya mencoba menggunakan:
sudo source /etc/bash.bashrc
Saya mendapatkan kesalahan:
sudo: source: command not found
Apakah ada cara sederhana untuk memuat dalam pengaturan profil bash baru untuk sudo tanpa harus menutup terminal dan memulai kembali?
- Awalnya, saya menggunakan beberapa script pemasang yang mereferensikan variabel. Saya menemukan bahwa sementara mereka dapat mengakses variabel ketika saya memanggil skrip secara langsung (meskipun, ini akan menyebabkan masalah kemudian dengan membuat direktori karena saya perlu menjadi root), memanggil skrip instal menggunakan sudo tidak akan.
Saya membuktikan ini dengan menguji dengan perintah sederhana ini:
echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE
Yang pertama akan menghasilkan nilai variabel, tetapi yang kedua tidak akan menghasilkan apa pun.
sumber
Jawaban:
Masalahnya adalah itu
source
adalah perintah built-in bash (bukan program - sukals
ataugrep
). Saya pikir salah satu pendekatan adalah login sebagai root dan kemudian jalankan perintah source.sumber
source
shell builtin.sudo su
adalah semacam cara aneh untuk mengatakannya - lebih baik hanya mengatakansudo -s
yang merupakan cara sudo sendiri untuk mengatakan "mulai shell sebagai pengguna ini." Versi satu baris Anda tidak akan berfungsi karena masing-masing perintah di dalamnya dijalankan oleh shell pengguna utama dalam subproses terpisah.su
memulai shell baru dan "sumber" dijalankan hanya setelah berakhir. Contoh pertama hanya berfungsi jika baris kedua digunakan di dalam shell root.sudo -s
tidak lebih baik darisudo su
. Bagaimanapun juga tidak akan berpengaruh apa pun.sudo -s
memiliki efek yang sama memulai shell, tetapi bagi saya tampaknya tidak cocok untuk menumpuk dua "menjadi pengguna lain" perintah ketika seseorang akan melakukannya.Masalahnya bukan itu
source
adalah perintah shell builtin. Fakta bahwa itu adalah apa yang sebenarnya melemparkan Andacommand not found
kesalahan, tetapi itu tidak berarti itu akan berhasil jika itu terjadi.Masalah sebenarnya adalah bagaimana variabel lingkungan bekerja. Dan mereka bekerja seperti ini: setiap kali proses baru dimulai, jika tidak ada yang terjadi, ia mewarisi lingkungan induknya. Karena ini, menggunakan subkulit (misalnya mengetik
bash
di dalam contoh bash) dan melihat output darienv
harus memberikan hasil yang sama dari induknya.Namun, karena cara
sudo
kerjanya (seperti yang dinyatakan dalam halaman manualnya), sudo mencoba untuk menghapus lingkungan pengguna dan membuat lingkungan "default" untuk pengguna yang menggantikan, sehingga perintah yang dijalankan dijalankan seolah-olah pengguna yang memintanya memiliki menjadi pengguna panggilan (yang merupakan perilaku yang diharapkan), dan dengan demikian menjalankan nautilus sebagaimanasudo nautilus
seharusnya membuka folder di/root
folder, dan tidak/home/yourusername
.Begitu:
Melakukan sesuatu seperti
sudo source script.sh
dan kemudiansudo command
, bahkan jika itu berhasil, itu tidak akan berhasil mengatur variabel apa pun untuk nantisudo command
.Untuk meneruskan variabel lingkungan, Anda dapat memberi tahu sudo untuk melestarikan lingkungan (melalui
-E
sakelar; dan memiliki izin yang sesuai dalam file sudoers Anda) dan / atau mengaturnya untuk perintah sebagaisudo VAR1=VALUE1 VAR2=VALUE2 command
.sumber
Menggunakan subtitusi proses bash yang dapat Anda lakukan:
sumber
sudo
untuk mengakses profil. Di atas menyediakan sarana untuk mengimpor profil sambil menghindarisudo: source: command not found
masalah yang disebutkan.Seperti yang dikatakan Marcos , masalah utama Anda di sini adalah
source
perintah shell builtin yang hanya memengaruhi proses shell yang menjalankannya.Solusi mudahnya adalah dengan memulai shell baru sebagai root, dan bash akan secara otomatis membaca
/etc/bash.bashrc
ketika dimulai. Itu sesederhana hanya mengatakansumber
Menutup dan membuka kembali terminal tidak boleh mengubah keadaan. Secara default, sudo menghapus lingkungan. Untuk menonaktifkannya, tambahkan -E ke sudo.
sumber
Kesalahan terjadi karena biner yang Anda coba panggil dari baris perintah hanya bagian dari variabel PATH pengguna saat ini, tetapi bukan bagian dari PATH pengguna root.
Anda dapat memverifikasi ini dengan menemukan path biner yang Anda coba akses. Dalam kasus saya, saya mencoba memanggil "bettercap-ng". Jadi saya berlari,
Saya memeriksa apakah lokasi ini adalah bagian dari PATH pengguna root saya.
Jadi sudo tidak dapat menemukan biner yang saya coba panggil dari commandline. Oleh karena itu mengembalikan perintah kesalahan yang tidak ditemukan.
Anda dapat mengarahkan sudo untuk menggunakan PATH pengguna saat ini saat memanggil biner seperti di bawah ini.
Bahkan, seseorang dapat membuat alias dari situ:
Dimungkinkan juga untuk menamai alias itu sendiri sudo, menggantikan sudo aslinya.
sumber