sudo kullanırken komut bulunamadı


52

Sitede sorunumla ilgili görünen birkaç soru var, ancak hiçbirinde bir çözüm bulamadım.

İşletim sistemim Ubuntu 12.04. Ben mvnkurdum /tools/noarch/apache-maven-3.1.1ve sonuna aşağıdaki satırları ekledim /etc/profile:

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

Bundan sonra ben yürütmek source /etc/profile.

Şimdi benim problem: Ben çalıştırdığınızda mvn --versionkomut başarılı ve mvnben yürütmek eğer iken çalıştırılabilir, bulunur: sudo mvn --versionBen çıktı alın: sudo: mvn: command not found. PATHBir komut çalıştırdığımda bunun farklı olabileceğini biliyorum sudove bu yüzden bunu denedim:

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

Çalıştığım bir diğer şey de çalıştırmak sudo su -ve sonra yazmak mvn --version. Bu durumda mvnbaşarıyla bulunur ve komut başarılı olur. Burada neler oluyor?


Yanıtlar:


37

$PATH kabuğunuz tarafından değerlendirilir, bu nedenle çekiniz beklediğiniz gibi çalışmaz.

/etc/sudoersPATHvarsayılan bir taneyle değiştirilecek şekilde yapılandırılmıştır .

sudokomutu çalıştırmadan önce bir giriş kabuğu ortamı yüklemez, bu nedenle varsayılan PATHolan /etc/sudoerskullanılır. su -yükleme gerektiren bir giriş kabuğu açar /etc/profile. Bkz . man bashBölüm INVOCATION .

Sadece PATHsıfırlamayı kaldır /etc/sudoers. Muhtemelen denilen bir kural var secure_path.


CentOS

CentOS'ta PATHşu Defaults env_keepbölüme ekleyebilirsiniz :

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"

Cevap için teşekkür ederim. Sorunu çözüyor, ancak PATH'imdeki tüm komutlar için değil, sadece maven için bir değişiklik yaptığı için diğer iki cevaptaki çözüm önerisini tercih ediyorum.
izomorphius

Bilginize: Lütfen cevap güncellememe dikkat edin.
kriegaex

sudo nasıl çalıştırılır dizinde çalışır sudo: ./<some_binary>: command not found? Arch Linux kullanıyorum.
Necktwi

47

sudoŞu anki durumunuzu PATHşununla verin :

sudo env "PATH=$PATH" your_command

Herhangi bir ayarın değiştirilmesini gerektirmeyen harika bir cevap, arayanın gerekli olan her şeyi yapmasını sağlayın. Bu -Eseçeneği, çevrenin geri kalanını korumak için de kullanırdım. Aslında, bu çok kullanışlıdır, kolay kullanım için bir betik / takma / işlev içine konulabilir. Bunu ayrı bir cevap olarak ekleyeceğim - ama kudos @opyate!
Tom

Bu komutu çalıştırmayı denediğimde anlıyorum env: cmd: No such file or directory- Bunun neden olacağı hakkında bir fikriniz var mı?
Andy,

2
@Andy, gerçek komutunuzla cmd'yi değiştirin.
opyate,

sudo nasıl çalıştırılır dizinde çalışır sudo: ./<some_binary>: command not found? Arch Linux kullanıyorum.
Necktwi

12

@ Opyate'nin cevabını ayrıntılandırarak, aşağıdaki kabuk komut dosyasını kullanıyorum ( mysudoörneğin adlandırılmış olabilir ):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -Esudoçevreyi korumayı söyler .
  • env "PATH=$PATH"sudoçağrı dışına genişletilerek dış ortamın da PATHiçinde kullanılabilir olması sağlanıyor sudo(bu, tüm ortamın aldığı tedaviye ek -Eolarak PATHgenellikle özel tedavi aldığı için de gereklidir ).
  • "$@"betiğimizin aldığı argümanları sudoçizgiye iletir.

Komut dosyasını bir dizindeki bir dosyaya kaydedin, izin PATHverin +x, et voilà.


Bu, mevcut dosyaları düzenlemek istemeyenler için çok daha iyi bir çözümdür.
qaisjp

4

Mevcut cevaplar biraz belirsiz olduğundan, /etc/sudoersyolunuzu değiştirmedeki özel ayar şudur secure_path:

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

İhtiyacınız sudo visudoolan dizinleri ekleyebilir veya daha iyisi ile değiştirebilirsiniz :

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

2

Maven'i ilk kurduğumda da aynı problem vardı . İki satırı ekledikten sonra sorun çözüldü.

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

dört dosyaya:

/root/.bashrc
/root/.profile

ve mevcut kullanıcı için ( mehranbenim Ubuntu kullanıcı adım):

/home/mehran/.bashrc
/home/mehran/.profile

1

Kökün PATH değişkenini kendiniz için yaptığınız gibi değiştirmelisiniz, yani /root/.bashrc konumunda bulunan sudo'nun profiline bu iki satırı ekleyerek kaynak yapın.


1
/Root/.bashrc dosyasını düzenledim ancak kaynak gösteremiyorum: sudo source /root/.bashrcgets: sudo: source: command not foundve izinsiz olmadan sudo(beklendiği gibi) reddediyorum. Yeni bir terminale başlamanın teoride kaynak ile aynı şeyi yapması gerektiğine inanıyorum, ancak yeni bir terminale başladıktan sonra sudo mvn --versionhala bir şey bulamıyor.
izomorphius

@ izomorphius Kaynak sudo yapamazsınız. Önce sudo su komutuyla sudo'ya geçmelisiniz , sonra söz konusu dosyayı kaynaklayabilirsiniz. Bunu yapmanın başka yolu yok.
MariusMatutiae
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.