sudo: sumber: perintah tidak ditemukan

54

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.

HorusKol
sumber
Bagaimana Anda mencoba menggunakan variabel dari sudo? Harap dicatat bahwa jika Anda menggunakan "perintah sudo $ variabel" itu akan menggantikan variabel dari shell Anda, bukan dari lingkungan sudo.
João Pinto

Jawaban:

72

Masalahnya adalah itu sourceadalah perintah built-in bash (bukan program - suka lsatau grep). Saya pikir salah satu pendekatan adalah login sebagai root dan kemudian jalankan perintah source.

sudo -s
source /etc/bash.bashrc
Marcos Roriz Junior
sumber
3
Anda benar bahwa masalahnya adalah sourceshell builtin. sudo suadalah semacam cara aneh untuk mengatakannya - lebih baik hanya mengatakan sudo -syang 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.
poolie
1
Baik. Ditambah BASH membaca / etc / bashrc pada saat login. Jadi Anda sebaiknya menggunakan 'su' dengan -, -l, atau --login untuk mendapatkan lingkungan dari pengguna itu: 'sudo su -' untuk menjadi root atau 'su - $ nama pengguna' untuk menjadi pengguna lain.
Contoh "satu baris" tidak akan berfungsi karena sumemulai shell baru dan "sumber" dijalankan hanya setelah berakhir. Contoh pertama hanya berfungsi jika baris kedua digunakan di dalam shell root.
loevborg
sudo -stidak lebih baik dari sudo su. Bagaimanapun juga tidak akan berpengaruh apa pun.
loevborg
1
sudo -smemiliki efek yang sama memulai shell, tetapi bagi saya tampaknya tidak cocok untuk menumpuk dua "menjadi pengguna lain" perintah ketika seseorang akan melakukannya.
poolie
14

Masalahnya bukan itu sourceadalah perintah shell builtin. Fakta bahwa itu adalah apa yang sebenarnya melemparkan Anda command not foundkesalahan, 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 bashdi dalam contoh bash) dan melihat output dari envharus memberikan hasil yang sama dari induknya.

Namun, karena cara sudokerjanya (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 sebagaimana sudo nautilusseharusnya membuka folder di /rootfolder, dan tidak /home/yourusername.

Begitu:

Melakukan sesuatu seperti sudo source script.shdan kemudian sudo command, bahkan jika itu berhasil, itu tidak akan berhasil mengatur variabel apa pun untuk nanti sudo command.

Untuk meneruskan variabel lingkungan, Anda dapat memberi tahu sudo untuk melestarikan lingkungan (melalui -Esakelar; dan memiliki izin yang sesuai dalam file sudoers Anda) dan / atau mengaturnya untuk perintah sebagai sudo VAR1=VALUE1 VAR2=VALUE2 command.

ssice
sumber
4

Menggunakan subtitusi proses bash yang dapat Anda lakukan:

source <(sudo cat /etc/bash.bashrc)
TomDotTom
sumber
1
Bagaimana ini membantu memulai shell root dengan pengaturan baru, yang ingin dilakukan OP?
muru
1
OP sebenarnya bertanya bagaimana "... memuat ulang profil baru ..." dari shell yang perlu digunakan sudountuk mengakses profil. Di atas menyediakan sarana untuk mengimpor profil sambil menghindari sudo: source: command not foundmasalah yang disebutkan.
TomDotTom
"Satu-satunya adalah - variabel lingkungan baru hanya tersedia untuk pengguna saya saat ini - dan diabaikan ketika saya menggunakan sudo."
muru
3

Seperti yang dikatakan Marcos , masalah utama Anda di sini adalah sourceperintah 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.bashrcketika dimulai. Itu sesederhana hanya mengatakan

sudo bash
poolie
sumber
2

Menutup dan membuka kembali terminal tidak boleh mengubah keadaan. Secara default, sudo menghapus lingkungan. Untuk menonaktifkannya, tambahkan -E ke sudo.

psusi
sumber
2

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,

$ which bettercap-ng
/home/user/work/bin/bettercap`

Saya memeriksa apakah lokasi ini adalah bagian dari PATH pengguna root saya.

$ sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

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.

sudo -E env "PATH=$PATH" [command] [arguments]

Bahkan, seseorang dapat membuat alias dari situ:

alias mysudo='sudo -E env "PATH=$PATH"'

Dimungkinkan juga untuk menamai alias itu sendiri sudo, menggantikan sudo aslinya.

Platypus Anonim
sumber