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的有影响,但不大,一般很少有此类需求).