sudo提示找不到命令原因


sudo提示找不到命令原因
20120911 Chenxin

問題描述:
1.默認在PATH變量中加入了java的路徑,直接執行java -version沒有問題;
但通過sudo java -version時候,提示找不到java路徑;
或是:
sudo /usr/local/tomcat/bin/startup.sh
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program

2.有時候是因為java版本問題導致的(系統默認安裝了java),則which java,一般顯示的是/bin/java(PATH變量定義的搜索路徑/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.6.0_31/bin).
sudo的secure_path=/sbin:/bin:/usr/sbin:/usr/bin(先搜索/bin/,再搜索/usr/bin/)
而tomcat程序執行時,默認是先搜索/usr/bin/java,然后才是/bin/java,比較奇怪.如果/usr/bin/java的版本是1.5的話,啟動tomcat就會報錯,見catalina.out.
tomcat的bin/目錄下有個setclasspath.sh文件,內有:
# XXX: Should we try other locations?
if [ -x /usr/bin/java ]; then
JRE_HOME=/usr
fi
如果/usr/bin/下有java,就會自動執行這個路徑下的java.
可執行文件的搜索順序(自左向右搜索PATH變量值):

which java

/bin/java

mv /bin/java /usr/bin/java

which java

/usr/bin/java

echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.6.0_31/bin

針對"1"的解決辦法
解決方法:
1.通過建立/bin/java - /usr/local/jdk/bin/java軟連接的方式,sudo則沒有問題;
2.或者是直接修改sudoers文件,即
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
在secure_path路徑中,再添加/usr/local/jdk
/bin

備注:
之前龍之力量的方式都是采用的“1”,沒有修改sudoers文件;

cron中含有sudo的時候,執行失敗
20140610 Chenxin
當加入crontab中的命令或者腳本里含有sudo的權限時,默認會出現執行失敗的情況.原因是:

sudo: sorry, you must have a tty to run sudo

1.$ cat /usr/local/bin/tq_tt.sh

!/bin/bash

sudo /root/admin/tt.sh

cat /root/admin/tt.sh

!/bin/bash

pwd
echo date >> /root/admin/time.log

2.加入tqadmin賬號對/root/admin/tt.sh的sudo權限
crontab -l
*/1 * * * * /usr/local/bin/tq_tt.sh > /home/tqadmin/tt.log 2>&1 (這樣就可以看到執行的報錯情況了)

3.報錯后,將sudoers文件的Defaults requiretty注釋掉就可以了,否則cron執行sudo總會報錯.

cat /etc/sudoers |grep "req"

Defaults requiretty

原因分析:
cron在執行命令的時候,沒有tty.
sudo默認配置的執行命令的時候需要一個tty,卻在cron里執行的時候獲取不到tty,不知道將結果往哪里送.

解決辦法:
注釋掉sudoers里的requiretty項目(這樣會對需要tty的有影響,但不大,一般很少有此類需求).


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM