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.