perintah tidak ditemukan saat menggunakan sudo

53

Ada beberapa pertanyaan di situs yang tampaknya terkait dengan masalah saya, tetapi saya tidak dapat menemukan solusi di dalamnya.

Sistem operasi saya adalah Ubuntu 12.04. Saya telah mvnmenginstal /tools/noarch/apache-maven-3.1.1dan saya telah menambahkan baris berikut di akhir saya /etc/profile:

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

Setelah itu saya eksekusi source /etc/profile.

Sekarang masalah saya adalah: ketika saya menjalankan mvn --versionperintah berhasil dan mvndieksekusi ditemukan, sedangkan jika saya jalankan: sudo mvn --versionsaya mendapatkan output: sudo: mvn: command not found. Saya tahu itu PATHmungkin berbeda ketika saya menjalankan perintah dengan sudodan itulah mengapa saya mencoba ini:

$>sudo echo $PATH
/tools/noarch/apache-maven-3.1.1/bin:... some other stuff ...

Hal lain yang saya coba adalah mengeksekusi sudo su -dan kemudian mengetik mvn --version. Dalam hal mvnini berhasil ditemukan dan perintah berhasil. Apa yang terjadi disini?

izomorphius
sumber

Jawaban:

38

$PATH dievaluasi oleh shell Anda, jadi cek Anda tidak berfungsi seperti yang Anda harapkan.

/etc/sudoersdikonfigurasi untuk mengganti Anda PATHdengan yang standar.

sudotidak memuat lingkungan shell login sebelum menjalankan perintah, jadi default PATHdari /etc/sudoersdigunakan. su -tidak membuka shell login, yang melibatkan memuat /etc/profile. Lihat man bash, bagian INVOKASI .

Hapus saja pengaturan PATHulang /etc/sudoers. Sepertinya aturan yang disebut secure_path.


CentOS

Di CentOS Anda dapat menambahkan PATHke Defaults env_keepbagian:

Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY PATH"
Daniel Beck
sumber
Terima kasih atas jawabannya. Itu memang memecahkan masalah, tapi saya lebih suka saran solusi di dua jawaban lain karena ia melakukan perubahan hanya untuk pakar, bukan untuk semua perintah di PATH saya.
izomorphius
FYI: Harap perhatikan pembaruan jawaban saya.
kriegaex
cara sudo menjalankan binari di direktori saat ini sudo: ./<some_binary>: command not found. Saya menggunakan Arch Linux.
Necktwi
47

Berikan sudoarus Anda PATHdengan:

sudo env "PATH=$PATH" your_command
opyate
sumber
Sebuah jawaban yang bagus, yang tidak memerlukan modifikasi pengaturan apa pun, membiarkan penelepon melakukan semua yang diperlukan. Saya akan menggunakan -Eopsi ini sebagai tambahan, untuk melestarikan lingkungan lainnya. Bahkan, ini sangat berguna sehingga dapat dimasukkan ke dalam skrip / alias / fungsi agar mudah digunakan. Saya akan menambahkan ini sebagai jawaban terpisah - tetapi pujian untuk @ copyate!
Tom
Ketika saya mencoba menjalankan perintah ini, saya mengerti env: cmd: No such file or directory- Ada ide mengapa itu terjadi?
Andy
2
@Andy ganti cmd dengan perintah Anda yang sebenarnya.
Opyate
cara sudo menjalankan binari di direktori saat ini sudo: ./<some_binary>: command not found. Saya menggunakan Arch Linux.
Necktwi
12

Menguraikan jawaban @ opyate, saya menggunakan skrip shell berikut (yang dapat dinamai mysudo, misalnya):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -Ememberitahu sudountuk melestarikan lingkungan.
  • env "PATH=$PATH"diperluas di luar sudopanggilan, membuat eksternal PATHtersedia di dalam sudojuga (ini diperlukan sebagai tambahan -Ekarena PATHbiasanya menerima perlakuan khusus selain perawatan yang diterima seluruh lingkungan).
  • "$@"meneruskan argumen yang diterima skrip kami ke sudobaris.

Simpan skrip dalam file di direktori di PATH, berikan +xizin, dan atur.

Tom
sumber
Ini adalah solusi yang jauh lebih baik bagi mereka yang tidak ingin mengedit file yang ada.
qaisjp
4

Karena jawaban saat ini agak kabur, pengaturan khusus dalam /etc/sudoersmengubah jalur Anda adalah secure_path:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Anda dapat memodifikasinya dengan sudo visudo, atau lebih baik lagi, menambahkan direktori yang Anda butuhkan:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
mikemaccana
sumber
2

Saya memiliki masalah yang sama ketika saya pertama kali menginstal Maven . Masalahnya terpecahkan setelah saya menambahkan dua baris,

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

ke empat file:

/root/.bashrc
/root/.profile

dan untuk pengguna saat ini ( mehranadalah nama pengguna Ubuntu saya):

/home/mehran/.bashrc
/home/mehran/.profile
Mehran Hatami
sumber
1

Anda harus memodifikasi variabel PATH root persis seperti yang Anda lakukan untuk diri sendiri, yaitu dengan menambahkan dua baris dalam profil sudo, yang terletak di /root/.bashrc, lalu sumber itu.

MariusMatutiae
sumber
1
Saya telah mengedit /root/.bashrc tetapi saya tidak dapat sumbernya: sudo source /root/.bashrcdapatkan: sudo: source: command not founddan tanpa sudoizin saya mendapatkan ditolak (seperti yang diharapkan). Saya percaya memulai terminal baru secara teori harus melakukan hal yang sama seperti sumber, tetapi setelah memulai terminal baru, sudo mvn --versionmasih tidak menemukan apa pun.
izomorphius
@izomorphius Anda tidak dapat menggunakan sumber sudo. Anda harus terlebih dahulu beralih ke sudo dengan perintah sudo su , maka Anda dapat sumber file yang dimaksud. Tidak ada cara lain untuk melakukannya.
MariusMatutiae