我们知道java中执行控制台命令,都是通过 Runtime.exec系列方法。
如果要执行root权限的命令需要用到sudo,需要输入sudo密码,这个也好解决,使用echo可以向sudo输入密码,同时sudo要加-S参数指定从标准输入读取密码,示例如下:
echo ‘sudopassword’ | sudo -S cat /etc/profile
但是在java中通过 Runtime.exec方法执行上面的命令,还是会无效。错误提示可能是。
sudo:抱歉,您必须拥有一个终端来执行 sudo
sudo: sorry, you must have a tty to run sudo
sudo:没有终端存在,且未指定 askpass 程序
sudo: no tty present and no askpass program specified
解决这个问题需要修改/etc/sudoers
# 给 sudoers 增加写权限
sudo chmod +w /etc/sudoers
# 编辑 sudoers
vi /etc/sudoers
找到 Defaults requiretty改为Defaults !requiretty或者直接注释掉#Defaults requiretty
找到Defaults !visiblepw改为Defaults visiblepw或者增一行 Defaults visiblepw
如下图。
修改后 wq保存,记得要sudo chmod -w /etc/sudoers删除写权限
为了简化sudo命令的执行,我封装一了个CmdExceuor类,允许执行多条命令。
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.logging.Logger;
/** * linux命令行执行器 *@a