Perché non posso eseguire alcuni comandi? (ad esempio, vim)

Ho accesso sudo sul mio server di amici, eseguendo centos-6.3, ma quando cerco di eseguire alcuni comandi come sudo vim /var/www/html/index.html Ho un errore sudo: vim: command not found posso, comunque , eseguire sudo su e poi vim /var/www/html/index.html e funziona come previsto.

echo $PATH e sudo echo $PATH entrambi i rendimenti:

 /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/jared/bin 

sudo which vim tuttavia produce:

 which: no vim in (/sbin:/bin:/usr/sbin:/usr/bin) 

Ho provato ad aggiungere

 export PATH=$PATH:/usr/local/bin 

al /root/.bashrc che ha risolto il problema quando si utilizza sudo su ma non solo sudo <command> .

Come faccio a funzionare sudo <command> ?

Quando si esegue sudo , molti sisthemes sono configurati per eliminare l'ambiente di tutti i valori non bianchi e per ripristinare la variabile PATH ad un valore sanzionato.

Trovenetworking il primo come Defaults env_reset e diversi Defaults env_keep += "SOME_VARIABLE_NAME" in /etc/sudoers . Quest'ultimo "protetto" PATH override è specificato come Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin – elimina questa row per rimuovere questo comportmento quando sudo ing.


Come viene gestita la variabile di ambiente che viene eseguita quando si esegue sudo -V come root .


Se non si desidera eliminare questi valori predefiniti, è sempre ansible specificare i programmi utilizzando il loro path completo ( sudo /usr/local/bin/vim ).

In alternativa, è ansible consentire il tuo account a SETENV nel file sudoers , ad esempio:

 %wheel ALL=(ALL) SETENV: ALL 

Ciò consente di ignorare le impostazioni di default di questo tipo: sudo PATH=$PATH which vim , poiché la variabile viene interpretata dalla shell prima che il command venga eseguito, con conseguente PATH ereditato (che probabilmente non includerà /sbin etc.).

 sudo echo $PATH 

non fa quello che pensi. $PATH viene sostituito dalla shell (tua) prima di eseguire il command.

Per eseguire il comportmento desiderato, è ansible utilizzare sudo -i .

Dall'uomo sudo :

-command io]

L'opzione -i ( simulare login iniziale ) esegue la shell specificata nella voce passwd (5) dell'utente target come shell di login. Ciò significa che i file di risorse specifici di accesso come .profile o .login verranno letti dalla shell. Se viene specificato un command, viene passato alla shell per l'esecuzione.

Come faccio a funzionare sudo <command> ?

Finché non risolvi il problema con i routes, utilizzare un path completo

  sudo /usr/local/bin/vim /var/www/html/index.html