sudo: source: command bulunamadı


54

Bash için varsayılan profilin bir kısmını güncelliyordum ve aşağıdakileri kullanarak yeni profili yeni ortam ayarlarıyla yeniden yükleyebileceğimi öğreticilerden gördüm:

source /etc/bash.bashrc

Tek şey - yeni ortam değişkenleri sadece mevcut kullanıcı için mevcuttu - ve sudo kullandığımda göz ardı edildi. Terminal oturumumu kapattığımda ve tekrar katıldığımda sudo kullanmaya başladılar.

Kullanmaya çalıştığımda:

sudo source /etc/bash.bashrc

Hatayı alıyorum:

sudo: source: command not found

Terminali kapatıp yeniden başlatmanıza gerek kalmadan sudo için yeni bash profili ayarlarında yükleme yapmanın basit bir yolu var mı?

- Başlangıçta, değişkenlere başvuran bazı yükleyici komut dosyaları kullanıyordum. Komut dosyalarını doğrudan çağırdığımda değişkenlere erişebildiklerinde (bu, kök olmam gerektiğinden dizinler oluşturmada daha sonra bir soruna yol açacak olsa da), sudo kullanarak yükleme komut dosyalarını çağırmanın başarısız olacağını gördüm.

Bunu basit komutlarla test ederek kanıtladım:

echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE

Birincisi değişkenin değerini verir, ikincisi bir şey çıkarmazdı.


Sudo değişkenlerini nasıl kullanmaya çalıştınız? Lütfen "sudo command $ değişkenini" kullanırsanız, değişkeni sudo ortamından değil kabuğunuzdan değiştirecektir.
João Pinto

Yanıtlar:


72

Sorun şu ki sourcebir bash yerleşik komutu (program benzeri lsveya değil grep). Bence bir yaklaşım root olarak giriş yapmak ve sonra source komutunu çalıştırmak.

sudo -s
source /etc/bash.bashrc

3
Sorun şu ki sourcebu bir kabuğun yerleşik olmasıdır. sudo suBunu söylemenin bir tür garip yolu - sadece sudo -s"bu kullanıcı olarak bir kabuk başlat" demenin kendi yolunun hangisi olduğunu söylemek daha iyi . Bir satırlık sürümünüz çalışmaz, çünkü içindeki komutların her biri ana kullanıcının kabuğu tarafından ayrı bir alt işlemde çalıştırılır.
poolie

1
Sağ. Artı BASH, giriş anında / etc / bashrc dosyasını okur. Bu nedenle, 'su' ile -, -l veya --login anahtarını kullanarak bu kullanıcının ortamını elde edebilirsiniz: 'sudo su -' kök olmak ya da 'su - $ username' olmak için başka bir kullanıcı.

"Bir satır" örneği işe yaramaz çünkü suyeni bir kabuk başlatır ve "kaynak" yalnızca sona erdikten sonra çalıştırılır. İkinci satır kullanılırsa ilk örnek yalnızca çalışır içindeki kök kabuğu.
loevborg

sudo -sdaha iyi değil sudo su. Her iki şekilde de bir etkisi olmaz.
loevborg

1
sudo -sbir kabuk başlatma etkisine benzer, ancak bana göre biri ne zaman iki tane "başka bir kullanıcı ol" komutunu istifleyemiyor.
poolie

14

Sorun bu sourcebir kabuk yerleşik komutu değil. Gerçek şu ki, sizi gerçekten command not foundhataya sokan şey bu , ama eğer işe yarayacağı anlamına gelmiyor.

Asıl sorun çevre değişkenlerinin nasıl çalıştığıdır. Ve böyle çalışırlar: her yeni bir süreç başlatıldığında, hiçbir şey olmazsa, ebeveyninin çevresini miras alır. Bu nedenle, bir alt kabuk kullanmak (örneğin bashbir bash örneğinin içine yazmak ) ve çıktısına bakmak env, ebeveynine benzer sonuçlar vermelidir.

Bununla birlikte, nasıl sudoçalıştığından (kendi sayfasında belirtildiği gibi), sudo kullanıcının ortamını soymaya ve ek kullanıcı için "varsayılan" bir ortam oluşturmaya çalışır, böylece komut çalıştırması onu çalıştıran kullanıcı gibi çalıştırılır . olarak ve dolayısıyla nautilus arama kullanıcı (beklenen davranıştır) yürütüyor sudo nautilusbir klasör açılmalıdır /rootklasörüne değil /home/yourusername.

Yani:

Gibi bir şey yapmak sudo source script.shve daha sonra sudo command, çalışsa bile, daha sonra herhangi bir değişkeni ayarlamakta başarılı olmaz sudo command.

Ortam değişkenlerini geçmek için sudo'ya çevreyi korumasını ( -Eanahtar ile; ve sudoers dosyanızda uygun izinlere sahip olmanız ) ve / veya komut için ayarlamayı söyleyebilirsiniz sudo VAR1=VALUE1 VAR2=VALUE2 command.


4

Bash işlem ikamesi kullanarak şunları yapabilirsiniz:

source <(sudo cat /etc/bash.bashrc)

1
Bu OP'nin ne yapması gerektiğini yeni ayarlarla bir kök kabuğu başlatmaya nasıl yardımcı olur?
muru

1
OP, profile sudoerişmek için kullanılması gereken bir kabuktan nasıl "... yeni profili yeniden yükleyeceğini ..." soruyordu . Yukarıdakiler, sudo: source: command not foundbelirtilen sorundan kaçınırken profili içe aktarmanın bir yolunu sağlar .
TomDotTom

"Tek şey - yeni ortam değişkenleri sadece mevcut kullanıcı için mevcuttu - ve sudo kullandığımda göz ardı edildi."
muru

3

As Marcos diyor , senin asıl sorun burada olmasıdır sourceçalıştırıldığı oluyor ki sadece kabuk sürecini etkileyen bir kabuk yerleşik komuttur.

Kolay çözüm kök olarak yeni bir kabuk başlatmaktır ve bash /etc/bash.bashrcbaşladığında otomatik olarak okuyacaktır . Bu sadece söylemek kadar basit

sudo bash

2

Terminalin kapatılması ve yeniden açılması bir şeyleri değiştirmemelidir. Varsayılan olarak, sudo ortamı sıyırır. Bunu devre dışı bırakmak için sudo -E ekleyin.


2

Hata, komut satırından çağırmaya çalıştığınız ikili, geçerli kullanıcının PATH değişkeninin yalnızca bir parçası olması, ancak kök kullanıcının PATH'sinin bir parçası olmaması nedeniyle oluşur.

Erişmeye çalıştığınız çiftin yolunu bularak bunu doğrulayabilirsiniz. Benim durumumda "bettercap-ng" demeye çalışıyordum. Bu yüzden koştum

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

Bu konumun kök kullanıcının PATH'sinin bir parçası olup olmadığını kontrol ettim.

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

Yani sudo komut satırından aramaya çalıştığım ikili dosyayı bulamıyor. Dolayısıyla, bulunmayan hata komutunu döndürür.

Aşağıdaki gibi bir ikili çağırırken geçerli kullanıcının PATH'ini kullanmak için sudo'yu yönlendirebilirsiniz.

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

Aslında, bunun bir takma adı olabilir:

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

Orijinal takma adı yerine takma adı sudo olarak da adlandırmak mümkündür.

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.